C++设计模式_14_Facade门面模式
本篇介绍的Facade门面模式属于“接口隔离”模式的一种,以下进行详细介绍。
文章目录
- 1. “接口隔离”模式
- 1. 1 典型模式
- 2. 系统间耦合的复杂度
- 3. 动机(Motivation)
- 4. 模式定义
- 5. Facade门面模式的代码实现
- 6. 结构
- 7. 要点总结
- 8. 其他参考
1. “接口隔离”模式
- 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层
间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。
采用间接层,间接是非常重要的软件思想,它几乎会充斥着软件生涯中的各种设计问题,例如C++中的指针就是对象的一个间接,从更宏大的层面来看,软件的诞生本身就是一种间接的思想。最早有计算机的时候其实是没有软件的,人和计算机的硬件直接打交道,后来有了软件,其实就是在人和硬件之间实现了一种间接层。后来发现在软件和硬件之间又有一些可以提出,这就是操作系统,操作系统中将一些内存管理,进程管理,资源管理等抽象出来,变成一个稳定的东西,实现了软件和硬件之间的间接层。
间接的提出就是稳定和变化的剥离,软件之中稳定的东西剥离出来变为操作系统,再后来发现软件和操作系统之间又有一些东西可以稳定下来,比如说中间介、虚拟机。设计模式中已经遇到很多间接思想,比如依赖倒置原则,本来是A依赖B,后来做了层间接之后,A去依赖IB的接口,B去依赖IB(此处需确认)。
1. 1 典型模式
- Facade
- Proxy
- Adapter
- Mediator
下面介绍Facade门面模式如何解决这个问题的。
2. 系统间耦合的复杂度

A方案中有一个问题,在设计系统的时候,方框内和外面的客户系统产生了很多的紧耦合关系。比如说我们常常设计系统中有数据访问系统,那数据访问牵扯到很多的层面的对象,连接对象、命令对象、数据表、参数对象等,如果不考虑任何设计的话,就很容易写成方案A,外部对象会和这些命令对象,连接对象等进行直接的耦合,但是这种耦合很不好。
好的方案B是提出一种间接层,Facade的提出就是加了一层接口,这层接口隔离所有的连接对象、命令对象等,外接客户只和Facade接口打交道。
3. 动机(Motivation)
- 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战
比如说数据库系统的访问层用的是MySQL的访问方案,过一段时间可能切换到Oracle上,同时里面的连接模型,数据加载方式都可能有一些变化,如果没有使用Facade门面模式,A方案就会带来非常激烈的震动,使用了的话,不管内部如何边,外部看到的接口都是一致的。
- 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?
4. 模式定义
为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。
----《设计模式》 GoF
5. Facade门面模式的代码实现
Facade门面模式具体在实现的过程中,其实是没有一个特定的代码结构,甚至你看到代码结构相差特别大的,都表达的是Facade门面模式,因此此处不会展示某一种代码结构叫做Facade门面模式,其体现的是一种设计原则,也就是子系统内部和外部解耦的方式。
6. 结构

上图是《设计模式》GoF中定义的Facade门面模式的设计结构。结合上面的代码看图中最重要的是看其中稳定和变化部分,也就是下图中红框和蓝框框选的部分。

