门面模式:门面模式(亦称外观模式Facade Pattern),外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
?
故事一:
我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。(相机制造者把一系列调光圈、对焦距、快门等封装成了一个自动挡按钮,只要一按钮这一系列动作一气呵成,这个按钮就是对外提供给用户的门面,用户不再需要一系列繁重操作)
?
故事二:
人是吃五谷杂粮的,饮食不协调,气候不适应,酸性体质的人就容易生病,生病了就要去医院,看病就医,走下面这个流程:病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验。化验后再回到门诊室。也许第一次去看病的人,不知道流程直接进冲到医生值班室,找医生看病,可是系统中没有你的号码信息,医生在电脑上面开不了你的单子,后续就无法进行。如果有这么一个流程该多好呀:由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员与各个部门打交道。
?
故事三:
投递信件的过程是:首先写信的内容 -> 其次写信封 -> 把信放到信封里 -> 然后邮递
手机时代的来临解决了邮局的发信业务,现在有事情,发短信:只要告诉三大运营商系统,发给谁,发送什么内容,然后就不用自己写信封,封信,投递到邮筒里面的繁琐操作。
?
故事四:
安保系统由录像机、感应器、报警器三部分组成;宝安GG重启系统的时候必须按照录像机、感应器、报警器一个个接通电源,按按钮;假设监控软件自带一个一键重启功能,只要一按钮,就自动按顺序重启了。对外暴漏的操作过程就没有那么繁多,不容易出错。
?
这些故事都有一个共同点就是交互过程操作步骤繁多,容易出错:
故事一:照相时候MM可能没有对焦、调光圈就按了快门,结果找出来一张什么样的照片,你懂的;
故事二:病人没有挂号,直接冲到医生值班室就医,出现的窘况你是知道的。
?
?
门面模式说白了就是封装了一个类,简化了用户的操作步骤;而此类的作用是按顺序执行方法。调用者无需知道具体流程,只需要将要传递的参数传给该类,这样该类就按顺序执行就好了,符合高扩展性以及高内聚低耦合的原则。比如某天照相机自动挡按钮多了一个新功能,你是不知道的,你仅仅知道那是一个按钮而已;病人挂号医生医院需要检查病人是否有社保可以报销等等,对于病人来说,我来看病挂号、取药、缴费都不用我来完成,直接找接待员就行;发送信息需要检查信息内容是否健康等等;都不需要用户知道;FaceFade已经帮用户封装好了,只需要扩展就行。
?
例子(非自己原创):
?
/**
* 门面模式/外观模式:Facade Pattern
* 保安系统:
* 一个保安系统由两个录像机、一个感应器和一个报警器组成。
* 由保安操作仪器的启动和关闭:没有使用门面模式时,保安必须亲自启动每个仪器。
* @version 2009-6-15
* @author Winty(wintys@gmail.com)
*/
public class FacadeTest{
public static void main(String[] args){
//无门面模式
Camera camera1,camera2;
camera1 = new Camera();
camera2 = new Camera();
Sensor sensor;
sensor = new Sensor();
Alarm alarm;
alarm = new Alarm();
//启动仪器
camera1.turnOn();
camera2.turnOn();
sensor.activate();
alarm.activate();
System.out.println("");
/////////////////////////////////
//使用门面模式
SecurityFacade security = new SecurityFacade();
security.start();
}
}
/**
* 门面:Facade
*/
class SecurityFacade{
private Camera camera1;
private Camera camera2;
private Sensor sensor;
private Alarm alarm;
public SecurityFacade(){
camera1 = new Camera();
camera2 = new Camera();
sensor = new Sensor();
alarm = new Alarm();
}
//启动
public void start(){
camera1.turnOn();
camera2.turnOn();
sensor.activate();
alarm.activate();
}
//停止
public void stop(){
camera1.turnOff();
camera2.turnOff();
sensor.deactivate();
alarm.deactivate();
}
}
class Camera{
public void turnOn(){
System.out.println("turn on the Camera.");
}
public void turnOff(){
System.out.println("turn off the Camera.");
}
//转动
public void rotate(){
System.out.println("rotate the Camera.");
}
}
class Sensor{
public void activate(){
System.out.println("activate the sensor.");
}
public void deactivate(){
System.out.println("deactivate the sensor.");
}
//触发感应器
public void trigger(){
System.out.println("trigger the sensor.");
}
}
class Alarm{
public void activate(){
System.out.println("activate the alarm.");
}
public void deactivate(){
System.out.println("deactivate the alarm.");
}
//拉响报警器
public void ring(){
System.out.println("ring the alarm.");
}
}
?
?
原文:http://gaojingsong.iteye.com/blog/2267957