【门面设计模式】的故事来源(Facade Pattern)
门面模式:门面模式(亦称外观模式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."); } }