[设计模式] 浅谈外观模式
外观模式
模式功能说明:它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更容易使用。
模式思路与原理
该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。
- 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。(客户调用,同时自身调用子系统功能)
- 子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。(实现具体功能)
- 客户角色:通过调用Facede来完成要实现的功能(调用门面角色)。
案例
假设我们要创建一个复杂的Pizza对象,它包括底饼、酱料、配料等部分。
// 子系统类
class SubSystemA {
public void methodA() {
System.out.println("执行方法A");
}
}
class SubSystemB {
public void methodB() {
System.out.println("执行方法B");
}
}
class SubSystemC {
public void methodC() {
System.out.println("执行方法C");
}
}
// 外观类
class Facade {
private SubSystemA obj1 = new SubSystemA();
private SubSystemB obj2 = new SubSystemB();
private SubSystemC obj3 = new SubSystemC();
public void method() {
obj1.methodA();
obj2.methodB();
obj3.methodC();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Facade facade = new Facade();
facade.method();
}
}
我们有三个子系统类SubSystemA、SubSystemB和SubSystemC,每个子系统类都有一个方法。然后我们有一个外观类Facade,它有一个方法,这个方法内部调用了所有子系统的方法。客户端只需要和Facade类交互,而不需要直接和子系统类交互。这样做的好处是,如果子系统的内部发生了改变,客户端不需要知道,因为客户端只和Facade类交互。
总结
该模式体现了:迪米特法则(最少知识原则),也就是一个对象应当对其他对象有尽可能少的了解。
- 松散耦合: 使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
- 简单易用: 客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
- 更好的划分访问层次: 有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。