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

ops/2025/2/24 15:05: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/ops/161000.html

相关文章

DeepSeek 助力 Vue 开发:打造丝滑的复制到剪贴板(Copy to Clipboard)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

GPIO外设

一、GPIO简介 GPIO&#xff0c;general-purpos IO port,通用输入输出引脚&#xff0c;所有的GPIO引脚都有基本的输入输出功能。 最基本的输出功能&#xff1a;STM32控制引脚输出高、低电平&#xff0c;实现开关控制&#xff1b;最基本的输入功能&#xff1a;检测外部输入电平&…

蓝桥杯刷题25.2.22|打卡

一、幸运数 3491 谨记&#xff1a;使用函数&#xff0c;拆分成多个小问题&#xff0c;不容易出错 #include <iostream> using namespace std; //计算位数 int check(int a){int count0;while(a){aa/10;count;}return count; } bool fun(int sum){int countcheck(sum);int…

Go 之 Beego 配置文件

beego 目前支持 INI、XML、JSON、YAML 格式的配置文件解析&#xff0c;但是默认采用了 INI 格式解析。而配置文件的内容又包含 App配置、Web配置、监听配置、Session配置、Log配置。 配置信息结构体代码 一、App配置 参数类型默认值说明内容 AppName string "beego&qu…

[oAuth2授权]Web前端+NodeCoze API Web后端程序+Coze授权服务器工作流程架构流程图详解

嗯,用户之前已经了解了如何使用React和Node.js结合Coze API实现OAuth2授权,现在他们具体想实现的是在Web应用中,当用户点击一个按钮(比如“和Bot对话”)时,触发授权流程,重定向到Coze的授权服务器获取code。用户还提供了一个具体的cURL请求示例,展示了如何通过302重定向…

如何将公钥正确添加到服务器的 authorized_keys 文件中以实现免密码 SSH 登录

1. 下载密钥文件 2. RSA 解析 将 id_ed25519 类型的私钥转换为 RSA 类型&#xff0c;要将 ED25519 私钥转换为 RSA 私钥&#xff0c;需要重新生成一个新的 RSA 密钥对。 步骤&#xff1a; 生成新的 RSA 密钥对 使用 ssh-keygen 来生成一个新的 RSA 密钥对。比如&#xff0c;执…

2025高维多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码

一、NMOPSO介绍 基于导航变量的多目标粒子群优化算法&#xff08;Navigation Variable-based Multi-Objective Particle Swarm Optimization, NMOPSO&#xff09;是一种专门用于无人机三维路径规划的先进算法。该算法通过将路径规划问题建模为一个多目标优化问题&#xff0c;并…

docker下安装 es 设置账号密码

环境 ElasticSearch版本&#xff1a;7.6.2 步骤 使用docker命令进入es容器 修改es的配置文件&#xff1a;elasticsearch.yml&#xff0c;添加如下配置 xpack.security.enabled: true xpack.license.self_generated.type: basic xpack.security.transport.ssl.enabled: tru…