【设计模式】第九章:外观模式(门面模式)详解及应用案例

系列文章

【设计模式】七大设计原则
【设计模式】第一章:单例模式
【设计模式】第二章:工厂模式
【设计模式】第三章:建造者模式
【设计模式】第四章:原型模式
【设计模式】第五章:适配器模式
【设计模式】第六章:装饰器模式
【设计模式】第七章:代理模式
【设计模式】第八章:桥接模式
【设计模式】第九章:外观模式 / 门面模式
【设计模式】第十章:组合模式
【设计模式】第十一章:享元模式
【设计模式】第十二章:观察者模式
【设计模式】第十三章:模板方法模式
【设计模式】第十四章:策略模式
【设计模式】第十五章:责任链模式
【设计模式】第十六章:迭代器模式
【设计模式】第十七章:状态模式
【设计模式】第十八章:备忘录模式
【设计模式】第十九章:访问者模式
【设计模式】第二十章:解释器模式
【设计模式】第二十一章:命令模式
【设计模式】第二十二章:中介者模式


文章目录

  • 系列文章
  • 一、定义
  • 二、角色分类
  • 三、实现方式
    • UML图
    • 具体实现
  • 四、应用场景
  • 五、优缺点
    • 优点
    • 缺点
  • 推荐


一、定义

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


二、角色分类

外观角色(Facade)

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

子系统角色(SubSystem)

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

客户角色(Client)

调用方法的角色


三、实现方式

UML图

【设计模式】第九章:外观模式(门面模式)详解及应用案例_第1张图片

具体实现

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

外观角色(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 Blog | Bummon’s Home | 公众号

你可能感兴趣的:(设计模式,设计模式,外观模式)