【设计模式】7.外观
定义
外观(facade)模式提供了一个统一的接口,用来访问子系统中的一群接口
解决的问题
- 降低了客户端与子系统之间的耦合度
- 简化了复杂子系统的使用
实现
假设有两个子系统:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Subsystem1 {
public void begin() {
System.out.println("Subsystem1 begin");
}
public void end() {
System.out.println("Subsystem1 end");
}
}
public class Subsystem2 {
public void begin() {
System.out.println("Subsystem2 begin");
}
public void end() {
System.out.println("Subsystem2 end");
}
}
不使用外观模式的客户端:
1
2
3
4
5
6
7
8
9
10
11
12
public class Client {
public static void main(String[] args) {
Subsystem1 subsystem1 = new Subsystem1();
Subsystem2 subsystem2 = new Subsystem2();
subsystem1.begin();
subsystem2.begin();
subsystem1.end();
subsystem2.end();
}
}
使用外观模式的实现方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Facade {
private Subsystem1 subsystem1;
private Subsystem2 subsystem2;
public Facade(Subsystem1 subsystem1, Subsystem2 subsystem2) {
this.subsystem1 = subsystem1;
this.subsystem2 = subsystem2;
}
public void call() {
subsystem1.begin();
subsystem2.begin();
subsystem1.end();
subsystem2.end();
}
}
public class Client {
public static void main(String[] args) {
Subsystem1 subsystem1 = new Subsystem1();
Subsystem2 subsystem2 = new Subsystem2();
Facade facade = new Facade(subsystem1, subsystem2);
facade.call();
}
}
注:
- 每个子系统表示一个类的集合
- 对于子系统来说,外观类只是另一种客户端
- 外观模式本质上就是对多个子系统做了一层封装,将多个“子任务”组合成一个“复合任务”
UML类图
优点
- 降低了客户端与子系统之间的耦合度
- 简化了复杂子系统的使用
缺点
- 增加新的子系统需要修改外观类或客户端的代码,违反了开闭原则
- 不能很好地限制客户端使用子系统,如果做太多限制则减少了灵活性
应用场景
- 要为一个复杂的子系统提供一个简单的对外接口
- 客户端与多个子系统之间存在很大的依赖性
- 在层次化结构中,可以使用外观模式定义每一层的入口
This post is licensed under CC BY 4.0 by the author.