外观模式(Facade Pattern)
# 外观模式(Facade Pattern)
外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式

各个子系统
public class Edu {
public void assignSchool(String name) {
System.out.println(name + "你的孩子明天去 xx大学报道");
}
}
1
2
3
4
5
2
3
4
5
public class Police {
public void register(String name) {
System.out.println(name + "已办理落户");
}
}
1
2
3
4
5
2
3
4
5
public class Social {
public void handleSocial(String name) {
System.out.println(name + "你的社保已经转移");
}
}
1
2
3
4
5
2
3
4
5
外观 / 门面
public class WeiXinFacade {
//使用单例模式, 使用饿汉式
private static Edu edu = new Edu();
private static Social social = new Social();
private static Police police = new Police();
// 我们可以统一处理
public void handleXxx(String name) {
police.register(name);
social.handleSocial(name);
edu.assignSchool(name);
}
// 也可以单独处理
public void police() {
police.register("李四");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
测试
public class MainTest {
public static void main(String[] args) {
// 这样一个个注册太麻烦,我们需要一个门面帮我归纳注册
Edu edu = new Edu();
Police police = new Police();
Social social = new Social();
edu.assignSchool("张三");
police.register("张三");
social.handleSocial("张三");
//创建门面
WeiXinFacade weiXinFacade = new WeiXinFacade();
weiXinFacade.handleXxx("李四");
weiXinFacade.police();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 应用场景
- 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。以此类比......
- JAVA 的三层开发模式。
- 分布式系统的网关
- Tomcat 源码中的 RequestFacade 干什么的?
- ......
MyBatis 中的 Configuration 去创建 MetaObject 对象使用到外观模式


# 外观模式的注意事项和细节
- 外观模式 对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
- 外观模式对客户端与子系统的耦合关系 - 解耦,让子系统内部的模块更易维护和扩展
- 通过合理的使用外观模式,可以帮我们更好的 划分访问的 层次
- 当系统需要进行分层设计时,可以考虑使用 Facade 模式
- 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个 Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性
- 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的。
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02