crazyandcoder

设计模式教程(10-外观模式)

2021.07.19

外观门面模式.png

1 定义

门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式。

2 UML 类图

门面模式主要包含2个角色。

  1. 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
  2. 子系统角色(SubSystem):可以同时有一个或多个 SubSystem。每个 SubSytem 都不是一个单独的类,而是一个类的集合。SubSystem 并不知道 Facade 的存在,对于 SubSystem 而言,Facade 只是另一个客户端而已(即 Facade 对 SubSystem 透明)。

31Q115152143509.gif

3 代码示例

3.1 外观角色(Facade)

外观角色(Facade):也叫作门面角色,是系统对外的统一接口。

public class Facade {

    private ISystem systemA = new SystemA();
    private ISystem systemB = new SystemB();

    public void doOperate() {
        systemA.doOperate();
        systemB.doOperate();
    }

}

3.2 子系统角色(SubSystem)

可以同时有一个或多个 SubSystem。每个 SubSytem 都不是一个单独的类,而是一个类的集合。SubSystem 并不知道 Facade 的存在,对于 SubSystem 而言,Facade 只是另一个客户端而已(即 Facade 对 SubSystem 透明)。


//SystemA
public class SystemA implements ISystem{
    @Override
    public void doOperate() {
        System.out.println("System A");
    }
}


//SystemB
public class SystemB implements ISystem{
    @Override
    public void doOperate() {
        System.out.println("System B");
    }
}

4 优缺点

4.1 优点

  1. 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
  2. 实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
  3. 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
  4. 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。

4.2 缺点

  1. 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
  2. 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。