篇十:外观模式:简化复杂系统

篇十:“外观模式:简化复杂系统”

开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。

另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d

设计模式是软件开发中的宝库,外观模式(Facade Pattern)是结构型设计模式的一种。外观模式旨在为复杂系统提供一个简单的接口,使得客户端可以更加方便地与系统进行交互。通过外观模式,我们可以将系统的复杂性封装起来,提供一个高层次的接口,从而简化客户端的调用过程。在C++中,外观模式广泛应用于简化复杂系统的场景,让我们一起解释其概念和使用场景,并展示在C++中如何使用外观模式来简化复杂系统。

1. 外观模式的概念和使用场景:
外观模式是一种结构型设计模式,其核心概念在于为复杂系统提供一个简单的接口。外观模式通过将系统的一组接口封装在一个高层次的接口中,为客户端提供了一个简化的调用方式,从而隐藏了系统的复杂性。

外观模式的使用场景如下:

  • 简化接口:当一个系统拥有大量复杂的接口时,可以使用外观模式将这些接口封装起来,为客户端提供一个更加简单的接口,从而简化客户端的调用过程。
  • 解耦客户端和子系统:通过外观模式,客户端不需要直接与子系统交互,而是通过外观类来进行间接调用,从而实现了客户端和子系统的解耦。

2. 在C++中使用外观模式简化复杂系统:

a. 定义子系统类:

// SubsystemA.h
#include <iostream>class SubsystemA {
public:void operationA() const {std::cout << "Subsystem A operation" << std::endl;}
};// SubsystemB.h
#include <iostream>class SubsystemB {
public:void operationB() const {std::cout << "Subsystem B operation" << std::endl;}
};// SubsystemC.h
#include <iostream>class SubsystemC {
public:void operationC() const {std::cout << "Subsystem C operation" << std::endl;}
};

b. 定义外观类:

// Facade.h
#include "SubsystemA.h"
#include "SubsystemB.h"
#include "SubsystemC.h"class Facade {
public:void operation() const {subsystemA_.operationA();subsystemB_.operationB();subsystemC_.operationC();}private:SubsystemA subsystemA_;SubsystemB subsystemB_;SubsystemC subsystemC_;
};

c. 使用外观模式简化复杂系统:

// main.cpp
#include "Facade.h"int main() {Facade facade;facade.operation();return 0;
}

在上述示例中,我们首先定义了子系统类SubsystemASubsystemBSubsystemC,每个子系统类都包含了一个特定的操作。然后,我们定义了外观类Facade,其中包含了对子系统的调用,并提供了一个高层次的接口operation()

main.cpp中,我们创建了外观类的实例facade,通过调用facade.operation()来简化对子系统的调用。

3. 外观模式的代码解析:

  • 外观模式通过将系统的一组接口封装在一个高层次的接口中,为客户端提供了一个简化的调用方式,隐藏了系统的复杂性。
  • 子系统类表示复杂系统的各个部分,外观类包含了对子系统的调用,并提供了一个简化的接口给客户端。
  • 外观模式可以用于简化接口、解耦客户端和子系统,使得客户端可以更加方便地与复杂系统进行交互。

4. 总结:
外观模式是一种结构型设计模式,通过将系统的一组接口封装在一个高层次的接口中,为客户端提供了一个简化的调用方式,隐藏了系统的复杂性。在C++中,我们可以通过定义子系统类和外观类来应用外观模式。通过外观模式,我们可以简化接口、解耦客户端和子系统,提高代码的可维护性和可扩展性。

希望本文能够帮助您深入理解外观模式的概念和使用场景,并通过C++的示例代码演示了如何使用外观模式来简化复杂系统。外观模式在现实世界中也有很多应用,例如操作系统提供的图形界面或API接口,就是一个典型的外观模式,将底层复杂的操作封装在简单易用的接口上,让用户能够更方便地与操作系统进行交互。

