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

C++中的中介者模式

目录

中介者模式(Mediator Pattern)

实际应用

聊天室

空中交通管制系统

智能家居控制系统

总结


中介者模式(Mediator Pattern)

中介者模式是一种行为型设计模式,它定义了一个对象来封装一系列对象之间的交互。通过使用中介者模式,减少了对象之间的直接依赖,使对象的交互变得松散耦合,从而提高系统的可维护性和可扩展性。

实际应用

聊天室

-- 管理用户之间的消息传递。

#include <iostream>
#include <string>
#include <vector>
#include <memory>// 中介者接口
class ChatMediator {
public:virtual void sendMessage(const std::string& message, class User* user) = 0;virtual void addUser(std::shared_ptr<User> user) = 0;
};// 用户类
class User {
protected:ChatMediator& mediator;std::string name;
public:User(ChatMediator& mediator, const std::string& name) : mediator(mediator), name(name) {}virtual void send(const std::string& message) = 0;virtual void receive(const std::string& message) = 0;std::string getName() const { return name; }
};// 具体中介者
class ChatRoom : public ChatMediator {
private:std::vector<std::shared_ptr<User>> users;
public:void addUser(std::shared_ptr<User> user) override {users.push_back(user);}void sendMessage(const std::string& message, User* user) override {for (const auto& u : users) {if (u.get() != user) {u->receive(message);}}}
};// 具体用户
class ConcreteUser : public User {
public:ConcreteUser(ChatMediator& mediator, const std::string& name) : User(mediator, name) {}void send(const std::string& message) override {std::cout << name << " sends: " << message << std::endl;mediator.sendMessage(message, this);}void receive(const std::string& message) override {std::cout << name << " received: " << message << std::endl;}
};// 客户端代码
int main() {ChatRoom chatRoom;auto user1 = std::make_shared<ConcreteUser>(chatRoom, "User1");auto user2 = std::make_shared<ConcreteUser>(chatRoom, "User2");auto user3 = std::make_shared<ConcreteUser>(chatRoom, "User3");chatRoom.addUser(user1);chatRoom.addUser(user2);chatRoom.addUser(user3);user1->send("Hello everyone!");user2->send("Hi User1!");user3->send("Good morning!");return 0;
}

空中交通管制系统

-- 管理飞机之间的通信。

#include <iostream>
#include <string>
#include <vector>
#include <memory>// 中介者接口
class ATCMediator {
public:virtual void sendMessage(const std::string& message, class Aircraft* aircraft) = 0;virtual void addAircraft(std::shared_ptr<Aircraft> aircraft) = 0;
};// 飞机类
class Aircraft {
protected:ATCMediator& mediator;std::string id;
public:Aircraft(ATCMediator& mediator, const std::string& id) : mediator(mediator), id(id) {}virtual void send(const std::string& message) = 0;virtual void receive(const std::string& message) = 0;std::string getId() const { return id; }
};// 具体中介者
class ATC : public ATCMediator {
private:std::vector<std::shared_ptr<Aircraft>> aircrafts;
public:void addAircraft(std::shared_ptr<Aircraft> aircraft) override {aircrafts.push_back(aircraft);}void sendMessage(const std::string& message, Aircraft* aircraft) override {for (const auto& a : aircrafts) {if (a.get() != aircraft) {a->receive(message);}}}
};// 具体飞机
class ConcreteAircraft : public Aircraft {
public:ConcreteAircraft(ATCMediator& mediator, const std::string& id) : Aircraft(mediator, id) {}void send(const std::string& message) override {std::cout << "Aircraft " << id << " sends: " << message << std::endl;mediator.sendMessage(message, this);}void receive(const std::string& message) override {std::cout << "Aircraft " << id << " received: " << message << std::endl;}
};// 客户端代码
int main() {ATC atc;auto aircraft1 = std::make_shared<ConcreteAircraft>(atc, "AC1");auto aircraft2 = std::make_shared<ConcreteAircraft>(atc, "AC2");auto aircraft3 = std::make_shared<ConcreteAircraft>(atc, "AC3");atc.addAircraft(aircraft1);atc.addAircraft(aircraft2);atc.addAircraft(aircraft3);aircraft1->send("Requesting landing clearance.");aircraft2->send("Acknowledged. Waiting for clearance.");aircraft3->send("Holding pattern at 5000 feet.");return 0;
}

智能家居控制系统

-- 用中介者模式来管理不同设备之间的通信。

