新闻中心

C++怎么实现一个中介者模式_C++设计模式与中介者模式实现

2025-11-22
浏览次数:
返回列表
中介者模式通过引入中介者对象封装多个同事类之间的交互,实现松耦合。在C++中,定义Mediator接口和Colleague类,同事通过持有中介者指针进行通信,而非直接引用彼此。以聊天室为例,User类通过ChatRoom发送消息,ChatRoom负责转发给其他用户,避免了用户间的直接依赖。该模式降低了对象间的复杂耦合,提升可维护性和扩展性,适用于GUI组件、游戏系统等多对象交互场景,但需注意控制中介者职责,防止其过度膨胀为“上帝对象”。

c++怎么实现一个中介者模式_c++设计模式与中介者模式实现

中介者模式(Mediator Pattern)是一种行为型设计模式,用来降低多个对象之间复杂的直接交互。它通过引入一个中介者对象来封装一系列对象之间的交互,使得对象之间不需要显式地相互引用,从而实现松耦合。

在C++中实现中介者模式,核心是定义一个中介者接口,让各个“同事类”(Colleague)持有对中介者的引用,并通过中介者进行通信,而不是彼此直接调用。

中介者模式的结构

典型的中介者模式包含以下几个角色:

  • Mediator(中介者):定义同事对象之间交互的接口。
  • ConcreteMediator(具体中介者):实现中介者接口,协调各个同事对象之间的交互。
  • Colleague(同事):每个同事类都知道中介者对象,并通过中介者与其他同事通信。

C++ 实现示例:聊天室场景

我们以一个简单的聊天室为例:多个用户(User)通过聊天室(ChatRoom,作为中介者)发送消息,而不是直接发给其他用户。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
<p>// 前向声明
class User;</p><p>// 抽象中介者
class ChatMediator {
public:
virtual void sendMessage(const std::string& message, const User<em> sender) = 0;
virtual void addUser(User</em> user) = 0;
};</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& message) {
    mediator->sendMessage(message, this);
}

virtual void receive(const std::string& message) {
    std::cout << name << " 收到消息: " << message << "\n";
}

const std::string& getName() const { return name; }

};

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

public: void addUser(User* user) override { users.push_back(user); }

void sendMessage(const std::string& message, const User* sender) override {
    std::string formattedMsg = "[" + sender->getName() + "]: " + message;
    for (User* user : users) {
        if (user != sender) { // 不发给自己
            user->receive(formattedMsg);
        }
    }
}

};

使用示例

下面是一个简单的测试代码,展示三个用户在同一个聊天室中通信:

商易多用户商城 商易多用户商城

功能介绍:1. 商品出售包含拍卖模式,一口价模式。2. 全套系统采用淘宝网风格,成熟,简洁大方3. 每个商品支持多张图片上传,可自由设定,满足广大网民的迫切要求4. 商品信息支持 ubb,图文并茂5. 注册用户可参与竞拍,或者拍卖自己的商品6. 拥有会员注册,交易提醒,成交商品确认等邮件发送功能7. 拥有交易双方信用评价的功能,使得交易安全可*,可信度高8. 拥有安全稳定的用户虚拟币平台,可实现商

商易多用户商城 0 查看详情 商易多用户商城

int main() {
    ChatRoom chatRoom;
<pre class='brush:php;toolbar:false;'>User alice("Alice", &chatRoom);
User bob("Bob", &chatRoom);
User charlie("Charlie", &chatRoom);

chatRoom.addUser(&alice);
chatRoom.addUser(&bob);
chatRoom.addUser(&charlie);

alice.send("大家好!");
bob.send("Hi Alice!");
charlie.send("我也来啦~");

return 0;

}

输出结果:

[Alice]: 大家好!
[Bob]: Hi Alice!
[Charlie]: 我也来啦~

关键点与优势

这个实现展示了中介者模式的核心思想:

  • 用户之间不直接通信,所有消息都通过 ChatRoom 转发。
  • 新增用户或修改通信逻辑只需改动中介者,不影响现有用户类。
  • 降低了类之间的依赖关系,提高了系统的可维护性和扩展性。

适用于多个对象之间存在复杂交互的场景,如GUI组件通信、多玩家游戏中的消息广播等。

基本上就这些。中介者模式在C++中通过指针和虚函数很容易实现,关键是设计好中介者的职责边界,避免它变成一个臃肿的“上帝对象”。

以上就是C++怎么实现一个中介者模式_C++设计模式与中介者模式实现的详细内容,更多请关注其它相关文章!


# 为例  # 搜索网站建设方案  # 宁波集采网站构建建设  # 全网霸屏系统seo推广  # 正规营销推广诚信推荐  # adwords和seo哪个好用  # 江西茶叶营销策划推广  # 物流网站建设教学  # 于洪区媒体网站建设概况  # 公益网站建设美丽  # 网络营销推广呢  # 何为  # 尼克  # go  # 大家好  # 适用于  # 我也  # 都是  # 多用户  # 聊天室  # 多个  # stream  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AO3镜像入口大全 AO3网页版内容访问全集  解决Django多数据库/多Schema环境下外键迁移问题  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  抖音创作助手登录入口_抖音创作辅助工具官网直达  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  绝地鸭卫平a核爆刀流玩法攻略  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  C++如何解决segmentation fault_C++段错误调试与原因分析  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  2025-2030年全球乘用车销量预测:新能源成增长主力  Python自定义类排序:解决lambda键值访问TypeError的实践指南  动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  12306怎么选座位选到安静区_12306选座安静区域选择策略  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  内存检查:在VS Code中调试C++时的内存视图  12306选座系统怎么选连座_12306选座多人连坐操作方法  steam官方网页快速访问 steam账号注册全流程  小红书网页版入口链接分享 小红书官网直接进  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  J*aScript教程:根据元素文本内容动态设置背景色  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  C#中解析不规范的HTML为XML 常见的坑与解决办法  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  解决Bootstrap卡片顶部边距导致背景图下移的问题  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  铁路12306的积分有效期是多久_铁路12306积分有效期说明  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  顺丰快递查询系统 官方正版查询入口  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】 

搜索