C++ 设计模式:门面模式(Facade Pattern)

链接:C++ 设计模式
链接:C++ 设计模式 - 代理模式
链接:C++ 设计模式 - 中介者
链接:C++ 设计模式 - 适配器

门面模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个一致(稳定)的界面。门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。

1.问题分析

在开发中,尤其是大型系统中,子系统之间的交互和依赖关系可能非常复杂。客户端需要调用多个子系统的接口来完成一个功能,这会导致以下问题:

  • 复杂性增加:客户端代码需要了解多个子系统的接口和调用顺序,增加了代码的复杂性。
  • 高耦合度:客户端与多个子系统直接交互,导致客户端与子系统之间的耦合度很高,难以维护和扩展。
  • 难以使用:对于新手或不熟悉系统的开发者来说,直接使用多个子系统的接口可能会感到困难。

为了解决这些问题,我们可以使用门面模式。门面模式通过提供一个高层接口,简化了客户端对多个子系统的使用,降低了系统的复杂性和耦合度。

门面模式并非一个集装箱,可以任意地放进任何多个对象。组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是一个简单的功能集合。它更注重从架构的层次去看整个系统,而不是单个类的层次,门面模式很多时候更是一种架构设计模式。

2.实现步骤

  1. 定义子系统类:实现子系统的具体功能。每个子系统类负责处理特定的任务,并提供相应的接口供外部调用。
  2. 定义Facade类:提供一个高层接口,调用子系统类的功能。Facade类封装了子系统的复杂性,对外提供简化的接口。
  3. 客户端代码:通过Facade类来访问子系统的功能。客户端只需要与Facade类交互,而不需要直接与子系统类交互。

3.代码示例

以机器人作为示例。

3.1.定义子系统类

// 运动子系统
class MovementSystem {public:void start() { std::cout << "Movement system started." << std::endl; }void stop() { std::cout << "Movement system stopped." << std::endl; }
};
// 语音子系统
class SpeechSystem {public:void start() { std::cout << "Speech system started." << std::endl; }void stop() { std::cout << "Speech system stopped." << std::endl; }void speak(const std::string& message) { std::cout << "Robot says: " << message << std::endl; }
};
// 传感器子系统
class SensorSystem {public:void activate() { std::cout << "Sensor system activated." << std::endl; }void deactivate() { std::cout << "Sensor system deactivated." << std::endl; }void readSensors() { std::cout << "Reading sensor data..." << std::endl; }
};

3.2.定义Facade类

