新闻中心
c++如何实现中介者设计模式_c++解耦多对多对象交互
中介者模式通过引入中介者对象封装多个对象间的交互逻辑,使对象间无需直接引用,从而降低耦合度。以聊天室系统为例,用户(同事)只与中介者通信,由中介者负责消息转发,实现解耦。核心角色包括Mediator接口、ConcreteMediator实现协调逻辑和Colleague持有中介者引用。优点是减少依赖、集中控制、易于扩展,但需注意中介者可能过度复杂及生命周期管理问题。适用于GUI、游戏开发等多对多交互场景。

在 C++ 中,当多个对象之间存在复杂的多对多交互关系时,直接相互引用会导致代码高度耦合,难以维护。中介者模式(Mediator Pattern)通过引入一个中介者对象来封装这些交互逻辑,使对象之间不必直接通信,从而实现解耦。
什么是中介者模式
中介者模式定义了一个中介对象,用来封装一系列对象之间的交互。对象之间不再直接调用彼此的方法,而是通过中介者进行通信。这样每个对象只需知道中介者,而不需要了解其他所有协作对象,降低了系统的耦合度。
核心结构与角色
Mediator(中介者):定义同事对象之间交互的接口。
ConcreteMediator(具体中介者):实现协调逻辑,持有各个同事对象的引用,并负责转发消息。
Colleague(同事):每个同事对象持有对中介者的引用,只与中介者通信,不直接与其他同事交互。
使用场景举例:聊天室系统
假设有多个用户(User)在一个聊天室中发送消息。如果用户之间直接通信,添加新用户或修改逻辑会非常麻烦。使用中介者模式,可以将“聊天室”作为中介者,统一管理消息分发。
下面是一个简洁的 C++ 实现示例:
#include <iostream>
#include <vector>
#include <string>
<p>// 前向声明
class User;</p><p>// 抽象中介者
class ChatMediator {
public:
virtual void sendMessage(const std::string& msg, User<em> sender) = 0;
virtual void addUser(User</em> user) = 0;
virtual ~ChatMediator() = default;
};</p><p>// 同事类 - 用户
class User {
protected:
std::string name;
ChatMediator* mediator;</p><p>public:
User(const std::string& n, ChatMediator* m) : name(n), mediator(m) {}</p><pre class='brush:php;toolbar:false;'>virtual void send(const std::string& msg) {
mediator->sendMessage(msg, this);
}
virtual void receive(const std::string& msg) {
std::cout <
< name << " 收到消息: " << msg << "\n";
}
const std::string& getName() const { return name; }};
GemDesign
AI高保真原型设计工具
652
查看详情
// 具体中介者 - 聊天室
class ChatRoom : public ChatMediator {
private:
std::vector
public: void addUser(User* user) override { users.push_back(user); }
void sendMessage(const std::string& msg, User* sender) override {
for (auto* user : users) {
// 不发送给自己
if (user != sender) {
user->receive(msg);
}
}
}};
使用方式:
int main() {
ChatRoom room;
<pre class='brush:php;toolbar:false;'>User alice("Alice", &room);
User bob("Bob", &room);
User charlie("Charlie", &room);
room.addUser(&alice);
room.addUser(&bob);
room.addUser(&charlie);
alice.send("大家好!");
bob.send("Hi Alice!");
return 0;}
输出结果:
Bob 收到消息: 大家好! Charlie 收到消息: 大家好! Alice 收到消息: Hi Alice! Charlie 收到消息: Hi Alice!
优势与注意事项
中介者模式的优点在于:
- 减少子对象间的直接依赖,提升可维护性
- 集中控制交互逻辑,便于扩展和调试
- 新增同事类不影响已有逻辑,符合开闭原则
但也要注意:
- 中介者可能变得过于复杂,变成“上帝对象”
- 同事对象的行为被隐藏在中介者中,可能降低代码直观性
- 过度使用可能导致职责不清
基本上就这些。只要把握“让对象通过中间人交流”的核心思想,在 GUI 组件通信、游戏对象管理、线程间协调等多对多交互场景中都能有效应用。关键是把交互逻辑从个体剥离,集中到中介者中处理。不复杂但容易忽略的是生命周期管理——确保中介者和同事之间的引用不会导致内存泄漏,必要时可用智能指针优化。
以上就是c++++如何实现中介者设计模式_c++解耦多对多对象交互的详细内容,更多请关注其它相关文章!
# 边缘
# 哈尔滨seo按天收费
# 云南哪有网站建设推广
# 如何软件网站优化排名
# 百度优化网站策略
# 太原seo顾问公司
# 自贡seo排名收费标准
# 静安手机网站建设
# 品牌营销推广就找y火20星荐
# 网站推广目标规划方案
# 个人网站建设与制作
# 都能
# ai
# 是一个
# 的是
# 如何实现
# 集中控制
# 聊天室
# 大家好
# 多个
# 游戏开发
# stream
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
极兔快递快件信息查询系统 极兔快递官网运单号追踪
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
在VS Code中配置和运行Dart程序的完整步骤
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
Golang如何安装Swagger工具_GoSwagger文档生成环境
谷歌google账号注册详细步骤 谷歌账号注册官方教程
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
限制HTML日期输入框的日期选择范围
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
vivo云服务网页版登录 怎么登录vivo云服务网页版
如何仅使用CSS更改登录界面背景图像图标的颜色
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换
Golang指针如何与map组合使用_Golang map指针组合实践
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
抖音网页版怎么|直播|_抖音网页版开播操作指南
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
夸克AO3官网入口_AO3镜像网站2025推荐
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
微信客户端如何收红包_微信客户端接收红包使用教程
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
J*a应用程序首次运行自动创建文件与目录的最佳实践
AO3最新官网入口公告_2025AO3镜像站实时查询方法
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
J*aScript中管理异步API调用:确保操作顺序与数据一致性
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
抖音怎么赚钱_抖音创作者变现方法与途径指南
随机参数递归函数的基准调用次数与时间复杂度探究
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】
顺丰国际快递查询 国际件官方查询入口
J*aScript DOM操作:高效清空列表元素的策略与实践
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
网易大神账号申诉需要多久_网易大神账号申诉流程说明
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
使用J*aScript检测输入元素是否包含在特定类中
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达


2025-12-08
浏览次数:次
返回列表
< name << " 收到消息: " << msg << "\n";
}
const std::string& getName() const { return name; }