1. 定义
门面模式,也叫外观模式,是一种比较常用的封装模式:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
2. 使用场景
- 为一个复杂的模块或子系统提供一个供外界访问的接口。
- 子系统相对独立。外界对子系统的访问只要黑箱操作即可。
- 预防低水平人员带来的风险扩散。降低个人代码质量对整体项目的影响风险,规定低水平人员只能在指定的子系统中开发,然后再提供门面接口进行访问操作。
- Android中第三方SDK的设计,比如AndFix、Tinker、Gilde等就采用了外观模式。
3. 实现
子系统可以是一个或者很多个类,下面以三个类作为子系统的一个例子(三个类属于近邻,处理相关的业务,应该被认为是一个子系统的不同逻辑处理模块。并且子系统不知道门面角色的存在):
public class ClassA {
public void doSomethingA() {
System.out.println("doSomethingA");
}
}
public class ClassB {
public void doSomethingB() {
System.out.println("doSomethingB");
}
}
public class ClassC {
public void doSomethingC() {
System.out.println("doSomethingC");
}
}
门面角色,客户端可以调用这个角色的方法。此角色知晓子系统的所有功能和责任。一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就说该角色没有实际的业务逻辑,只是一个委托类。
public class Facade {
ClassA mA = new ClassA();
ClassB mB = new ClassB();
ClassC mC = new ClassC();
public void methodA() {
mA.doSomethingA();
}
public void methodB() {
mB.doSomethingB();
}
public void methodC() {
mC.doSomethingC();
}
}
4. 优点
- 减少系统的相互依赖。如果不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系。门面模式解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。
- 提高了灵活性。依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响到门面对象就行。
- 提高安全性。门面角色可以对子系统的访问进行控制。
5. 缺点
- 门面模式最大的缺点就是不符合开闭原则。出现问题的时候唯一能做的一件事就是修改门面角色的代码,而不是通过继承等手段进行扩展,这个风险相当大。