003-结构型-04-外观模式(Facade)
一、概述
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
003-结构型-04-外观模式(Facade)的更多相关文章
- 【设计模式】结构型03外观模式(Facade Pattern)
[设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...
- 【设计模式】结构型04桥接模式(Bridge Pattern)
学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...
- 《精通Python设计模式》学习结构型之外观模式
这个我在工作中也有所应用的. 就是在真正的实现层上面,再封装一个函数的调用的. 这样就可以在内层函数作真正实现, 而外层调用函数对外开放, 隔离内外的变化性. from enum import Enu ...
- 【转】设计模式(九)外观模式Facade(结构型)
设计模式--外观模式Facade(结构型): 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 设计模式(九)外观模式Facade(结构型)
设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 设计模式-外观模式(Facade)
简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...
- 【结构型】Flyweight模式
享元模式的主要目的.意图是为对象的大量使用提供一种共享机制.该模式的思想重在复用.共享复用.像文字.列表中的格子等这类多数都是需要考虑复用技术,否则必将大量耗费内存空间而使资源以及性能等大量耗费.该模 ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
随机推荐
- formset的简单使用
1.modelform class StudentStudyRecordModelForm(forms.ModelForm): class Meta: model = StudentStudyReco ...
- No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>]
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- Ubuntu安装Apache 2.4.7常见问题解答
环境:Apache 2.4.7 on Ubuntu 14.04 启动apache服务报错:Unknown Authz provider: ip 进入mod模块目录 cd /etc/apache2/mo ...
- Linux本地内核提权CVE-2019-13272
简介:当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_cred函数.但是,对象struct cred的生存周期规则不允许无条件地 ...
- select下拉选中显示对应的div隐藏不相关的div
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Spark 的两种核心 Shuffle (HashShuffle 与 与 SortShuffle) 的 的工作流程
1. 参考博客:https://blog.csdn.net/qichangjian/article/details/88039576
- RocketMQ部分消息消费不到的问题
在企业项目中,利用RocketMQ接收数据,存库. 由于是第一次在项目中具体的使用RocketMQ,一直采坑. 1.发现问题:在最终的联调过程中,并发压测,订单数据丢失,同一时刻,oms推送900+的 ...
- python字符串、字符串处理函数及字符串相关操作
python字符串.字符串处理函数及字符串相关操作 字符串介绍 python字符串表示 Python除处理数字外还可以处理字符串,字符串用单撇号或双撇号包裹: >>> 'spam e ...
- javaweb学习笔记(三)
一.javaweb高级(Filter和Listener)的简单介绍 1.过滤器Filter (https://www.cnblogs.com/vanl/p/5742501.html) ①定义 Filt ...
- Linux https认证原理
HTTPS在传输的过程中会涉及到三个密钥:服务器端的公钥和私钥,用来进行非对称加密客户端生成的随机密钥,用来进行对称加密一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步.1.客户端向服务 ...