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管理【期末复习|考研复习】前言六、输…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...