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

【设计模式之外观模式 -- 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.

相关文章:

  • 【数据结构】栈和队列-->理解和实现(赋源码)
  • width: 100%和 width: 100vw这两种写法有什么区别
  • 大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)
  • 2024年安全现状报告
  • 【Postman接口测试】第四节.Postman接口测试项目实战(中)
  • Vue项目安装axios报错npm error code ERESOLVE npm error ERESOLVE could not resolve解决方法
  • selenium中,如何使用选择框
  • stack和queue的模拟实现
  • 代码随想录算法训练营第二十二天
  • VCS基本仿真
  • 线性代数|机器学习-P9向量和矩阵范数
  • 目标检测数据集 - 智能零售柜商品检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • MacOS M系列芯片一键配置多个不同版本的JDK
  • SpringBoot+Vue幼儿园管理系统(前后端分离)
  • tomcat-valve通过servlet处理请求
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • es6--symbol
  • flask接收请求并推入栈
  • Git 使用集
  • Git的一些常用操作
  • Java知识点总结(JavaIO-打印流)
  • PAT A1017 优先队列
  • Promise初体验
  • Python爬虫--- 1.3 BS4库的解析器
  • supervisor 永不挂掉的进程 安装以及使用
  • vue 个人积累(使用工具,组件)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Windows Containers 大冒险: 容器网络
  • yii2权限控制rbac之rule详细讲解
  • 初探 Vue 生命周期和钩子函数
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 机器学习学习笔记一
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 坑!为什么View.startAnimation不起作用?
  • 理清楚Vue的结构
  • 如何合理的规划jvm性能调优
  • 微信公众号开发小记——5.python微信红包
  • 移动端高清、多屏适配方案
  • ​什么是bug?bug的源头在哪里?
  • $.ajax()参数及用法
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (二)linux使用docker容器运行mysql
  • (二)测试工具
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (图)IntelliTrace Tools 跟踪云端程序
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .NET CORE Aws S3 使用
  • .php文件都打不开,打不开php文件怎么办
  • :“Failed to access IIS metabase”解决方法