5. 注意事项:
虽然外观模式能够简化复杂系统的调用过程,但在使用时也需谨慎考虑以下事项:

  • 不要滥用外观模式:当系统中的子系统数量较少或简单时,使用外观模式可能会引入不必要的复杂性,因此在设计时需根据实际情况谨慎选择是否使用外观模式。
  • 外观模式不应成为“上帝类”:外观类的职责应该是封装子系统的调用,而不应该成为“上帝类”负责所有功能。如果外观类变得过于庞大,可能会导致单一职责原则的违反,应该考虑对外观类进行拆分和重构。

6. 总结:
外观模式是一种有力的设计模式,能够简化复杂系统的调用过程,为客户端提供一个简化的接口。通过将系统的一组接口封装在一个高层次的接口中,外观模式隐藏了系统的复杂性,实现了客户端和子系统的解耦。在C++中,我们可以通过定义子系统类和外观类来应用外观模式,从而使得客户端能够更方便地与复杂系统进行交互。

希望本文能够帮助您深入理解外观模式的概念和使用场景,并通过C++的示例代码演示了如何使用外观模式来简化复杂系统。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您深入学习和应用设计模式。

参考文献:

  • Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
  • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/

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

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

相关文章

力扣 -- 139. 单词拆分

一、题目 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:bool wordBreak(str…

基于Java的新闻全文搜索引擎的设计与实现

中文摘要 本文以学术研究为目的&#xff0c;针对新闻行业迫切需求和全文搜索引擎技术的优越性&#xff0c;设计并实现了一个针对新闻领域的全文搜索引擎。该搜索引擎通过Scrapy网络爬虫工具获取新闻页面&#xff0c;将新闻内容存储在分布式存储系统HBase中&#xff0c;并利用倒…

当进行一个npm包开发时,依赖管理的重要性

npm install 的时候会进行什么&#xff1f; 当一个项目被拉下来并执行npm install的时候&#xff0c;其实dependencies 和 devDependencies都会被安装。 如果项目有严格区分生产、开发环境的话&#xff0c;是可以通过--production来以只安装 dependencies 字段的模块。 作为…

建筑行业如果应用了数字孪生技术能有什么改变?

数字孪生是一种将现实世界与数字世界相结合的先进技术&#xff0c;它在建筑行业中正发挥着越来越重要的作用。通过数字孪生技术&#xff0c;建筑行业可以实现从设计、施工到运营的全生命周期数字化管理&#xff0c;带来了许多优势和机遇。 ① 建筑设计阶段的应用 数字孪生能够…

Docker Compose: 集合管理Docker的工具安装

Docker Compose:集合管理多个Docker容器的工具&#xff0c;在安装docker时windows,macos默认安装Docker Compose&#xff0c;linux需要自己手动安装 去官网https://github.com/docker/compose/releases下载需要的版本$ sudo chmod x ./docker-compose-linux-x86_64$ sudo cp .…

Unity Shader:闪烁

还是一样的分为UI闪烁和物体闪烁&#xff0c;其中具体可分为&#xff1a;UI闪烁、物体闪烁与半透明闪烁 1&#xff0c;UI闪烁 对于UI 还是一样的&#xff0c;改写UI本身的shader&#xff1a; Shader "UI/YydUIShanShder" {Properties{[PerRendererData] _MainTex(…

Spring Test中使用MockMvc进行上传文件单元测试时,报NullPointerException

问题&#xff1a; MockMvc peform在集成测试中返回nullPointerException 原因&#xff1a; springboot-2.x版本以上&#xff0c;当你添加依赖spring_boot_starter_test后&#xff0c;可以在内部看到自带了jupiter测试核心模块&#xff0c;也就是 junit5&#xff0c;junit5&am…

Spring Boot如何整合mybatis

文章目录 1. 相关配置和代码2. 整合原理2.1 springboot自动配置2.2 MybatisAutoConfiguration2.3 debug过程2.3.1 AutoConfiguredMapperScannerRegistrar2.3.2 MapperScannerConfigurer2.3.4 创建MapperFactoryBean2.3.5 创建MybatisAutoConfiguration2.3.6 创建sqlSessionFact…

怎么合并多个视频?简单视频合并方法分享

合并多个视频可以将它们组合成一个更长的视频&#xff0c;这对于需要播放多个短视频的情况非常有用。此外&#xff0c;合并视频还可以使视频编辑过程更加高效&#xff0c;因为不必将多个独立的视频文件分别处理。最后&#xff0c;合并视频可以减少文件数量&#xff0c;从而使整…

用html+javascript打造公文一键排版系统13:增加半角字符和全角字符的相互转换功能

一、实践发现了bug和不足 今天用了公文一键排版系统对几个PDF文件格式的材料进行文字识别后再重新排版&#xff0c;处理效果还是相当不错的&#xff0c;节约了不少的时间。 但是也发现了三个需要改进的地方&#xff1a; &#xff08;一&#xff09;发现了两个bug&#xff1a;…

【JVM】 垃圾回收篇——自问自答(1)

Q什么是垃圾&#xff1a; 运行程序中&#xff0c;没用任何指针指向的对象。 Q为什么需要垃圾回收&#xff1f; 内存只分配&#xff0c;不整理回收&#xff0c;迟早会被消耗完。 内存碎片的整理&#xff0c;为新对象腾出空间 没有GC程序无法正常进行。 Q 哪些区域有GC&#…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查…

多线程案例(3)-定时器

文章目录 多线程案例三三、 定时器 大家好&#xff0c;我是晓星航。今天为大家带来的是 多线程案例三 相关的讲解&#xff01;&#x1f600; 多线程案例三 三、 定时器 定时器是什么 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就…

视频太大怎么压缩变小?三招教会你压缩视频

如果视频文件太大&#xff0c;不仅占用空间&#xff0c;还不方便传输&#xff0c;这时候就需要我们对视频进行压缩处理&#xff0c;目前市面上有多种视频压缩软件&#xff0c;想要压缩率高&#xff0c;又保留原视频的画质&#xff0c;可以参考以下的几个方法。 一、嗨格式压缩大…

flask session密钥报错

目录 1. 报错出现的代码&#xff1a;2. 报错信息如下&#xff1a;3. 报错根因&#xff1a;4. 解决措施&#xff1a; 1. 报错出现的代码&#xff1a; self.authorize_ip oauth.remote_app(oauth_ip, app_keyOAUTH_IP) self.authorize_ip.authorized_response()2. 报错信息如下…

K8s中的Controller

Controller的作用 &#xff08;1&#xff09;确保预期的pod副本数量 &#xff08;2&#xff09;无状态应用部署 &#xff08;3&#xff09;有状态应用部署 &#xff08;4&#xff09;确保所有的node运行同一个pod&#xff0c;一次性任务和定时任务 1.无状态和有状态 无状态&…

python excel 操作

excel文件内容如下&#xff1a; 一、xlrd 读Excel 操作 1、打开Excel文件读取数据 filexlrd.open_workbook(filename)#文件名以及路径&#xff0c;如果路径或者文件名有中文给前面加一个 r 2、常用函数 &#xff08;1&#xff09;获取一个sheet工作表 table file.sheets(…

大模型使用——超算上部署LLAMA-2-70B-Chat

大模型使用——超算上部署LLAMA-2-70B-Chat 前言 1、本机为Inspiron 5005&#xff0c;为64位&#xff0c;所用操作系统为Windos 10。超算的操作系统为基于Centos的linux&#xff0c;GPU配置为A100&#xff0c;所使用开发环境为Anaconda。 2、本教程主要实现了在超算上部署LLAM…

google chrome 官方下载

官方渠道&#xff1a; 1、链接直接打开就可以下载&#xff0c;最新版实时更新。 32位&#xff08;x86&#xff09;&#xff1a;https://dl.google.com/tag/s/installdataindex/update2/installers/ChromeStandaloneSetup.exe 64位&#xff08;x64&#xff09;&#xff1a;htt…

【Linux】在服务器上创建Crontab(定时任务),自动执行shell脚本

业务场景&#xff1a;该文即为上次编写shell脚本的姊妹篇,在上文基础上,将可执行的脚本通过linux的定时任务自动执行,节省人力物力,话不多说,开始操作! 一、打开我们的服务器连接工具 连上服务器后,在任意位置都可以执行:crontab -e 如果没有进入编辑cron任务模式 根据提示查看…