外观模式/门面模式

外观模式/门面模式

一、定义

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

点击查看源码


二、角色分类

外观角色(Facade)

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

子系统角色(SubSystem)

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

客户角色(Client)

调用方法的角色


三、实现方式

UML图

未命名文件 (4)

具体实现

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

外观角色(Facade)

1
2
3
4
5
6
7
8
9
10
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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)

1
2
3
4
5
6
public class Client {
public static void main(String[] args) {
SwitchBoard switchBoard = new SwitchBoard();
switchBoard.start();
}
}

运行结果

1
2
3
打开电路A
打开电路B
打开电路C

四、应用场景

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

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

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

何时使用:

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

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

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

应用实例:

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

适用场景:

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

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


五、优缺点

优点

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

缺点

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