#include <iostream>
#include <string>
#include <vector>
#include <memory>// 中介者接口
class SmartHomeMediator {
public:virtual void sendMessage(const std::string& message, class Device* device) = 0;virtual void addDevice(std::shared_ptr<Device> device) = 0;
};// 设备类
class Device {
protected:SmartHomeMediator& mediator;std::string name;
public:Device(SmartHomeMediator& mediator, const std::string& name) : mediator(mediator), name(name) {}virtual void send(const std::string& message) = 0;virtual void receive(const std::string& message) = 0;std::string getName() const { return name; }
};// 具体中介者
class SmartHomeController : public SmartHomeMediator {
private:std::vector<std::shared_ptr<Device>> devices;
public:void addDevice(std::shared_ptr<Device> device) override {devices.push_back(device);}void sendMessage(const std::string& message, Device* device) override {for (const auto& d : devices) {if (d.get() != device) {d->receive(message);}}}
};// 具体设备
class Light : public Device {
public:Light(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}void send(const std::string& message) override {std::cout << "Light " << name << " sends: " << message << std::endl;mediator.sendMessage(message, this);}void receive(const std::string& message) override {std::cout << "Light " << name << " received: " << message << std::endl;}
};class Thermostat : public Device {
public:Thermostat(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}void send(const std::string& message) override {std::cout << "Thermostat " << name << " sends: " << message << std::endl;mediator.sendMessage(message, this);}void receive(const std::string& message) override {std::cout << "Thermostat " << name << " received: " << message << std::endl;}
};class SecurityCamera : public Device {
public:SecurityCamera(SmartHomeMediator& mediator, const std::string& name) : Device(mediator, name) {}void send(const std::string& message) override {std::cout << "Security Camera " << name << " sends: " << message << std::endl;mediator.sendMessage(message, this);}void receive(const std::string& message) override {std::cout << "Security Camera " << name << " received: " << message << std::endl;}
};// 客户端代码
int main() {SmartHomeController controller;auto light = std::make_shared<Light>(controller, "Living Room");auto thermostat = std::make_shared<Thermostat>(controller, "Main");auto camera = std::make_shared<SecurityCamera>(controller, "Front Door");controller.addDevice(light);controller.addDevice(thermostat);controller.addDevice(camera);light->send("Turning on the lights.");thermostat->send("Setting temperature to 22 degrees.");camera->send("Motion detected.");return 0;
}

总结

中介者模式可以帮助我们将对象之间的交互封装在一个中介者对象中,从而减少对象之间的直接依赖。

相关文章:

  • 2.linux下的文件系统结构、磁盘管理以及常规操作
  • Excel中多条件判断公式怎么写?
  • Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)
  • Ubuntu安装部署
  • [渗透测试学习] Runner-HackTheBox
  • 【Netty】ByteBuffer原理与使用
  • Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
  • C/C++ Adaline自适应线性神经网络算法详解及源码
  • 自学前端第一天
  • Android14音频进阶之CarAudioManager::getOutputDeviceForUsage流程分析(七十七)
  • Mybatis做批量操作
  • ffmpeg解封装rtsp并录制视频-(1)解封装rtsp断网或摄像机重启后自动重连处理
  • ---异常---
  • 秋招突击——第五弹——Java的SSN框架快速入门——SpringBoot的使用
  • 导出 Whisper 模型到 ONNX
  • 3.7、@ResponseBody 和 @RestController
  • AngularJS指令开发(1)——参数详解
  • Bytom交易说明(账户管理模式)
  • css属性的继承、初识值、计算值、当前值、应用值
  • es6要点
  • ES6语法详解(一)
  • JS题目及答案整理
  • leetcode386. Lexicographical Numbers
  • Python 反序列化安全问题(二)
  • springMvc学习笔记(2)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 听说你叫Java(二)–Servlet请求
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 函数计算新功能-----支持C#函数
  • 如何用纯 CSS 创作一个货车 loader
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​ArcGIS Pro 如何批量删除字段
  • ​io --- 处理流的核心工具​
  • ​queue --- 一个同步的队列类​
  • #{}和${}的区别?
  • (23)Linux的软硬连接
  • (42)STM32——LCD显示屏实验笔记
  • (52)只出现一次的数字III
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (TOJ2804)Even? Odd?
  • (一) springboot详细介绍
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net CHARTING图表控件下载地址
  • .NET Core 2.1路线图
  • .NET 表达式计算:Expression Evaluator
  • .NET建议使用的大小写命名原则
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @font-face 用字体画图标
  • [000-01-008].第05节:OpenFeign特性-重试机制
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