(二)结构型模式:6、外观模式(Facade Pattern)(C++实例)
目录
1、外观模式(Facade Pattern)含义
2、外观模式的UML图学习
3、外观模式的应用场景
4、外观模式的优缺点
5、C++实现外观模式的简单实例
1、外观模式(Facade Pattern)含义
外观模式(Facade Pattern),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
(1)外观模式隐藏了子系统的复杂性,为客户端提供了一个简单的接口,使得客户端更容易使用子系统。
(2)外观模式的核心思想是通过创建一个外观类(也称为门面类),将客户端与子系统解耦,客户端只需要通过外观类来与子系统进行交互,而不需要直接调用子系统的接口。
2、外观模式的UML图学习
在外观模式中,有以下几个关键角色:
(1)外观(Facade):外观类是外观模式的核心,它提供了一个简单的接口,用于访问子系统中的一组接口。外观类封装了对子系统的调用,隐藏了子系统的复杂性,为客户端提供了一个简单的接口。
(2)子系统(Subsystem):子系统是实现具体功能的一组类或模块。每个子系统都有自己的一组接口和实现逻辑。子系统可以是一个或多个类的集合。
(3)客户端(Client):客户端通过外观类来与子系统进行交互。客户端不需要直接调用子系统的接口,而是通过外观类提供的简单接口来完成操作。
在外观模式中,外观类充当了客户端与子系统之间的中介,它将客户端的请求转发给子系统,并将子系统的结果返回给客户端。这样,客户端只需要与外观类进行交互,而无需了解子系统的具体实现细节。
外观模式的目的是简化客户端与子系统之间的交互,降低耦合度,提高系统的可维护性和可扩展性。
3、外观模式的应用场景
(1)当需要简化复杂子系统的接口并提供一个统一的接口时。
(2)当需要将客户端与子系统解耦,以降低客户端与子系统之间的依赖性时。
(3)当需要对子系统进行封装,隐藏其复杂性,提高系统的易用性和可维护性时。
4、外观模式的优缺点
(1)优点:
1)简化接口:外观模式提供了一个简单的接口,隐藏了子系统的复杂性。客户端只需要与外观类进行交互,无需了解子系统的具体实现细节,从而简化了客户端的调用过程。
2)解耦子系统和客户端:外观模式将客户端与子系统之间的依赖关系解耦,使得它们可以独立演化。当子系统发生变化时,只需要调整外观类即可,而不会影响到客户端。
3)提高可维护性:外观模式将复杂的子系统封装在一个外观类中,使得系统结构更加清晰,易于理解和维护。对于客户端来说,只需要关注外观类的接口,而不需要关心子系统的具体实现。
4)提高代码复用性:外观模式可以将一些常用的操作封装在外观类中,供多个客户端共享使用,从而提高了代码的复用性。
(2)缺点:
1)不符合开闭原则:当需要新增或修改子系统的功能时,可能需要修改外观类的代码。这违反了开闭原则,可能会导致外观类的修改引起其他客户端的不稳定。
2)可能引入性能问题:外观模式可能会引入一层间接调用,导致系统性能下降。因此,在设计时需要权衡系统的性能和代码结构的清晰度。
3)可能增加系统复杂性:如果一个系统本身就很简单,使用外观模式可能会增加不必要的复杂性,使得代码变得冗余。
总体来说,外观模式是一种有用的设计模式,可以提供简化的接口,解耦子系统和客户端,并提高系统的可维护性和可扩展性。但在使用时需要注意遵循设计原则,权衡好代码的灵活性、性能和复杂性。
5、C++实现外观模式的简单实例
#include <iostream>// 子系统A
class SubsystemA
{
public:void operationA() {std::cout << "Subsystem A operation" << std::endl;}
};// 子系统B
class SubsystemB
{
public:void operationB() {std::cout << "Subsystem B operation" << std::endl;}
};// 外观类
class Facade
{
private:SubsystemA subsystemA;SubsystemB subsystemB;public:void operation() {subsystemA.operationA();subsystemB.operationB();}
};int main()
{// 创建外观对象Facade facade;// 调用外观对象的操作方法facade.operation();return 0;
}
在上述示例中,我们定义了两个子系统类 SubsystemA 和 SubsystemB,分别具有自己的操作方法 operationA 和 operationB。
然后,我们创建了一个外观类 Facade,该类持有 SubsystemA 和 SubsystemB 的实例,并提供了一个操作方法 operation,该方法内部调用了子系统的操作方法。
在 main 函数中,我们创建了一个外观对象 facade,并通过调用 facade.operation() 来间接访问子系统的功能。
运行以上代码,输出将会是:
Subsystem A operation
Subsystem B operation
可以看到,通过外观模式,我们可以通过简单的接口来访问复杂的子系统功能,而无需直接与子系统进行交互。
相关文章:

