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++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决