1 解决的问题
将底层的复杂逻辑进行屏蔽。MVC 结构中,Controller 部分就属于外观部分,屏蔽了 Service 和 Dao 的具体内容。
有时候,调用多个方法过于复杂,因此将需要的多个方法封装在一起。例如电表箱,包含各个房屋的开关,还包含总开关,可以通过总开关将所有房屋的开关关闭。
使用外观模式来简化调用,统一操作。
2 应用场景
- 解决易用性问题;
- 解决性能问题; (客户端访问服务需调用多个接口,外观模式简化一波)
- 解决分布式事务问题;
- 作为一个简洁的中间层,联合更多系统来扩展原有系统;
3 外观模式
- Facade (门面角色) → 负责处理子系统调用逻辑,一般没有实际的具体业务,只是一个委托类;
- SubSystem (子系统) → 子系统不知道门面的存在,对于它而言,门面仅仅是另外一个客户端而已;
4 实现代码
外观类,将需要做的内容全部包装起来。客户端可以一步控制多步,简化操作。
public class Facade {
public void open() {
Browser.open();
IDE.open();
Wechat.open();
}
public void close() {
Browser.close();
IDE.close();
Wechat.close();
}
}客户端就可以简化代码,只和这个外观类打交道:
public class Client {
@Test
public void test() {
Facade facade = new Facade();
System.out.println("上班:");
facade.open();
System.out.println("下班:");
facade.close();
}
}5 优缺点
优点:简化调用,统一操作,代码独立于复杂子系统。
缺点:降低了可靠性,过多子系统同依赖一个门面系统,门面系统挂了可能导致子系统无法使用;子系统扩展升级没通知门面系统,可能会造成系统的不可用。外观可能成为与程序中所有类都耦合的上帝对象。