【设计模式之外观模式 -- C++】

外观模式 – 统一接口,简化调用

外观模式(Facade Pattern)是一种常用的软件设计模式,它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更易于使用。外观模式定义了一个高层接口,这个接口使得这一子系统更易于使用。百度百科

1) 组成

1.一个基类;
2.n个相同接口的子系统类;
3.一个外观类;

大白话就是:有一个外观类,起到整体的调度;n个子系统的方法名相同,功能类型,可以统一调度

2)好处
  1. 简化接口:外观模式提供了一个统一的接口,隐藏了子系统的复杂性,使得子系统更易于使用。
  2. 提高了客户端使用的便利性:客户端不需要了解系统内部的复杂联系,只需要通过外观类来调用需要的功能。
  3. 提高了系统的灵活性和安全性:实现系统与客户端的解耦,使得系统的内部变化不会影响到客户端。
  4. 降低了代码耦合度:将客户端与复杂的子系统解耦,使得子系统的变化不会影响到客户端。
  5. 提供了一个访问子系统的统一入口:集中管理和降低对象之间的依赖关系。
3)使用场景
  1. 当你想为一个复杂的子系统提供一个简单的接口时。外观模式可以提供一个简单的默认视图,这个视图对于大多数客户来说足够,而只有需要更多的可定制性的客户才需要超越这个外观接口。
  2. 当客户和抽象类的实现部分之间存在很大的依赖性时。引入外观可以将子系统与客户以及其他子系统解耦,提高子系统的独立性和可移植性。
  3. 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,那么你可以让它们仅通过外观接口进行通信,从而简化了它们之间的依赖关系。
4)实现
  1. 定义一个基类:有start和stop方法
class System {
public:virtual void Start() = 0;virtual void Stop() = 0;
};
  1. 定义两个个子类
// 定义一个子类:程序1
class Program1 : public System {
public:void Start() override {cout << "Program1: Start.\n";}void Stop() override {cout << "Program1: Stop.\n";}
};// 定义一个子类:程序2
class Program2 : public System {
public:void Start() override {cout << "Program2: Start.\n";}void Stop() override {cout << "Program2: Stop.\n";}
};
  1. 定义外观类
class Facade {
private:System *program1_;System *program2_;public:Facade() {program1_ = new Program1;program2_ = new Program2;}~Facade() {delete program1_;delete program2_;}void Start() {program1_->Start();program2_->Start();}void Stop() {program1_->Stop();program2_->Stop();}
};
  1. 测试
int main() {Facade *facade = new Facade;facade->Start();facade->Stop();delete facade;return 0;
}
  1. 结果
Program1: Start.
Program2: Start.
Program1: Stop.
Program2: Stop.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/26290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北航数据结构与程序设计第五次作业选填题复习

选填题考的很多都是基础概念&#xff0c;对于巩固复习一些仡佬拐角的知识点是很有用的。非北航学生也可以来看看这些题&#xff0c;这一节主要是树方面的习题&#xff1a; 一、 我们首先需要知道一个公式 这是证明&#xff1a; 知道了这个公式&#xff0c;我们把题目中的数据…

猫头虎分享:2024应届生择业在大模型和智能机器人之间该如何选择?

猫头虎分享&#xff1a;2024应届生择业在大模型和智能机器人之间该如何选择&#xff1f; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的…

wallless ios

登陆官网 wallless 然后跟着使用文档就可以了&#xff0c;主要得买一个账号&#xff0c;之后就可以一键导入自己已经买了的节点信息了。

B树与B+树与Mysql innodb的B+树和其相关索引

文章目录 前言B树与B树与Mysql innodb的B树和其相关索引1. B树2. B树3. Mysql上的Innodb 的B树4. 基于 innodb的B树说索引5. mysql中的数据类型转换需要注意哪些事项 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff…

如何在Bing搜索进行广告推广?2024年必应广告投放怎么做?【附开户攻略】

必应&#xff08;Bing&#xff09;作为全球领先的搜索引擎之一&#xff0c;拥有一个独特且庞大的用户群体&#xff0c;尤其在美国和欧洲市场&#xff0c;很多用户选择必应作为他们的主要搜索引擎。通过必应广告&#xff0c;企业可以触达那些在其他搜索引擎上难以接触到的潜在客…

自定义打印外观

以下示例代码演示了如何将打印外观和背景颜色自定义应用于网格控件中的偶数行。 gridView1.OptionsPrint.UsePrintStyles true; // Enable the AppearancePrint.EvenRow propertys settings. gridView1.OptionsPrint.EnableAppearanceEvenRow true; // Set the background c…

【机器学习】基于3D CNN通过CT图像分类预测肺炎

1. 引言 1.1. 研究背景 在医学诊断中&#xff0c;医生通过分析CT影像来预测疾病时&#xff0c;面临一些挑战和局限性&#xff1a; 图像信息的广度与复杂性&#xff1a; CT扫描生成的大量图像对医生来说既是信息的宝库也是处理上的负担。每组CT数据可能包含数百张切片&#xf…

