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 介绍 ...
随机推荐
- SpringBoot序列化时间类型的问题
在使用sringboot的时候因为在配置文件中缺少一个配置项,所以导致查询出来的时间都是long类型的时间格式 因为springboot默认使用的是Jackson 这个时间显然不是我们所需要的,参考官 ...
- python - django (logging 日志配置和简单使用)
1. settings 配置 # 配置日志 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 's ...
- python中的一切皆对象
python中一切皆对象是这个语言灵活的根本.函数和类也是对象,属于python的一等公民.包括代码包和模块也都是对象.python的面向对象更加彻底. 可以赋值给一个变量可以添加到集合对象中可以作为 ...
- [Angular] How to show global loading spinner for application between page navigation
app.component.ts: import { Component, OnInit } from "@angular/core"; import { select, Stor ...
- Oracle 重新编译存储过程/函数等
第一种 如果你使用 PL/SQL Developer工具 左侧工具栏中选择“存储过程”->选择已经失效的procedure->右键->选择重新编译 即可完成 第二 ...
- 数码管动态显示——74HC04
1.电路设计: p0实现段选,p2实现位选,74hc04是反相器,有反向和放大的双重作用. 2.程序设计: #include<reg52.h> code unsigned char sev ...
- 微信小程序--安装教程
首先 奉上腾讯官方文档 方便参考:https://mp.weixin.qq.com/debug/wxadoc/design/index.html 个人认为没说啥特别有用的信息(可能是我看的太粗糙了) ...
- Pytest权威教程24-Pytest导入机制及系统路径
目录 Pytest导入机制和sys.path/PYTHONPATH 包中的测试脚本及conftest.py文件 独立测试模块及conftest.py文件 调用通过python -m pytest调用p ...
- 如何查询数据库中所有表格,或者查询是否存在某个表格-mysql和oracle
这个问题,在之前就有写过,但是想找到语句还是记不得,这里主要提及我自己有用到的数据库mysql和oracle 1.mysql 这个是自己安装的,所有配置都是默认配置没有改变,所以保存表名的表还是inf ...
- 并发用户 VS TPS
TPS模式(吞吐量模式)是一种更好的方式衡量服务端系统的能力. 基本概念: 并发用户数:简称VU ,指的是现实系统中操作业务的用户,在性能测试工具中,一般称为虚拟用户数(Virutal User),注 ...