外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式 Facade [fəˈsɑːd]
:描述如何用单个对象表示整个子系统。为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。体现了依赖倒转原则,典型场景: MVC
架构、基金对股票的封装等。
外观模式 Facade
类图结构
结构解析
Facade
系统对外的统一接口。
SubSystem1/SubSystem2/SubSystem3
子系统及对应的功能实现。
类图可以看出,所有的类关系都仅仅是简单关联,外观模式主要体现在对外接口的统一,以及对内整个系统的封装。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| public class SubSystem1 { public void operation1(){ System.out.println("SubSystem1::operation1."); } }
public class SubSystem2 { public void operation2(){ System.out.println("SubSystem2::operation2."); } }
public class SubSystem3 { public void operation3(){ System.out.println("SubSystem3::operation3."); } }
public class Facade { private SubSystem1 subSystem1; private SubSystem2 subSystem2; private SubSystem3 subSystem3;
public Facade() { subSystem1 = new SubSystem1(); subSystem2 = new SubSystem2(); subSystem3 = new SubSystem3(); }
public void method(){ System.out.println("Facade::method."); subSystem1.operation1(); subSystem2.operation2(); subSystem3.operation3(); } }
public class TestFacade { public static void main(String[] args) { Facade facade = new Facade(); facade.method(); } }
Facade::method. SubSystem1::operation1. SubSystem2::operation2. SubSystem3::operation3.
|
总结
外观模式隐藏了子系统的复杂性,通过高层次的结构提供统一的接口。在设计初期尽量使用外观模式来分层;开发过程中子系统越来越复杂时,外观模式提供一个统一简单的接口降低耦合性;项目后期可以通过外观类封装系统遗留代码,对外操作大大简化。
- 优点
对客户隐藏子系统细节,简述客户端和子系统的耦合性;对子系统封装接口,使得系统易用。
- 缺点
子系统所有的接口都通过外观类对外暴露,导致外观类功能过多;如果不引入抽象外观类,业务变更或者增加子系统时需要修改外观类或者客户端,不符合开闭原则。
参考文档
- 大话设计模式
Android
源码设计模式解析与实战
- 外观模式