Facade(门面模式)

一、门面模式定义

      外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式。举个例子:在做项目或产品的过程中进行跨部门合作的时候,每个部门都有个相应的接口人,那么我们只需和对应部门的接口人交互即可,门面模式也一样,门面模式提供一个高层次的接口,使得子系统更易于使用。

二、 门面模式的结构

  门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。

三、特点

子系统的独立性: 子系统对外提供一个统一简单的接口,可以减少系统间的耦合性,提高子系统的独立性和可移植性。
系统的层次性:在构建一个层次化的系统时,可以使用 Facade 模式定义系统中每一层的入口。如果层与层之间是相互依赖的,则可以限定它们仅通过 Facade 进行通信,从而简化层与层之间的依赖关系

假设有一个保安系统,由2个camera,3个light,1个sensor,1个alarm组成。保安系统的客户端,即工作人员需要将这些仪器打开或者关闭。

如果不适用Facade模式,代码为:

public class  Client
{
    static private Camera camera1,camera2;
    static private Light light1,light2,light3;
    static private Sensor sensor;
    static private Alarm alarm;
    public static void main(String[] args)
    {
        camera1.turnOn();
        camera2.turnOn();
        light1.turnOn();
        light2.turnOn();
        light3.turnOn();
        sensor.activate();
        alarm.activate();
    }
}


如果使用了Facade模式,代码为:
public class  Facade
{
    private Camera camera1,camera2;
    private Light light1,light2,light3;
    private Sensor sensor;
    private Alarm alarm;
    public void active()
    {
        camera1.turnOn();
        camera2.turnOn();
        light1.turnOn();
        light2.turnOn();
        light3.turnOn();
        sensor.activate();
        alarm.activate();
    }
}

public class Client
{
    private static Facade facade;
    public static void main(String[] args)
    {
        facade.active();
    }
}
客户端代码少了很多


四、总结

    从客户程序的角度来看, Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Façade接口的变化。

    Façade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Façade很多时候更是一种架构设计模式。

    注意区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

注意门面模式不能破坏软件的单一原则.聚合一组相关的功能!

你可能感兴趣的:(设计模式,工作)