外观模式(Facade Pattern)也叫做门面模式,是一种比较常见的封装模式。其定义如下:
Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. 即:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,是的子系统更易使用。
外观模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口,不允许任何访问子系统的行为发生,其通用类图如下图所示:
Facade.jpg
通过通用类图,我们说一下外观模式的角色:
- Facade 外观角色类。客户端可以调用这个角色的方法。该角色知晓子系统的所有功能和责任。该角色会将客户端发送过来的请求委派到相应的子系统中,该角色一般没有实际的业务逻辑,只是一个委托类。
- SubsystemClass 子系统角色。可以同时有1个或多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道Facade的存在,对于子系统而言,Facade只是一个客户端而已。
下面是外观模式的通用代码:
//子系统-ClassA
public class ClassA{
public void doSomething(){
System.out.println("ClassA doSomething A...");
}
}
//子系统-ClassB
public class ClassB{
public void doSomething(){
System.out.println("ClassB doSomething B...");
}
}
//子系统-ClassC
public class ClassC{
public void doSomething(){
System.out.println("ClassC doSomething C...");
}
}
//外观类
public class Facade{
//被委托的对象
private ClassA classA = new ClassA();
private ClassB classB = new ClassB();
private ClassC classC = new ClassC();
//提供对外访问接口1
public void doAnyThing(){
this.classC.doSomething();
this.classB.doSomething();
this.classA.doSomething();
}
//提供对外访问接口1
public void doSomeThing(){
this.classB.doSomething();
this.classC.doSomething();
}
}
//客户端
public class FacadeClient{
public static void main(String[] args) {
Facade facade = new Facade();
facade.doAnyThing();
System.out.println("--------------");
facade.doSomeThing();
}
}
通用代码的运行结果如下:
ClassC doSomething C...
ClassB doSomething B...
ClassA doSomething A...
--------------
ClassB doSomething B...
ClassC doSomething C...
外观模式的应用
外观模式的优点
- 减少系统的相互依赖。外部访问不会直接深入到子系统,而是通过Facade类,使得外部系统和子系统直接松耦合。
- 提高了灵活性。依赖少了,灵活性自然高了。
- 提高安全性。Facade决定了外部系统只能访问到哪些子系统的业务逻辑,其他的一概无法访问。
外观模式的缺点
不符合开闭原则,当外部系统有新业务需求时,需要更改Facede。
外观模式的使用场景
- 为一个复杂的模块或子系统提供一个外界访问的接口。
- 子系统相对独立——外部对子系统的访问只要黑箱操作即可。
- 限定访问范围。
《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。
网友评论