设计模式 - 外观模式(Facade)

定义

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得子系统更加容易使用。

类型

结构性模式

适用性

以下情况适用Facade模式:

  1. 当需要为一个复杂的子系统提供一个简单的接口时;
  2. 客户端与抽象类的实现部分存在很大依赖性时,引入Facade模式将子系统与客户及其他子系统进行分离,可以提高子系统的独立性和可移植性;
  3. 当需要构建一个层次结构的子系统时,可以使用Facade定义子系统中每层的入口点。如果子系统间是相互依赖的,可以让他们仅通过Facade进行通讯,从而简化他们的依赖关系。

结构

外观模式结构

参与者

外观(Facade): 知道哪些子系统负责处理请求,并将客户的请求代理给适当的子系统对象。

子系统(Subsystem): 实现子系统功能,并且处理由Facade对象指派的任务。

优缺点

优点

  1. 对客户端屏蔽子系统组件,因而减少了客户处理的对象数目,并使得子系统使用起来更加方便;
  2. 实现了子系统与客户之间的松耦合关系,使子系统的组件变化不会影响到它的客户

缺点

增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“。

外观模式实现

子系统(Subsystem)

public class SubsystemA {
    public void execute() {
        System.out.println("Execute SubsystemA");
    }
}

public class SubsystemB {
    public void execute() {
        System.out.println("Execute SubsystemB");
    }
}

public class SubsystemC {
    public void execute() {
        System.out.println("Execute SubsystemC");
    }
}

外观(Facade)

public class Facade {
    private SubsystemA systemA;
    private SubsystemB systemB;
    private SubsystemC systemC;

    public Facade() {
        systemA = new SubsystemA();
        systemB = new SubsystemB();
        systemC = new SubsystemC();
    }

    public void execute() {
        systemA.execute();
        systemB.execute();
        systemC.execute();
    }
}

客户端(Client) public class Client {

public static void main(String... args) {
    new Client().test();
}

void test() {
    Facade facade = new Facade();
    facade.execute();
} }

参考代码

https://github.com/xueyufish/design-pattern-java/tree/master/facade