当前位置: 首页 > news >正文

(二)结构型模式: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、外观模式&#xff08;Facade Pattern&#xff09;含义 2、外观模式的UML图学习 3、外观模式的应用场景 4、外观模式的优缺点 5、C实现外观模式的简单实例 1、外观模式&#xff08;Facade Pattern&#xff09;含义 外观模式&#xff08;Facade Pattern&#xff09;…...

docker的资源控制管理——Cgroups

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

less学习语法

1.CSS函数的补充 1.rgb/rgba/translate/rotate/scale 2.非常好用的css函数&#xff1a; var:使用css定义的变量calc:计算css值&#xff0c;通常用于计算元素的大小或位置blur:毛玻璃&#xff08;高斯模糊&#xff09;效果gradient:颜色渐变函数 var:定义变量 css中可以自定…...

在 SHELL 脚本中调用另一个 SHELL 脚本(报错: go: not found)

文章目录 在 SHELL 脚本中调用另一个 SHELL 脚本&#xff08;报错&#xff1a; go: not found&#xff09;在 SHELL 脚本中调用另一个 SHELL 脚本一个脚本sudo调另外一个脚本&#xff0c;报错&#xff08;报错&#xff1a; go: not found&#xff09; 在 SHELL 脚本中调用另一个…...

07微服务的事务管理机制

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

CS5523规格书|MIPI转EDP方案设计|替代LT8911芯片电路原理|ASL集睿致远CS替代龙讯

ASL芯片&#xff08;集睿致远&#xff09; CS5523是一款MIPI DSI输入&#xff0c;DP/e DP输出转换芯片&#xff0c;可pin to pin替代LT8911龙讯芯片。 MIPI DSI 最多支持 4 个通道&#xff0c;每个通道的最大运行速度为 1.5Gps。对于DP 1.2输出&#xff0c;它支持1.62Gbps和2.…...

【制作npm包5】npm包制作完整教程,我的第一个npm包

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

QT:定时器事件

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

GitHub Actions自动化部署+定时百度链接推送

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

PHP学习心得:如何编写可维护的代码

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

使用vscode进行远程调试

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

LinuxC编程——进程

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

深入理解设计模式-结构型之适配器

适配器模式&#xff08;Adapter Pattern&#xff09;&#xff1a; 适配器模式用于将一个类的接口转换成另一个类的接口&#xff0c;以使两者能够一起工作。适配器模式通常用于处理已经存在的类&#xff0c;让它们能够与其他类协同工作&#xff0c;而不需要修改原始类的代码。&…...

桥梁结构健康监测系统,智能预警降低桥梁安全隐患

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

夏威夷等全球多地深陷「末日狂烧」,关键时刻 AI 监测能否跑赢野火?

内容一览&#xff1a;当地时间 8 月 8 日&#xff0c;美国夏威夷州突发野火&#xff0c;当地居民和游客不得不跳入太平洋中躲避火势。截至 8 月 17 日&#xff0c;这场野火已经造成110 人死亡&#xff0c;超过 1000人失踪。与此同时&#xff0c;美国、加拿大、法国等地也正遭遇…...

解决多模块内核心模块有接口打包成jar后被依赖并调用遇到的问题(springcloud集成ruoyi.quartz)

项目准备开发个新功能&#xff0c;刚好很喜欢ruoyi写的任务调度&#xff0c;因此想到了集成ruoyi.quartz模块 &#xff0c;遇到了很多问题: 首先因为ruoyi.quartz模块依赖了ruoyi.common模块&#xff0c;因此第一步我需要把common模块一部分依赖项复制到了quartz模块内&#xf…...

【kubernetes系列】Kubernetes之Kubelet运行机制和状态更新机制

Kubelet运行机制 Kubelet是Kubernetes中的一个重要组件&#xff0c;在每个 Node 节点上都会启动 kubelet 服务。 该服务主要用于处理 Master 节点下发到本节点的任务&#xff0c;管理 Pod及Pod 中的容器。每个kubelet 进程会在 API Server 上注册节点自身信息&#xff0c;定期…...

(学习笔记-进程管理)怎么避免死锁?

死锁的概念 在多线程编程中&#xff0c;我们为了防止多线程竞争共享资源而导致数据错乱&#xff0c;都会在操作共享资源之前加上互斥锁&#xff0c;只有成功获得到锁的线程&#xff0c;才能操作共享资源&#xff0c;获取不到锁的线程就只能等待&#xff0c;直到锁被释放。 那…...

【golang】链表(List)

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

android平台的语音聊天助手源码

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

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...