跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 中介者模式
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目适用于C++程序员学习设计模式中的**中介者模式**(Mediator Pattern),内容涵盖基础概念、实现方法及实际应用案例。}} == 概述 == '''中介者模式'''是一种行为设计模式,旨在通过引入一个中介对象来封装一组对象之间的交互,从而减少对象间的直接耦合。该模式符合[[迪米特法则]](Law of Demeter),即“最少知识原则”,通过集中控制逻辑来简化系统的维护和扩展。 === 核心思想 === * 将多对多的对象交互转化为一对多的交互。 * 中介者作为协调者,处理对象间的通信。 * 对象仅需与中介者交互,无需直接引用其他对象。 == 结构 == <mermaid> classDiagram class Mediator { +notify(sender: Colleague, event: string): void } class Colleague { -mediator: Mediator +Colleague(mediator: Mediator) +send(event: string): void +receive(event: string): void } class ConcreteMediator { -colleague1: Colleague -colleague2: Colleague +notify(sender: Colleague, event: string): void } class ConcreteColleague1 { +send(event: string): void +receive(event: string): void } class ConcreteColleague2 { +send(event: string): void +receive(event: string): void } Mediator <|-- ConcreteMediator Colleague <|-- ConcreteColleague1 Colleague <|-- ConcreteColleague2 Colleague o-- Mediator ConcreteMediator --> ConcreteColleague1 ConcreteMediator --> ConcreteColleague2 </mermaid> === 角色说明 === * '''Mediator(抽象中介者)''':定义通信接口。 * '''ConcreteMediator(具体中介者)''':实现协调逻辑。 * '''Colleague(同事类)''':对象基类,持有中介者引用。 * '''ConcreteColleague(具体同事类)''':实现自身行为,通过中介者传递消息。 == C++实现示例 == 以下是一个简单的聊天室系统示例,其中中介者协调用户之间的消息传递: <syntaxhighlight lang="cpp"> #include <iostream> #include <string> #include <vector> // 前置声明 class User; // 抽象中介者 class ChatRoomMediator { public: virtual void sendMessage(const std::string& message, User* user) = 0; }; // 同事类 class User { protected: ChatRoomMediator* mediator; std::string name; public: User(const std::string& name, ChatRoomMediator* mediator) : name(name), mediator(mediator) {} virtual void send(const std::string& message) { mediator->sendMessage(message, this); } virtual void receive(const std::string& message) { std::cout << name << " received: " << message << std::endl; } }; // 具体中介者 class ConcreteChatRoom : public ChatRoomMediator { private: std::vector<User*> users; public: void addUser(User* user) { users.push_back(user); } void sendMessage(const std::string& message, User* sender) override { for (User* user : users) { if (user != sender) { user->receive(message); } } } }; // 使用示例 int main() { ConcreteChatRoom chatRoom; User alice("Alice", &chatRoom); User bob("Bob", &chatRoom); chatRoom.addUser(&alice); chatRoom.addUser(&bob); alice.send("Hi Bob!"); // 输出: Bob received: Hi Bob! bob.send("Hello Alice!"); // 输出: Alice received: Hello Alice! } </syntaxhighlight> === 代码解析 === 1. 用户(`User`)通过中介者(`ConcreteChatRoom`)发送消息。 2. 中介者遍历所有用户(除发送者外)并调用其`receive`方法。 3. 输出显示消息的正确路由。 == 实际应用场景 == 中介者模式常见于以下场景: * '''GUI组件交互''':如对话框中的按钮、输入框通过中介者协调。 * '''游戏开发''':角色、道具通过游戏管理器通信。 * '''微服务架构''':服务间通过API网关解耦。 === 案例:飞机塔台调度 === <mermaid> flowchart TD A[飞机A] -->|请求降落| B(塔台中介者) B -->|分配跑道| C[跑道1] D[飞机B] -->|请求起飞| B B -->|授权起飞| D </mermaid> == 优缺点 == {{Pros| * '''降低耦合度''':对象间无需直接引用。 * '''简化维护''':交互逻辑集中在中介者中。 * '''复用性增强''':同事类可独立变化。 }} {{Cons| * '''中介者可能复杂''':随着交互逻辑增加,中介者会变得庞大。 * '''性能开销''':间接通信可能引入延迟。 }} == 进阶主题 == * 结合[[观察者模式]]实现动态事件处理。 * 使用[[单例模式]]确保全局唯一中介者。 == 总结 == 中介者模式通过封装对象交互,提供了一种清晰的解耦方案。在C++中,可通过抽象接口和指针机制灵活实现该模式。开发者应根据系统复杂度权衡是否引入中介者,避免过度设计。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 设计模式]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Cons
(
编辑
)
模板:Note
(
编辑
)
模板:Pros
(
编辑
)