【Excel技巧】Excel打开密码的两种设置方法!

excel文件打开密码可以再打开文件时输入密码查看文件内容&#xff0c;这样就可以保护文件内容不被任何人查看了&#xff0c;今天分享excel打开密码的两种设置方法给大家。 方法一&#xff1a; 点击excel中的【文件】功能&#xff0c;找到【信息】-【保护工作表】-【用密码进行…

Spring6

一 概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…

2024年计算机相关专业是否还值得选择

目录 1.概述 1.1.就业前景 1.2.个人兴趣与能力 1.3.专业发展与趋势 1.4.市场饱和度与竞争 1.5.建议与展望 2.行业竞争现状 2.1.行业饱和度 2.2.新兴技术的影响 2.3.人才需求的变化 2.4.行业内的创新动态 2.5.保持从业者的竞争力 2.6.小结 3.专业与个人的匹配度判断…

高光谱成像光源 实现对细微色差的分类--51camera

光源在机器视觉中的重要性不容小觑&#xff0c;它直接影响到图像的质量&#xff0c;进而影响整个系统的性能。然而自然光LED光源不能完全满足实际需求&#xff0c;比如对细微的色差进行分类&#xff0c;我们就需要考虑红外高光谱光源。 所谓高光谱成像&#xff0c;是指使用具有…

【数学建模】微分方程的数值求解

微分方程的数值求解 一阶差分求解微分方程原理:四阶龙格-库塔方法应用:小船渡河问题: 进阶求二阶微分方程 一阶差分求解微分方程原理: d y d x f ( x n , y n ) \dfrac{dy}{dx}f(x_n,y_n) dxdy​f(xn​,yn​) y n 1 − y n x n 1 − x n f ( x n , y n ) \dfrac{y_{n1}-y_n…

git多账号使用报错:You don‘t have permissions to push to “xxx/xxxx“ onGitHub. Would

git多账号使用报错&#xff1a;You don’t have permissions to push to “xxx/xxxx” onGitHub. Would 有的时候我们有两个甚至多个git账号&#xff08;公司的git账号和自己的github&#xff09;&#xff0c;为了不混淆提交&#xff0c;我们需要在提交之前查看自己的git账号必…

9_1 Linux 网络管理

9_1 Linux 网络管理 文章目录 9_1 Linux 网络管理[toc]1. 构建yum仓库2. 配置主机名3. 配置网络参数之IP地址与子网掩码、网关地址3.1 修改网卡命名规则&#xff08;eth0&#xff0c;eth1&#xff0c;eth2&#xff09;3.2 配置地址3.2.1 nmcli3.2.2 配置文件修改IP地址、子网掩…

渗透测试之内核安全系列课程:Rootkit技术初探(五)

今天&#xff0c;我们来讲一下内核安全&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 目前&#xff0c;在渗透测试领域&#xff0c;主要分为了两个发展方向&#xff0c;分别为Web攻防领域和PWN&#xff08;二进制安全&#xff09;攻防领域。在…

人工智能对聊天机器人训练数据的“淘金热”可能会耗尽人类编写的文本

人工智能对聊天机器人训练数据的“淘金热”可能会耗尽人类编写的文本 像ChatGPT这样的人工智能系统可能很快就会耗尽让它们变得更聪明的东西——人们在网上写下和分享的数万亿字。 Epoch AI研究集团发布的一项新研究预计&#xff0c;科技公司将在大约十年之交——2026年至203…

Linux快速保存文件的快捷键:w和快速保存并退出ZZ

在Linux中&#xff0c;使用vi或Vim编辑器时&#xff0c;保存文件的快捷键主要是:w。以下是关于vi/Vim编辑器中保存操作的详细快捷键和说明&#xff1a; 1、保存文件 :w &#xff1a;这是最常用的保存命令。在命令模式下&#xff08;按Esc键进入&#xff09;&#xff0c;输入:…

【Linux】ls命令

这个命令主要是用于显示指定工作目录下之内容&#xff08;列出目前工作目录所含的文件及子目录)。 掌握几个重点的常使用的就可以&#xff1a; ls -l # 以长格式显示当前目录中的文件和目录 ls -a # 显示当前目录中的所有文件和目录&am…

Go使用https

一、服务端 1. 生成私钥和证书 安装OpenSSL windows安装OpenSSL生成CA证书创建证书 以上两个步骤&#xff0c;参考&#xff1a;Go http2 和 h2c 2. 代码 package mainimport ("log""net/http""time""golang.org/x/net/http2" )co…

TCP四次挥手全过程详解

TCP四次挥手全过程 有几点需要澄清&#xff1a; 1.首先&#xff0c;tcp四次挥手只有主动和被动方之分&#xff0c;没有客户端和服务端的概念 2.其次&#xff0c;发送报文段是tcp协议栈的行为&#xff0c;用户态调用close会陷入到内核态 3.再者&#xff0c;图中的情况前提是双…