C++ 设计模式-中介者模式

devtools/2025/2/24 18:32:55/

聊天室

#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>// 前向声明
class User;// 抽象中介者
class ChatMediator {
public:virtual ~ChatMediator() = default;virtual void broadcast(const std::string& msg, User* sender) = 0;virtual void privateMessage(const std::string& msg, User* sender, const std::string& receiver) = 0;
};// 抽象用户类
class User {
protected:ChatMediator* mediator_;std::string name_;public:User(ChatMediator* mediator, std::string name): mediator_(mediator), name_(std::move(name)) {}virtual ~User() = default;// 发送广播void sendToAll(const std::string& msg) {mediator_->broadcast(msg, this);}// 发送私信void sendPrivate(const std::string& msg, const std::string& receiver) {mediator_->privateMessage(msg, this, receiver);}virtual void receive(const std::string& msg, const User* sender = nullptr) const {std::cout << "[" << name_ << "] 收到";if(sender) std::cout << "来自[" << sender->name_ << "]的";std::cout << "消息: " << msg << std::endl;}std::string getName() const { return name_; }
};// 具体中介者
class ChatRoom : public ChatMediator {
private:std::unordered_map<std::string, User*> users_;public:void addUser(User* user) {users_.emplace(user->getName(), user);}void broadcast(const std::string& msg, User* sender) override {for (auto& [name, user] : users_) {if (user != sender) user->receive(msg, sender);}}void privateMessage(const std::string& msg, User* sender,const std::string& receiver) override {if (auto it = users_.find(receiver); it != users_.end()) {it->second->receive(msg, sender);} else {sender->receive("用户不存在: " + receiver);}}
};// 客户端使用
int main() {ChatRoom chatRoom;User alice(&chatRoom, "Alice");User bob(&chatRoom, "Bob");User charlie(&chatRoom, "Charlie");chatRoom.addUser(&alice);chatRoom.addUser(&bob);chatRoom.addUser(&charlie);// 广播消息alice.sendToAll("大家好!");// 私信消息bob.sendPrivate("今晚一起吃饭吗?", "Alice");charlie.sendPrivate("测试消息", "UnknownUser");return 0;
}

关键说明:

  1. 明确消息类型

    • broadcast():广播给所有用户(排除发送者)
    • privateMessage():精确发送给指定用户
  2. 输出结果

[Bob] 收到来自[Alice]的消息: 大家好!
[Charlie] 收到来自[Alice]的消息: 大家好!
[Alice] 收到来自[Bob]的消息: 今晚一起吃饭吗?
[Charlie] 收到消息: 用户不存在: UnknownUser
  1. 模式优势体现

    • 完全解耦:用户之间无需知道彼此存在
    • 集中路由:所有消息逻辑在中介者中处理
    • 灵活扩展:可轻松添加群组消息、消息过滤等新功能
  2. 设计亮点

    • 使用哈希表快速查找用户(O(1)时间复杂度)
    • 接收消息时显示发送者信息
    • 处理用户不存在等异常情况

模式结构示意图:

           +----------------+|  ChatMediator  |+----------------+| broadcast()    || privateMessage()|+--------+-------+ʌ| 中介
+-------------+     |     +-------------+
|    User     +-----+-----+  ChatRoom   |
+-------------+           +-------------+
| sendToAll() |           | 用户管理    |
| sendPrivate()           | 消息路由    |
+-------------+           +-------------+

何时使用中介者模式

  1. 当对象间存在 复杂网状通信关系
  2. 需要 集中控制 多个对象间的交互时
  3. 系统需要 动态调整通信规则

待扩展

  • 添加消息历史记录功能
  • 实现消息撤回机制
  • 增加用户权限验证
  • 支持@指定用户的群组消息

http://www.ppmy.cn/devtools/161419.html

相关文章

【数据结构】(12) 反射、枚举、lambda 表达式

一、反射 1、反射机制定义及作用 反射是允许程序在运行时检查和操作类、方法、属性等的机制&#xff0c;能够动态地获取信息、调用方法等。换句话说&#xff0c;在编写程序时&#xff0c;不需要知道要操作的类的具体信息&#xff0c;而是在程序运行时获取和使用。 2、反射机制…

深度学习之图像回归(二)

前言 这篇文章主要是在图像回归&#xff08;一&#xff09;的基础上对该项目进行的优化。&#xff08;一&#xff09;主要是帮助迅速入门 理清一个深度学习项目的逻辑 这篇文章则主要注重在此基础上对于数据预处理和模型训练进行优化前者会通过涉及PCA主成分分析 特征选择 后…

视频HDR技术详解,你的电脑怎么播放HDR视频?

闲聊&#xff1a;前两天在b站上面看到影视飓风的视频&#xff0c;让我有点疑惑&#xff0c;我不知道为什么播放视频有设备撑不住一说&#xff0c;所以感兴趣去ytb下载了4k原片30hz刷新的&#xff0c;然后测试一下我的电脑能不能播放&#xff0c;发现还是可以的&#xff0c;视觉…

R语言安装生物信息数据库包

R语言安装生物信息数据库包 在生物信息学领域&#xff0c;R语言是重要的数据分析工具。今天&#xff0c;我们就来聊聊在R语言环境下&#xff0c;安装生物信息数据库包&#xff08;org.*.*.db&#xff09;的步骤。 为什么要安装org.*.*.db系列包 生物信息学分析中&#xff0c…

内网网络安全的解决之道

本文简要分析了企业内部网络所面临的主要分析&#xff0c;阐述了安全管理人员针对不同威胁的主要技术应对措施。进一步介绍了业界各种技术措施的现状&#xff0c;并提出了未来可能的发展趋势。 内网网络安全问题的提出 网络安全对于绝大多数人而言指的都是互联网安全&#xff…

Redis-缓存过期和内存淘汰

缓存过期&&内存淘汰 过期删除如何设置过期时间判断key是否过期过期删除策略有哪些定时删除惰性删除定期删除Redis过期删除策略 内存淘汰策略如何设置Redis最大运行内存Redis内存淘汰策略有哪些不进行数据淘汰进行数据淘汰的策略设置了过期时间的数据中进行淘汰所有数据…

一、Spring框架系统化学习路径

系统化的Spring框架学习路径 第1阶段&#xff1a;基础知识准备 Java基础 核心概念&#xff1a;面向对象、异常处理、集合框架、多线程等。JVM基础&#xff1a;内存模型、垃圾回收机制。 Maven或Gradle Maven&#xff1a;创建项目、依赖管理、生命周期。Gradle&#xff1a;基本…

ubuntu20.04重启后不显示共享文件夹

ubuntu20.04重启后不显示共享文件夹 主要参见这两篇博客 Ubuntu重启后不显示共享文件夹_ubuntu 20.04 共享目录无法使用-CSDN博客 ubuntu22.04 配置共享文件夹 找不到/mnt/hgfs_ubuntu安装tools 后mnt文件夹在哪-CSDN博客 重启Ubuntu20.04后&#xff0c;发现共享文件夹进不去…