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

中介者模式(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
public: void addUser(User* user) override { users.push_back(user); }
void sendMessage(const std::string& message, const User* sender) override {
std::string formattedMsg = "[" + sender->g
etName() + "]: " + 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置顶客服对话【优先查看】


2025-11-22
浏览次数:次
返回列表
etName() + "]: " + message;
for (User* user : users) {
if (user != sender) { // 不发给自己
user->receive(formattedMsg);
}
}
}