一、概述

  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

最新文章

  1. jQuery-1.9.1源码分析系列(十) 事件系统——主动触发事件和模拟冒泡处理
  2. 简单的验证码识别(opecv)
  3. 让人又爱又恨的char(字符型)
  4. ACM:a^b%p-数论-快速幂-快速乘
  5. Git 一些关于 Git、Github 的学习资源
  6. poj1679 kruskal
  7. QGridLayout--01
  8. 如何编写一个编译c#控制台应用程序的批处理程序
  9. mysql5.6 zip版安装
  10. uva 11732 - strcmp() Anyone? 不错的Trie题
  11. 老李分享:qtp自动化测试框架赏析-关键字自动化测试框架
  12. UGUI实现NGUI的UIEventListener功能
  13. 手机端实现fullPage——全屏滚动效果
  14. spring security使用自定义登录界面后,不能返回到之前的请求界面的问题
  15. #4 Python面向对象(三)
  16. git 完全讲解 无废话,包含在myeclipse中使用,包括解决冲突
  17. Nginx实现数据库端口转发
  18. python学习 day014打卡 内置函数二&递归函数
  19. Python之 ---成员修饰符
  20. avalonjs 实现简单购物车

热门文章

  1. Bias vs. Variance(4)---根据是high bias还是high variance问题来判断接下来做些什么
  2. Java中使用BufferedReader的readLine()方法和read()方法来读取文件内容
  3. 图表可视化highcharts和百度的echarts
  4. PHP高手干货分享:不能不看的50个细节!
  5. oracle 查询表重复数据 并 删除保留一条
  6. 快速开平方取倒数的算法--嵌入式ARM转载
  7. Oracle row_number() over() 分析函数--取出最新数据
  8. while循环实现十进制转二进制
  9. C++问题--error LNK2019: 无法解析的外部符号 __imp__wsprintfW
  10. 2017.10.7 国庆清北 D7T1 计数