友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: jikerizhi 。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 |
13. 外观模式
13.1. 定义
根据 GoF 的著名著作 《设计模式》,外观模式的定义如下:
- 外观模式(Facade)
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
— Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
《设计模式》
《设计模式》
13.2. 类图
外观模式,也完全有可能在很多时候使用它,因为它完美地体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式之一。
其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,
增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,
为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。[R2P]
依赖倒转原则?抽象不应该依赖细节,细节应该依赖于抽象,由于我们要吃的菜都依赖于厨师这样的细节,所以我们就很被动。
代码 82. facade/Client.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.diguage.didp.facade;
/**
* Client 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:34
*/
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.methodA();
facade.methodB();
}
}
代码 83. facade/Facade.java 类
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
29
30
31
32
33
package com.diguage.didp.facade;
/**
* Facade 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:34
*/
public class Facade {
private SubSystemOne systemOne;
private SubSystemTwo systemTwo;
private SubSystemThree systemThree;
private SubSystemFour systemFour;
public Facade() {
systemOne = new SubSystemOne();
systemTwo = new SubSystemTwo();
systemThree = new SubSystemThree();
systemFour = new SubSystemFour();
}
public void methodA() {
System.out.println("方法A() ---");
systemOne.methodOne();
systemTwo.methodTwo();
}
public void methodB() {
System.out.println("方法B() ---");
systemFour.methodFour();
systemThree.methodThree();
}
}
代码 84. facade/SubSystemFour.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.diguage.didp.facade;
/**
* SubSystemFour 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:34
*/
public class SubSystemFour {
public void methodFour() {
System.out.println("子系统四的方法");
}
}
代码 85. facade/SubSystemOne.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.diguage.didp.facade;
/**
* SubSystemOne 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:34
*/
public class SubSystemOne {
public void methodOne() {
System.out.println("子系统一的方法");
}
}
代码 86. facade/SubSystemThree.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.diguage.didp.facade;
/**
* SubSystemThree 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:34
*/
public class SubSystemThree {
public void methodThree() {
System.out.println("子系统三的方法");
}
}
代码 87. facade/SubSystemTwo.java 类
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.diguage.didp.facade;
/**
* SubSystemTwo 类
*
* @author D瓜哥, https://www.diguage.com/
* @since 2017-05-19 17:53:34
*/
public class SubSystemTwo {
public void methodTwo() {
System.out.println("子系统二的方法");
}
}