新闻中心

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

2025-12-08
浏览次数:
返回列表
中介者模式通过引入中介者对象封装多个对象间的交互逻辑,使对象间无需直接引用,从而降低耦合度。以聊天室系统为例,用户(同事)只与中介者通信,由中介者负责消息转发,实现解耦。核心角色包括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++ 


相关栏目: 【 科技资讯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在线漫画入口 漫蛙正版漫画网页版直达 

搜索