外观模式遵守的面向对象的原则之一:迪米特法则。
外观模式也叫门面模式。
一个软件实体应当尽可能少的与其他实体直接发生相互作用(耦合)。
为子系统提供统一的入口。封装子系统的复杂性,便于客户端调用。在一个由多个模块组成的系统中,模块与模块之间就可以通过提供外观模式来进行数据的交互,每个模块只需要暴漏出其他模块感兴趣的数据,这样就达到了各个模块之间数据的隔离。(这就很满足封装的特性:只暴露该暴漏的,其他的就隐藏起来)
在我们生活中其实也处处体现了这种思想。比如:手机运行需要主板、电池、声卡等,但我们在玩手机时只需要对屏幕操作就行了。这就是手机厂商为我们提供的统一的入口,把具体执行流程的复杂性封装了起来。我们只需要和这个统一入口打交道。
子系统角色
public class SystemA {
public void operatorA() {
System.out.println("operatorA finish");
}
}
public class SystemB {
public void operatorB() {
System.out.println("operatorB finish");
}
}
public class SystemC {
public void operatorC() {
System.out.println("operatorC finish");
}
}
外观角色
public class OperatorFacade {
public void wrapOperator(){
SystemA a = new SystemA();
a.operatorA();
SystemB b = new SystemB();
b.operatorB();
SystemC c = new SystemC();
c.operatorC();
}
}
测试类
假设我们在开发一个产品,开发某个功能需要用到 SystemA、SystemB、SystemC 三个子系统的操作才可以完成。
public class Client {
public static void main(String[] args) {
// 没有使用外观模式完成这个功能
SystemA a = new SystemA();
a.operatorA();
SystemB b = new SystemB();
b.operatorB();
SystemC c = new SystemC();
c.operatorC();
// 使用外观模式完成这个功能
new OperatorFacade().operator();
}
}
很明显在没有使用外观模式时,我们完成一个功能需要和多个子系统直接耦合在一起,而且调用关系复杂。
解耦客户端和子系统之间的关系,更好的封装。方便模块与模块之间的数据交互。
参考链接:https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/facade.html