C++中的中介者模式

2024-06-13 07:36
文章标签 c++ 模式 中介

本文主要是介绍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;
}

总结

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

这篇关于C++中的中介者模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056670

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点