【设计模式自习室】门面模式 Facade Pattern
前言
《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有:
- 该模式的介绍,包括:
- 引子、意图(大白话解释)
- 类图、时序图(理论规范)
- 该模式的代码示例:熟悉该模式的代码长什么样子
- 该模式的优缺点:模式不是万金油,不可以滥用模式
- 该模式的应用案例:了解它在哪些重要的源码中被使用
该系列会逐步更新于我的博客和公众号(博客见文章底部),也希望各位观众老爷能够关注我的个人公众号:后端技术漫谈,不会错过精彩好看的文章。
系列文章回顾
- 【设计模式自习室】开篇:为什么我们要用设计模式?
- 【设计模式自习室】建造者模式
- 【设计模式自习室】原型模式
- 【设计模式自习室】透彻理解单例模式
- 【设计模式自习室】理解工厂模式的三种形式
- 【设计模式自习室】适配器模式
- 【设计模式自习室】装饰模式
- 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化
结构型——外观模式、门面模式 Facade Pattern
引子
门面模式便是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。
比如用户是用电脑,电脑有操作:开机关机重启等。每个操作里都有复杂的逻辑,比如开始需要先启动BIOS-引导硬盘—进入系统-初始化桌面等。对于使用者来说,只需要调用开机的方法。
定义
门面模式( Facade Pattern) 也叫做外观模式, 是一种比较常用的封装模式,
Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.( 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。 门面模式提供一个高层次的接口, 使得子系统更易于使用。 )
类图
如果看不懂UML类图,可以先粗略浏览下该图,想深入了解的话,可以继续谷歌,深入学习:
门面模式类图:
- 客户角色(Client): 客户通过调用Facede来完成要实现的功能。
- 门面角色(Facade):它被客户角色调用,并且知道自己管理着的子系统。内部根据客户角色的需求预定了几种功能的组合。
- 子系统角色(SystemA/B/C):实现了子系统的功能。它对客户角色是完全透明的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
时序图
时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。时序图中显示的是参与交互的对象及其对象之间消息交互的顺序。
我们可以大致浏览下时序图,如果感兴趣的小伙伴可以去深究一下:
代码实现
门面Facade:
public class Computer
{public static final Logger LOGGER = Logger.getLogger(Computer.class);private CPU cpu;private Memory memory;private Disk disk;public Computer(){cpu = new CPU();memory = new Memory();disk = new Disk();}public void start(){LOGGER.info("Computer start begin");cpu.start();disk.start();memory.start();LOGGER.info("Computer start end");}public void shutDown(){LOGGER.info("Computer shutDown begin");cpu.shutDown();disk.shutDown();memory.shutDown();LOGGER.info("Computer shutDown end...");}
}
客户端调用Client:
public class Client
{public static final Logger LOGGER = Logger.getLogger(Client.class);public static void main(String[] args) {Computer computer = new Computer();computer.start();computer.shutdown();}
对于用户来说,使用Client完全不需要关心底层细节。
使用场景举例
典型例子:SLF4J 中的外观模式
SLF4J 是简单的日志外观模式框架,抽象了各种日志框架例如 Logback、Log4j、Commons-logging 和 JDK 自带的 logging 实现接口。它使得用户可以在部署时使用自己想要的日志框架。
SLF4J 没有替代任何日志框架,它仅仅是标准日志框架的外观模式。如果在类路径下除了 SLF4J 再没有任何日志框架,那么默认状态是在控制台输出日志。
spring jdbc中的外观模式
查看 org.springframework.jdbc.support.JdbcUtils
Mybatis中的外观模式
查看 org.apache.ibatis.session.Configuration 类中以 new 开头的方法
public class Configuration {public Executor newExecutor(Transaction transaction, ExecutorType executorType) {executorType = executorType == null ? defaultExecutorType : executorType;executorType = executorType == null ? ExecutorType.SIMPLE : executorType;Executor executor;if (ExecutorType.BATCH == executorType) {executor = new BatchExecutor(this, transaction);} else if (ExecutorType.REUSE == executorType) {executor = new ReuseExecutor(this, transaction);} else {executor = new SimpleExecutor(this, transaction);}if (cacheEnabled) {executor = new CachingExecutor(executor);}executor = (Executor) interceptorChain.pluginAll(executor);return executor;}public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,ResultHandler resultHandler, BoundSql boundSql) {ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);return resultSetHandler;}// ...省略...
}
Tomcat 中的外观模式
org.apache.catalina.connector.Request 和 org.apache.catalina.connector.RequestFacade 这两个类都实现了 HttpServletRequest 接口
优缺点
优点
- 松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;
- 简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
- 更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。
缺点
- 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
参考
- 《HEAD FIRST设计模式》
- https://www.cnblogs.com/lthIU/p/5860607.html
- https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/facade.html
- https://blog.csdn.net/wwwdc1012/article/details/82729516
关注我
我是一名后端开发工程师。
主要关注后端开发,数据安全,爬虫,物联网,边缘计算等方向,欢迎交流。
各大平台都可以找到我
- 微信公众号:后端技术漫谈
- Github:@qqxx6661
- CSDN:@后端技术漫谈
- 知乎:@后端技术漫谈
- 简书:@后端技术漫谈
- 掘金:@后端技术漫谈
原创博客主要内容
- Java面试知识点复习全手册
- 设计模式/数据结构 自习室
- Leetcode/剑指offer 算法题解析
- SpringBoot/SpringCloud菜鸟入门实战系列
- 爬虫相关技术文章
- 后端开发相关技术文章
- 逸闻趣事/好书分享/个人兴趣
个人公众号:后端技术漫谈
如果文章对你有帮助,不妨收藏,投币,转发,在看起来~
【设计模式自习室】门面模式 Facade Pattern相关推荐
- .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)
如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧: 分别是瑞雯和 ...
- 设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用
文章目录 Pre 定义 案例 Demo V1.0 Boss直接管理 V2.0 引入外观类 PmManagerFacade 何时使用Facade Tomcat Mybatis Pre 我们先来回顾下门面 ...
- 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)...
一,总体概要 1,笔者浅谈 说起"门面"这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, 1 functio ...
- 外观模式 门面模式 Facade 结构型 设计模式(十三)
外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本 ...
- 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式
[网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...
- 设计模式之门面模式详解
设计模式之门面模式详解 文章目录 设计模式之门面模式详解 一.什么是门面模式 二.门面模式的应用场景 三.门面模式的角色组成 四.门面模式通用写法 五.门面模式在业务中的应用 六.门面模式优缺点 一. ...
- php facade模,PHP 设计模式之外观模式 Facade
简单描述 外观模式(Facade pattern),为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用. 外观模式又称为门面模式,它是一种对象结构型模式,遵循迪米特法则,又称最少知道原则 ...
- 使用C#实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
最新文章
- 趣谈iOS运行时的方法调用原理
- 《BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition》笔记
- 中国计算机与信息服务贸易,中国计算机与信息服务贸易国际竞争力研究
- Java内存不足之PermGen space错误探究
- python快捷键设置_Pycharm学习教程(5) Python快捷键相关设置
- CSS 文本装饰 text-decoration属性
- Gitorious基本配置流程
- php mongo 认证,MongoDB 认证机制升级
- 数据库持久层框架iBatis、myBatis、Hibernate对比
- python使用matplotlib超全画图
- 第一章 Python数据模型
- 2TB虚拟本地磁盘实验
- IGRP和EIGRP的无缝结合
- MySQL数据库_(学生_教师_课程_成绩)表_练习
- 商家如何抓住当下最火的抖音本地生活?
- Java MultipartFile实现文件上传(一)
- 补交20145226蓝墨云班课 -- Arrays和String单元测试
- Coursera吴恩达《优化深度神经网络》课程笔记(3)-- 超参数调试、Batch正则化和编程框架
- ctrl跳转失败 studio uap_uap进不去,重装studio和uap都不能行,请大神给看看
- Python实现练打字小程序