7. 要点总结
-
从客户程序的角度来看,Facade模式简化了整个组件系统的接口,对于组件内部与外部客户程序来说,达到了一种
“解耦”的效果一一内部子系统的任何变化不会影响到Facade接口的变化。 -
Facade设计模式更注重从
架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。
很多模式的设计思想都不是来源于软件本身,电脑的硬件可以理解为Facade模式,其有外部接口,显示器,键盘等都是外部接口,外部接口是和客户打交道,倾向于稳定,但其内部主板等可能是不断变化的,但是面向用户的外部是不变的,这就可以看做Facade模式,这是一种设计素养。对外保持稳定,对内快速迭代。软件的思想都是可以从传统行业找到智慧。
- Facade设计模式并非一个集装箱,可以任意地放进任何多个对象。Facade模式中组件的内部应该是
“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。
8. 其他参考
C++设计模式——外观模式
相关文章:
C++设计模式_14_Facade门面模式
本篇介绍的Facade门面模式属于“接口隔离”模式的一种,以下进行详细介绍。 文章目录 1. “接口隔离”模式1. 1 典型模式 2. 系统间耦合的复杂度3. 动机(Motivation)4. 模式定义5. Facade门面模式的代码实现6. 结构7. 要点总结8. 其他参考 1. “接口隔离”模式 在组…...
正点原子嵌入式linux驱动开发——外置RTC芯片PCF8563
上一章学习了STM32MP1内置RTC外设,了解了Linux系统下RTC驱动框架。一般的应用场合使用SOC内置的RTC就可以了,而且成本也低,但是在一些对于时间精度要求比较高的场合,SOC内置的RTC就不适用了。这个时候需要根据自己的应用要求选择合…...
自动驾驶感知算法面经(20+)
原文链接: https://zhuanlan.zhihu.com/p/656952371 本人2022年4月和2023年7月两次跳槽找工作,面经总结在这里,希望可以帮到需要的朋友。 项目相关的问题主要和经历有关,参考性不大。 2023年7月 1. 文远知行 自动标注算法岗位 项目经历问…...
计算机操作系统重点概念整理-第二章 进程管理【期末复习|考研复习】
第二章 进程管理 【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第二章 进程管理 【期末复习|考研复习】前言二、进程管理2.1进…...
如何学好C++?学习C和C++的技巧是什么?
如何学好C?学习C和C的技巧是什么? 你这三个问题,前两个都是意思是差不多的,那么怎么怎么学习C/C我来问答一下:最近很多小伙伴找我,说想要一些C资料,然后我根据自己从业十年经验,熬夜搞了几个通…...
leetcode_39 组合总和
1. 题意 给定一个数组,和一个目标值;求得所有数组中所有和为目标值的元素序列。 组合总数 2. 题解 回溯列举每一个可能的序列,注意去重。 2.1 我的解法 class Solution { public:void gen(vector<vector<int>> &ans,co…...
【登录安全测试】
登录安全测试是确保系统的用户身份验证机制和登录过程的安全性的重要步骤。以下是一些常见的登录安全测试方面的考虑: 账号密码验证:验证系统是否能有效地验证用户的账号和密码,包括对密码长度、复杂性和有效性的限制。测试应包括正常和异常…...
MySQL -- 数据类型
MySQL – 数据类型 文章目录 MySQL -- 数据类型一、数据类型1.数据类型分类2.数值类型2.1.tinyint2.2.bit2.3小数类型 3.字符串类型3.1.char3.2.varchar 4.时间和日期类型5.enum和set 一、数据类型 1.数据类型分类 2.数值类型 2.1.tinyint tinyint类型的数值范围是-128 ~ 127…...
Windows11搭建kafka-python环境
文章目录 安装软件javazookeeperkafka命令行调试环境python-kafka环境参数解释名词解释定义基础架构同步发送、异步发送消息队列的两种模式消费者与消费组幂等性文件清理策略kafka消费模式offset作用kafka消费顺序如何保证参考文献安装软件 java 下载jdk,配置环境变量JAVA_H…...
一篇了解springboot3请求参数种类及接口测试
SpringBoot3数据请求: 原始数据请求: //原始方式RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParameter("name");String age request.getParam…...
CFD模拟仿真理论知识:流体仿真应用
CFD模拟仿真理论知识:流体仿真应用 本文将介绍CFD(Computational Fluid Dynamics,计算流体动力学)模拟仿真理论知识的原理、方法和应用。通过本文对CFD的深入理解,并了解如何运用这一理论解决实际问题。...
【springboot单元测试,集成测试】
本文介绍一下SpringBoot中的测试方法 集成测试 SpringBootTest 一个普通的web api RequestMapping RestController public class HelloController {AutowiredRestTemplate restTemplate;GetMapping(value "/api/hi")public Map<String,Object> hello() {S…...
【音视频】音视频开发与学习
音视屏开发与学习 时间:2023年8月12日10:09:29 文章目录 音视屏开发与学习1.资料1.资料 1.资料下载: 这是最新的课程视频教程,如有星球过期的朋友,可以在这个群公告或者私聊我拿资料,这个资料会一直发给大家的,已经在星球的就直接在星球获取资料就行:链接:https://pan.…...
软考系统架构之案例篇(架构设计相关概念)
案例篇-架构设计相关概念 1. 架构风格的概念2. 五大架构风格有哪些3. MVC架构含义4. 云计算架构5. 云原生架构设计原则6. ESB的主要功能包括7. 质量属性的含义及其设计策略8. EJB中的 Bean 分三种类型9. 风险点、敏感点、权衡点的含义10. REST 的5个原则 1. 架构风格的概念 软…...
基于大数据的时间序列股价预测分析与可视化 - lstm 计算机竞赛
文章目录 1 前言2 时间序列的由来2.1 四种模型的名称: 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 &…...
APP分发-CDN加速原理
摘要 CDN的全称是(Content Delivery Network),即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络”边缘“的节点,使用户可以就近取得所需的内容,提高用户访问网站的…...
【Java 进阶篇】Java Request 继承体系详解
在Java编程中,Request(请求)是一个常见的概念,特别是在Web开发中。Request通常用于获取来自客户端的信息,以便服务器能够根据客户端的需求提供相应的响应。在Java中,Request通常涉及到一系列类和接口&#…...
通过阿里云创建accessKeyId和accessKeySecret
我们想实现服务端向个人发送短信验证码 需要通过accessKeyId和accessKeySecret 这里可以白嫖阿里云的 这里 我们先访问阿里云官网 阿里云地址 进入后搜索并进入短信服务 如果没登录 就 登录一下先 然后在搜索框搜索短信服务 点击进入 因为我也是第一次操作 我们一起点免费开…...
decapoda-research/llama-7b-hf 的踩坑记录
使用transformers加载decapoda-research/llama-7b-hf的踩坑记录。 ValueError: Tokenizer class LLaMATokenizer does not exist or is not currently imported. 解决办法: https://github.com/huggingface/transformers/issues/22222 将tokenizer_config.json中LLa…...
计算机操作系统重点概念整理-第六章 输入输出I/O管理【期末复习|考研复习】
第六章 输入输出I/O管理【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第六章 输入输出I/O管理【期末复习|考研复习】前言六、输…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
