中介者模式通过引入中介者对象封装多个对象间的交互逻辑,使对象间无需直接引用,从而降低耦合度。以聊天室系统为例,用户(同事)只与中介者通信,由中介者负责消息转发,实现解耦。核心角色包括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++
相关文章:
免费抖音短视频入口_抖音网页版短视频免费通道
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
WooCommerce 购物车显示所有交叉销售商品教程
解决Django多数据库/多Schema环境下外键迁移问题
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
Angular中单选按钮的正确使用与常见陷阱解析
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
浏览器打开即用 美图秀秀网页版入口
J*aScript类型检查_j*ascript代码规范
PHP:根据嵌套关联数组项值动态添加新键值对
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
PDF文件体积过大处理_PDF压缩技巧详解
解决移动端滚动问题的overflow属性应用指南
Lar*el Form Request 中唯一性验证更新操作的正确实践
三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
Python getattr() 异常处理深度解析:避免程序意外退出
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
J*aScript中针对特定容器内图片动画的实现教程
深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量
Golang如何使用context实现超时取消_Golang context超时取消模式实践
狙击外星人小游戏开始_狙击外星人小游戏立即开始
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
零跑汽车11月交付量达70327台 实现连续9个月正增长
HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
PHP基于会话的用户类型页面访问控制指南
AO3最新可访问网址 Archive of Our Own官方在线入口
解决Flask中Quill编辑器内容提交失败及TypeError的指南
深入理解J*a链表中的IPosition接口与使用
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
自动化J*a应用中GitHub CLI或REST API的认证与交互
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
win11跳过OOBE三种方法 Win11跳过OOBE设置步骤
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题
必由学在线入口 必由学网页版快速登录入口
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
VS Code远程开发时如何处理文件权限问题
菜鸟取件码是什么怎么查 最全查询渠道汇总
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
composer的"require-dev"部分是用来做什么的?
AO3同人作品网入口 AO3搜索引擎官网永久地址
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
*请认真填写需求信息,我们会在24小时内与您取得联系。