【门面设计模式】的故事来源(Facade Pattern)

来源:互联网 发布:在线课程网络课程 编辑:程序博客网 时间:2024/05/21 17:44


  门面模式:门面模式(亦称外观模式Facade Pattern),外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

 

故事一:

我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。(相机制造者把一系列调光圈、对焦距、快门等封装成了一个自动挡按钮,只要一按钮这一系列动作一气呵成,这个按钮就是对外提供给用户的门面,用户不再需要一系列繁重操作)

伦理片 http://www.dotdy.com/ 

故事二:

人是吃五谷杂粮的,饮食不协调,气候不适应,酸性体质的人就容易生病,生病了就要去医院,看病就医,走下面这个流程:病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴费,才可以到化验部门做化验。化验后再回到门诊室。也许第一次去看病的人,不知道流程直接进冲到医生值班室,找医生看病,可是系统中没有你的号码信息,医生在电脑上面开不了你的单子,后续就无法进行。如果有这么一个流程该多好呀:由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员与各个部门打交道。

 

故事三:

投递信件的过程是:首先写信的内容 -> 其次写信封 -> 把信放到信封里 -> 然后邮递

手机时代的来临解决了邮局的发信业务,现在有事情,发短信:只要告诉三大运营商系统,发给谁,发送什么内容,然后就不用自己写信封,封信,投递到邮筒里面的繁琐操作。

 

故事四:

安保系统由录像机、感应器、报警器三部分组成;宝安GG重启系统的时候必须按照录像机、感应器、报警器一个个接通电源,按按钮;假设监控软件自带一个一键重启功能,只要一按钮,就自动按顺序重启了。对外暴漏的操作过程就没有那么繁多,不容易出错。

 

这些故事都有一个共同点就是交互过程操作步骤繁多,容易出错:

故事一:照相时候MM可能没有对焦、调光圈就按了快门,结果找出来一张什么样的照片,你懂的;

故事二:病人没有挂号,直接冲到医生值班室就医,出现的窘况你是知道的。

 

 

门面模式说白了就是封装了一个类,简化了用户的操作步骤;而此类的作用是按顺序执行方法。调用者无需知道具体流程,只需要将要传递的参数传给该类,这样该类就按顺序执行就好了,符合高扩展性以及高内聚低耦合的原则。比如某天照相机自动挡按钮多了一个新功能,你是不知道的,你仅仅知道那是一个按钮而已;病人挂号医生医院需要检查病人是否有社保可以报销等等,对于病人来说,我来看病挂号、取药、缴费都不用我来完成,直接找接待员就行;发送信息需要检查信息内容是否健康等等;都不需要用户知道;FaceFade已经帮用户封装好了,只需要扩展就行。

 

例子(非自己原创):

影音先锋电影 http://www.iskdy.com/ 

/** * 门面模式/外观模式: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.");    }
0 0