全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

c++如何实现中介者设计模式_c++解耦多对多对象交互

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

c++如何实现中介者设计模式_c++解耦多对多对象交互

在 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 GemDesign

AI高保真原型设计工具

GemDesign 652 查看详情 GemDesign

// 具体中介者 - 聊天室 class ChatRoom : public ChatMediator { private: std::vector users;

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小时内与您取得联系。