(二)结构型模式:6、外观模式(Facade Pattern)(C++实例)
目录 1、外观模式(Facade Pattern)含义 2、外观模式的UML图学习 3、外观模式的应用场景 4、外观模式的优缺点 5、C实现外观模式的简单实例 1、外观模式(Facade Pattern)含义 外观模式(Facade Pattern)…...

docker的资源控制管理——Cgroups
目录 一、对CPU使用率的控制 1.1 CPU 资源控制 1.2 cgroups有四大功能 1.3 设置cpu使用率上限 查看周期限制和cpu配额限制 进行cpu压力测试然后修改每个周期的使用cpu的时间,查看cpu使用率 1.4 设置cpu资源占用比(设置多个容器时才有效…...

less学习语法
1.CSS函数的补充 1.rgb/rgba/translate/rotate/scale 2.非常好用的css函数: var:使用css定义的变量calc:计算css值,通常用于计算元素的大小或位置blur:毛玻璃(高斯模糊)效果gradient:颜色渐变函数 var:定义变量 css中可以自定…...

在 SHELL 脚本中调用另一个 SHELL 脚本(报错: go: not found)
文章目录 在 SHELL 脚本中调用另一个 SHELL 脚本(报错: go: not found)在 SHELL 脚本中调用另一个 SHELL 脚本一个脚本sudo调另外一个脚本,报错(报错: go: not found) 在 SHELL 脚本中调用另一个…...

07微服务的事务管理机制
一句话导读 在单体应用程序中,事务通常是在单个数据库或单个操作系统中管理的,而在微服务架构中,事务需要跨越多个服务和数据库,这就使得事务管理变得更加复杂和困难。 目录 一句话导读 一、微服务事务管理的定义和意义 二、微…...

CS5523规格书|MIPI转EDP方案设计|替代LT8911芯片电路原理|ASL集睿致远CS替代龙讯
ASL芯片(集睿致远) CS5523是一款MIPI DSI输入,DP/e DP输出转换芯片,可pin to pin替代LT8911龙讯芯片。 MIPI DSI 最多支持 4 个通道,每个通道的最大运行速度为 1.5Gps。对于DP 1.2输出,它支持1.62Gbps和2.…...

【制作npm包5】npm包制作完整教程,我的第一个npm包
制作npm包目录 本文是系列文章, 作者一个橙子pro,本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…...

QT:定时器事件
定时器第一种办法: 1.利用事件timerEvent,在帮助文档中找到该字段:[override virtual protected] void QTimer::timerEvent(QTimerEvent *e) 重写该虚函数 //重写定时器事件void timerEvent(QTimerEvent *e);2.启动定时器startTimer(1000); …...

GitHub Actions自动化部署+定时百度链接推送
前言 最近用VuePress搭建了一个静态网站,由于是纯静态的东西,每次修改完文章都要重新打包上传很是麻烦。虽然vuepress-theme-vdoing主题作者提供了GitHub Actions自动化部署的教程文章,但是过于简陋且是19年发布的。。 1. 创建一个GitHub仓…...

PHP学习心得:如何编写可维护的代码
PHP学习心得:如何编写可维护的代码 引言: 在现代的软件开发中,编写可维护的代码是非常重要的。无论是个人项目还是团队项目,可维护的代码可以提高开发效率,减少维护成本,确保代码的质量和可扩展性。本文将…...

使用vscode进行远程调试
官方调试手册:vscode官方调试手册 1.安装python扩展 如果是远程连接的话,一定要在ssh上启用扩展。不然创建基于python的配置文件时就会提示,无python扩展。 2.新建配置文件,并修改参数 点击左侧第四个按钮,运行与调试…...

LinuxC编程——进程
目录 一、概念1.1 程序1.2 进程 二、特点⭐⭐⭐三、进程段四、进程分类五、进程状态六、进程状态转换图七、函数接口1. 创建子进程2. 回收进程资源3. 退出进程4. 获取进程号 八、守护进程 一、概念 进程和程序是密不可分的两组概念,相对比,便于理解。 1.…...

深入理解设计模式-结构型之适配器
适配器模式(Adapter Pattern): 适配器模式用于将一个类的接口转换成另一个类的接口,以使两者能够一起工作。适配器模式通常用于处理已经存在的类,让它们能够与其他类协同工作,而不需要修改原始类的代码。&…...

桥梁结构健康监测系统,智能预警降低桥梁安全隐患
桥梁通常位于现代综合交通网络中的咽喉部位,对区域经济发展起着重要的推进作用,然而在为社会经济发展做出巨大贡献的同时,它们不可避免地会在荷载作用、环境侵蚀和自然灾害等影响下出现材料腐蚀劣化、结构损伤开裂、性能退化和功能失效等损伤…...

夏威夷等全球多地深陷「末日狂烧」,关键时刻 AI 监测能否跑赢野火?
内容一览:当地时间 8 月 8 日,美国夏威夷州突发野火,当地居民和游客不得不跳入太平洋中躲避火势。截至 8 月 17 日,这场野火已经造成110 人死亡,超过 1000人失踪。与此同时,美国、加拿大、法国等地也正遭遇…...

解决多模块内核心模块有接口打包成jar后被依赖并调用遇到的问题(springcloud集成ruoyi.quartz)
项目准备开发个新功能,刚好很喜欢ruoyi写的任务调度,因此想到了集成ruoyi.quartz模块 ,遇到了很多问题: 首先因为ruoyi.quartz模块依赖了ruoyi.common模块,因此第一步我需要把common模块一部分依赖项复制到了quartz模块内…...

【kubernetes系列】Kubernetes之Kubelet运行机制和状态更新机制
Kubelet运行机制 Kubelet是Kubernetes中的一个重要组件,在每个 Node 节点上都会启动 kubelet 服务。 该服务主要用于处理 Master 节点下发到本节点的任务,管理 Pod及Pod 中的容器。每个kubelet 进程会在 API Server 上注册节点自身信息,定期…...

(学习笔记-进程管理)怎么避免死锁?
死锁的概念 在多线程编程中,我们为了防止多线程竞争共享资源而导致数据错乱,都会在操作共享资源之前加上互斥锁,只有成功获得到锁的线程,才能操作共享资源,获取不到锁的线程就只能等待,直到锁被释放。 那…...

【golang】链表(List)
List实现了一个双向链表,而Element则代表了链表中元素的结构。 可以把自己生成的Element类型值传给链表吗? 首先来看List的四种方法。 MoveBefore方法和MoveAfter方法,它们分别用于把给定的元素移动到另一个元素的前面和后面。 MoveToFro…...

android平台的语音聊天助手源码
目录 1 android平台的语音聊天助手源码 1.1 //js处理工具类 1.1.1 openImage 1.2 LoadWebDetails android平台的语音聊天助手源码package com.shrimp.xiaoweirobot.net; import java.util.ArrayList;...

Python读取Word统计词频输出到Excel
1.安装依赖的包 "# 读取docx\n", "!pip install python-docx\n", "!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx\n", "# 中英文分词\n", "!pip install jieba\n", "!pi…...

windows docker mysql8.0 挂载配置文件不生效的问题
原因 mysql 8.0 遇到sql_modeonly_full_group_by的问题,于是就自定义my.cnf 去掉only_full_group_by,修改my.cnf 文件后,进行映射启动 docker run 命令 docker run -p 3306:3306 --privilegedtrue --restartalways -d --name axsc-mysql -…...

openGauss学习笔记-42 openGauss 高级数据管理-触发器
文章目录 openGauss学习笔记-42 openGauss 高级数据管理-触发器42.1 语法格式42.2 参数说明42.3 示例 openGauss学习笔记-42 openGauss 高级数据管理-触发器 触发器会在指定的数据库事件发生时自动执行函数。 42.1 语法格式 创建触发器 CREATE TRIGGER trigger_name { BEFORE…...

Leetcode33 搜索旋转排序数组
题解: /*** 旋转排序数组可分为N1 N2两个部分,如:[4,5,6,7,1,2,3],N1为[4,5,6,7],N2为[1,2,3]** 必然满足以下两个条件:* 1. N1和N2都是分别递增的;* 2. N1中的所有元素大于N2中的所有元素;** …...

docker 第一章
目录 1.安装 docker 2.镜像、容器 3.总结 1.安装 docker 2.镜像、容器 3.总结 容器在 linux 上的本机运行,与其他容器共享主机的内核。它运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常轻量级。...

注册中心 —— SpringCloud Netflix Eureka
Eureka 简介 Eureka 是一个基于 REST 的服务发现组件,SpringCloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 SpringCloud 的服务注册与发现,同时提供了负载均衡、故障转移等能力,目前 Eureka2.0 已经不再维护…...

2023年国赛数学建模思路 - 案例:异常检测
文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…...

⛳ Java 反射
目录 ⛳ Java 反射🎨 一、反射概述**🎃 使用反射的前提条件: **🎲 类正常加载过程如下图:反射优缺点:🧸 Java反射机制提供的功能: **🥅 反射主要API** 🏭 二、反射的使用Ἲ…...

Android 13 像Settings一样开启关闭深色模式
一.背景 由于客户定制的Settings需要开启关闭深色模式,所以需要自己调用开启关闭深色模式 二.前提条件 首先应用肯定要是系统应用,并且导入framework.jar包,具体可以参考: Android 应用自动开启辅助(无障碍)功能并使用辅助(无障碍)功能_android 自动开启无障碍服务_龚礼鹏…...

微服务实战项目-学成在线-项目优化(redis缓存优化)
微服务实战项目-学成在线-项目优化(redis缓存优化) 1 优化需求 视频播放页面用户未登录也可以访问,当用户观看试学课程时需要请求服务端查询数据,接口如下: 1、根据课程id查询课程信息。 2、根据文件id查询视频信息。 这些接口在用户未认…...