【跟着Bummon重学设计模式】外观模式

102 阅读3分钟

外观模式/门面模式

一、定义

摘自百度百科: 是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。


二、角色分类

外观角色(Facade)

也被称为门面角色,是系统对外的统一接口

子系统角色(SubSystem)

子系统可以为多个,其并不知道外观角色的存在

客户角色(Client)

调用方法的角色


三、实现方式

UML图

未命名文件 (4)

具体实现

我们在现实中就有相应的例子,假如我们有一个开关板,然后当我们点它的时候就会执行一系列的操作,接下来我们使用代码实现一下

外观角色(Facade)

public class SwitchBoard {
  private final CircuitA circuitA = new CircuitA();
  private final CircuitB circuitB = new CircuitB();
  private final CircuitC circuitC = new CircuitC();
  public void start() {
    circuitA.start();
    circuitB.start();
    circuitC.start();
  }
}

CircuitA

子系统角色(SubSystem)

public class CircuitA {
  public void start() {
    System.out.println("点开电路A");
  }
}

public class CircuitB {
  public void start() {
    System.out.println("打开电路B");
  }
}

public class CircuitC {
  public void start() {
    System.out.println("打开电路C");
  }
}

客户角色(Client)

public class Client {
  public static void main(String[] args) {
    SwitchBoard switchBoard = new SwitchBoard();
    switchBoard.start();
  }
}

运行结果

打开电路A
打开电路B
打开电路C

四、应用场景

以下部分内容摘自菜鸟教程

意图: 为子系统的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用

主要解决: 降低访问复杂系统的内部子系统的复杂度,简化客户端之间的接口

何时使用:

  1. 客户端不需要知道系统内部的复杂联系,整个系统只需要提供一个“接待员”即可
  2. 定义系统的入口

如何解决: 客户端不与系统耦合,外观类与系统耦合

关键代码: 在客户端与复杂系统之间再加一层,这一层将调用顺序、依赖关系处理好

应用实例:

  1. 去医院看病,可能要挂号、门诊、划价、取药等,让患者或其家属觉得很复杂,如果有提供接待人员,只让接待人员处理就会很方便
  2. Java的三层开发模式

适用场景:

  1. 为复杂的模块或子系统提供外界访问的模块
  2. 子系统相对独立
  3. 预防低水平人员带来的风险

注意事项: 在层次化结构中,可以使用外观模式定义系统中每层的入口


五、优缺点

优点

  1. 减少系统相互依赖
  2. 提高灵活性
  3. 提高安全性

缺点

不符合开闭原则,如果要改东西很麻烦,继承和重写都不合适


推荐

关注博客和公众号获取最新文章

Bummon's BlogBummon's Home公众号

promotion-green.png