C++ 中介者模式
外观
概述[编辑 | 编辑源代码]
中介者模式是一种行为设计模式,旨在通过引入一个中介对象来封装一组对象之间的交互,从而减少对象间的直接耦合。该模式符合迪米特法则(Law of Demeter),即“最少知识原则”,通过集中控制逻辑来简化系统的维护和扩展。
核心思想[编辑 | 编辑源代码]
- 将多对多的对象交互转化为一对多的交互。
- 中介者作为协调者,处理对象间的通信。
- 对象仅需与中介者交互,无需直接引用其他对象。
结构[编辑 | 编辑源代码]
角色说明[编辑 | 编辑源代码]
- Mediator(抽象中介者):定义通信接口。
- ConcreteMediator(具体中介者):实现协调逻辑。
- Colleague(同事类):对象基类,持有中介者引用。
- ConcreteColleague(具体同事类):实现自身行为,通过中介者传递消息。
C++实现示例[编辑 | 编辑源代码]
以下是一个简单的聊天室系统示例,其中中介者协调用户之间的消息传递:
#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!
}
代码解析[编辑 | 编辑源代码]
1. 用户(`User`)通过中介者(`ConcreteChatRoom`)发送消息。 2. 中介者遍历所有用户(除发送者外)并调用其`receive`方法。 3. 输出显示消息的正确路由。
实际应用场景[编辑 | 编辑源代码]
中介者模式常见于以下场景:
- GUI组件交互:如对话框中的按钮、输入框通过中介者协调。
- 游戏开发:角色、道具通过游戏管理器通信。
- 微服务架构:服务间通过API网关解耦。
案例:飞机塔台调度[编辑 | 编辑源代码]
优缺点[编辑 | 编辑源代码]
进阶主题[编辑 | 编辑源代码]
总结[编辑 | 编辑源代码]
中介者模式通过封装对象交互,提供了一种清晰的解耦方案。在C++中,可通过抽象接口和指针机制灵活实现该模式。开发者应根据系统复杂度权衡是否引入中介者,避免过度设计。