篇十:外观模式:简化复杂系统
篇十:“外观模式:简化复杂系统”
开始本篇文章之前先推荐一个好用的学习工具,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;
}
在上述示例中,我们首先定义了子系统类SubsystemA、SubsystemB和SubsystemC,每个子系统类都包含了一个特定的操作。然后,我们定义了外观类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/
相关文章:
篇十:外观模式:简化复杂系统
篇十:“外观模式:简化复杂系统” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,分…...
linux gcc __attribute__
__attribute__ 1. 函数属性1.1 __attribute__((noreturn))1.2 __attribute__((format))1.3 __attribute__((const)) 2. 变量属性2.1. __attribute__((aligned))2.2. __attribute__((packed)) 3. 类型属性 __attribute__ 是 GCC 编译器提供的一种特殊语法,它可以用于…...
【SpringCloud】RabbitMQ基础
1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,…...
css, resize 拖拉宽度
效果如下: 可直接复制预览查看属性值: 关键样式属性: resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…...
Python识别抖音Tiktok、巨量引擎滑块验证码识别
由于最近比较忙,所以本周搞了一个相对简单的验证码,就是抖音Tiktok的滑块验证码,这也是接到客户的一个需求。这种验证码通常在电脑端登录抖音、巨量引擎的的时候出现。 首先看一下最终的效果: 验证码识别过程 1、利用爬虫采集图…...
EvilBox One靶场笔记
EvilBox: One靶场笔记 信息收集 先fscan找主机192.168.1.102 namp扫端口 开放80,22端口 然后扫目录 └─$ gobuster dir -r -u http://192.168.1.102/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak,html在扫secret目录,找…...
shell脚本中的export无效
写了一段shell脚本: #!/bin/bash source Tools/simulation/gazebo-classic/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:$(pwd) export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:$(pwd)/Tools/simulation/gazebo…...
前沿分享-鱼形机器人
可能并不太前沿了,是21年底的新闻了,但是看见了就顺便发一下吧。 大概就是,通过在pH响应型水凝胶中编码不同的膨胀速率而构建了一种环境适应型变形微机器人,让微型机器人直接向癌细胞输送药物从而减轻药物带来副作用。 技术原理是,…...
摄像机终端IP地址白名单配置流程
海康摄像头配置白名单流程 1.登录海康摄像机前端 2.进入配置-系统-安全管理-IP地址过滤 3.IP地址过滤方式选择“允许” 4.点击添加按钮输入对应的IP地址或者IP网段 5.最后勾选启用IP地址过滤,然后保存 大华摄像头配置白名单流程 1.登录大华摄像机前端 2.进入设…...
Glibc—查看版本
方式1:直接查看ldd版本 ldd --versionldd (Buildroot) 2.30 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICU…...
C++物理引擎Box2D的下载,编译,VS2013配置环境
文章目录 网站和下载地址编译工具:编译box2dhelloworld测试网站和下载地址 https://box2d.org/ 下载地址 https://hub.nuaa.cf/erincatto/box2d/tags 编译工具: 1.VS2013 2.cmake 下载地址 https://cmake.org/ 编译box2d 下载box2d源码2.4.0,解压。在box2d-2.4.0目录下…...
STL容器详解——map容器
一、map容器介绍 作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C 基本数据类型(int、double 等)、使用结构体…...
VR全景在建筑工程行业能起到哪些作用?
在建筑工程领域,数字化技术为行业的发展起到巨大的推动作用,虽然建筑施工行业主要是依赖于工人劳动力和施工设备,但是VR全景在该行业中方方面面都能应用,从设计建模到项目交付,帮助建筑师以及项目方更好的理解每个环节…...
P1257 平面上的最接近点对
题目 思路 详见加强加强版 代码 #include<bits/stdc.h> using namespace std; #define int long long const int maxn4e510; pair<int,int> a[maxn]; int n; double d1e16; pair<int,int> vl[maxn],vr[maxn]; void read() { cin>>n;for(int i1;i<…...
8月1日上课内容 第一章web基础与http协议
dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层--传输层---网络层----数据链路层-----物理层 ip地址,我们每一台主机都有一个唯一的地址标识(固定的ip地址),区分用户和计算机通信。 ip地址:32位二进制数组成的,不方便记忆 192.168.…...
Gson 添加数据默认值问题记录
问题:在用Gson add(key(string类型),value(必须是JsonElement子类))时发现,value 传了 "" 空字符串(非null),默认解析后返回null&#…...
利用Arthas+APM监控进行Java性能深度定位
大家可能都用过APM监控,包括开源的Skywalking、商用的卓豪(ZOHO)ManageEngine APM应用性能监控、以及云监控产品如听云(Server监控),这些APM监控产品大大方便了我们实时监控应用性能,并实现性能…...
【BASH】回顾与知识点梳理(十一)
【BASH】回顾与知识点梳理 十一 十一. 八至十章知识点总结及练习11.1 总结11.2 练习情境模拟题一:透过 grep 搜寻特殊字符串,并配合数据流重导向来处理大量的文件搜寻问题。情境模拟题二:使用管线命令配合正规表示法建立新指令与新变量。 该系…...
vue2-diff算法
1、diff算法是什么? diff算法是一种通过同层的树节点进行比较的高效算法。 其有两个特点: 比较只会在同层级进行,不会跨层级进行。 在diff比较的过程中,循环从两边向中间比较。 diff算法在很多场景中都有应用,在vue中&…...
SpringBoot使用redis作为缓存的实例
目录 什么是缓存? 缓存的作用? 缓存的成本? 实际项目中的应用 代码展示 什么是缓存? 缓存就是数据交换的缓冲区(称作Cache [ kʃ ] ),是存贮数据的临时地方,一般读写性能较高。 缓…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
