一、概述
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
外观模式又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
1.1、适用场景
子系统越来越复杂,增加外观模式是供简单调用接口
构建多层系统结构,利用外观对象作为每层的入口,简化层间调用
1.2、优缺点
优点:
- 简化了调用过程,无需了解深入子系统,防止带来风险。
- 减少系统依赖、松散耦合
- 更好的划分访问层次
- 符合迪米特法则,即最少知道原则
缺点:
- 增加子系统、扩展子系统行为容易引入风险
- 不符合开闭原则
1.3、类图角色及其职责
简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。
- 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
- 子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
- 客户角色:通过调用Facede来完成要实现的功能。
1.4、演进过程
示例:电脑开机进入系统,我们把他分为4步,首先打开电源,bois自检,系统引导,进入系统,4个功能是四个功能模块
1、打开电源
public class StartPower { /* * 打开电源 */ public void startPower(){ System.out.println("电脑通电"); } }
2、BOIS自检
public class BoisSelfTest { /* * bios自检 */ public void boisSelfTest(){ System.out.println("bios自检"); } }
3、系统引导
public class SystemGuide { /* * 系统引导 */ public void systemGuide(){ System.out.println("系统引导"); } }
4、进入系统
public class EnterSystem { /* * 进入系统 */ public void enterSystem(){ System.out.println("进入系统"); } }
原来测试方式
@Test public void testOrigin(){ StartPower startPower = new StartPower(); startPower.startPower(); BoisSelfTest boisSelfTest = new BoisSelfTest(); boisSelfTest.boisSelfTest(); SystemGuide systemGuide = new SystemGuide(); systemGuide.systemGuide(); EnterSystem enterSystem = new EnterSystem(); enterSystem.enterSystem(); }
输出
电脑通电
bios自检
系统引导
进入系统
外观模式演变
增加外观模式控制类
public class Facade { private StartPower startPower = null; private BoisSelfTest boisSelfTest = null; private SystemGuide systemGuide = null; private EnterSystem enterSystem = null; public void startComputer(){ startPower = new StartPower(); boisSelfTest = new BoisSelfTest(); systemGuide = new SystemGuide(); enterSystem = new EnterSystem(); startPower.startPower(); boisSelfTest.boisSelfTest(); systemGuide.systemGuide(); enterSystem.enterSystem(); } }
测试
@Test public void testFacadeClient() { Facade computer = new Facade(); computer.startComputer(); }
二、扩展
2.1、JDK1.7源码中的外观模式
2.2、spring中
org.springframework.jdbc.support.JdbcUtils
2.3、mybatis中
org.apache.ibatis.session.Configuration
2.4、apache中
org.apache.catalina.connector.RequestFacade与org.apache.catalina.connector.Request
d