// Facade类,提供一个高层接口,封装子系统的复杂性
class RobotFacade {public:RobotFacade() : movementSystem_(new MovementSystem()), speechSystem_(new SpeechSystem()), sensorSystem_(new SensorSystem()) {}~RobotFacade() {delete movementSystem_;delete speechSystem_;delete sensorSystem_;}void startRobot() {std::cout << "Starting robot..." << std::endl;sensorSystem_->activate();movementSystem_->start();speechSystem_->start();speechSystem_->speak("Hello, I am your robot assistant.");}void stopRobot() {std::cout << "Stopping robot..." << std::endl;speechSystem_->speak("Goodbye!");movementSystem_->stop();speechSystem_->stop();sensorSystem_->deactivate();}void performTask(const std::string& task) {std::cout << "Performing task: " << task << std::endl;sensorSystem_->readSensors();speechSystem_->speak("I am performing the task: " + task);// 这里可以添加更多的任务逻辑}private:MovementSystem* movementSystem_;SpeechSystem* speechSystem_;SensorSystem* sensorSystem_;
};

3.3.客户端代码

通过Facade类来访问子系统的功能

int main() {RobotFacade robot;// 启动机器人robot.startRobot();// 执行任务robot.performTask("cleaning");// 停止机器人robot.stopRobot();return 0;
}

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

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

相关文章

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景 在现代工业和建筑行业中&#xff0c;安全始终是首要考虑的因素之一。特别是在施工现场&#xff0c;工人佩戴安全帽是确保人身安全的基本要求。然而&#xff0c;人工监督难免会有疏漏&#xff0c;尤其是在大型工地或复杂环境中&#xff0c;确保每个人都佩戴安全帽变得非…

Unity开发微信小游戏踩坑总结

前言 不记录真记不住&#xff0c;这个帖子以后不定时更新。 问题1&#xff1a;图片模糊 问题描述&#xff1a; 在Unity里什么事没有&#xff0c;进入到微信开发者工具里就已经模糊了&#xff0c;人物动画是一团马赛克&#xff0c;图片看着倒是没事。 问题原因&#xff1a;…

【AI日记】24.12.30 kaggle 比赛 2-18

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;8 小时 读书 1 书名&#xff1a;教育的本质时间&#xff1a;0.5 小时评估&#xff1a;快速读完&#xff0c;收获不…

VUE echarts 教程二 折线堆叠图

VUE echarts 教程一 折线图 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option {title: {text: Stacked Line},tooltip: {trigger: axis},legend: {data: [Email, Union Ads, Video Ads, Dir…

微信小程序中遇到过的问题

记录微信小程序中遇到的问题&#xff08;持续更新ing&#xff09; 问题描述&#xff1a;1. WXML中无法直接调用JavaScript方法。2. css中无法直接引用背景图片。3. 关于右上角胶囊按钮。4. 数据绑定问题。5. 事件处理问题。6. 关于movable-view组件的问题7. 关于设置宽度后设置…

RabbitMQ实现生产者消费者

一.启动MQ 注意管理员身份进入cmd才行,我这里是在本地安装的MQ,推荐使用虚拟机安装 二.思路 官方解释RabbitMQ结构: 自我理解RabbitMQ结构: 其实RabbitMQ的服务器就像邮局一样,我们的生产者和消费者对于这个服务器来说都是消费者,因为服务器都可以向两者发送消息 环境准备 …

课设CLion连接Ubuntu14makeQt项目出错解决汇总

在这之前需要注意以下几点&#xff1a; 1、需要 确保CLion能连接Ubuntu14 2、cmakelist.txt文件配置 3、知道部署路径&#xff1a; 问题一&#xff1a;/usr/bin/ld: cannot open output file GreedySnake: Is a directory 否则就会出现make以后应该生成一个可执行文件&…

JavaWeb开发(一)IDEA工具下载、配置、项目创建、Tomcat配置

1. IDEA工具下载、配置、项目创建、Tomcat配置 1.1. IDEA官方地址下载 官方地址下载 1.1.1. 自动补全 Settings–>Editor–>General–>Code Completion 1.1.2. 自动导包 Settings–>Editor–>General–>Auto lmport 1.1.3. 配置JDK 1.2. 创建项目 1…

RK3568 bsp 9 - USB调试记录

文章目录 1、环境介绍2、RK3568 USB资源介绍3、配置目标4、dts配置4.1、USB3.0 OTG4.2、USB2.0 Host 2 和 USB2.0 Host 3 5、kernel配置5.1、USB PHY CONFIG5.2、USB Host CONFIG5.3、USB OTG CONFIG5.4、USB外设CONFIG5.4.1、Mass Storage Class CONFIG5.4.2、USB HID CONFIG …

一文讲清楚webpack和vite原理

一、前言 每次用vite创建项目秒建好&#xff0c;用vue-cli创建了一个项目&#xff0c;却有点久&#xff0c;那为什么用 vite 比 webpack 要快呢&#xff0c;这篇文章带你梳理清楚它们的原理及不同之处&#xff01;文章有一点长&#xff0c;看完绝对有收获&#xff01; 二、web…

Vue3源码解读--方向篇

vue3文档地址、GitHub项目地址&#xff1a; https://cn.vuejs.org/v2/api/ https://github1s.com/vuejs/vue-next/tree/3.2 二、如何本地调试vue3源码 很多时候我们都是在本地调试vue3的源码&#xff0c;然后沿着调用链&#xff0c;一步一步的去梳理vue3的源码。 把vue3项目拉到…

工业大数据分析算法实战-day20

文章目录 day20设备对象维度建模方法维度专家规则驱动的方法&#xff1a;AI-FIT-PM过程模型少量样本驱动的方法数据驱动的方法 软件维度 day20 今天是第20天&#xff0c;昨日是对第九章节行业知识沉淀中知识工程、维度模型、模式要素模型进行讲解&#xff0c;尤其是维度模型中…

InstructGPT:基于人类反馈训练语言模型遵从指令的能力

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 大模型进化树&#xff0c;可以看到 InstructGPT 所处的年代和位置。来自 大语言模型&#xff08;LLM&#xff09;综述与实用指南&#xff08;Amazon&#xff0c;2023&#xff09; 目录 摘要 1 引言 …

如何进行年度工作回顾?

发生了什么事&#xff1f; 什么事情进展顺利 &#xff1f; 什么事情进展不顺利&#xff1f; 如何适应未来&#xff1f; 年度回顾的定义&#xff1a;这是一种战略工具&#xff0c;能帮助人们清晰看到过去一年对业务、职业或个人生活的影响&#xff0c;可用于明确关键事件、找出问…

Centos 7 二进制安装时序数据库TDengine_我和国产时序数据库的第一次亲密接触

一、前言 之前在搞监控时&#xff0c;曾学习和测试过InfluxDB数据库&#xff0c;第一次接触时序数据库&#xff0c;也深深感受到了时序数据库的块&#xff0c;最近在墨天轮上看到对国产库时序数据库&#xff08;Time Series Database&#xff09;的介绍&#xff0c;特别是看了涛…

Design Compiler:两种工作模式(线负载模式和拓扑模式)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 Design Compiler可以以线负载模式或拓扑模式启动&#xff0c;必须选择其中一个模式。在拓扑模式下还可使用多模式和UPF模式&#xff1a;多模式允许在多种工作…

真的一行代码没写,使用cursor智能代码编辑器,通过问答的方式,我构建了一个微信小程序

文章目录 1 待办123 产品介绍1.1 使用说明1.2 产品亮点1.3 应用场景 2 零基础实战教程&#xff1a;零代码开发微信小程序2.1 微信公众号注册小程序2.2 下载安装微信开发者工具2.3 下载安装cursor2.4 使用cursor零代码构建微信小程序 3 总结 使用cursor已经有一段时间了&#xf…

element-plus在Vue3中开发相关知识

报错&#xff1a;error.mjs:20 ElementPlusError: [ElForm] model is required for resetFields to work. 原因&#xff1a;el-form使用v-model没有把内容绑定上&#xff0c;需要使用 :model 才可以校验 将&#xff1a; <el-form label-width"auto" class"…

Python爬虫实战(保姆级登网页信息爬取教程)

此blog为爬虫实战教学&#xff0c;代码已附上&#xff0c;可以复制运行。若要直接看实战代码翻到博客后半部分。 本文使用selenium库进行爬虫&#xff0c;实现爬取数据操作&#xff0c;此库是通过模仿用户的操作进行对页面的处理。了解了这个思维模式&#xff0c;可以对代码进…

PyTorch快速入门教程【小土堆】之DataLoader的使用

视频地址DataLoader的使用_哔哩哔哩_bilibili dataset数据集&#xff0c;相当于一副扑克&#xff0c;dataloader数据加载器相当于我们的手&#xff0c;选择摸几张牌&#xff0c;怎么摸牌 import torchvision# 准备的测试数据集 from torch.utils.data import DataLoader from …