中介者模式的含义
中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介对象来简化多个对象间的复杂通信和控制逻辑。中介者模式中的中介者承担了组件间交互的协调职责,使得各个组件无需直接通信。
核心思想及解释
中介者模式的核心思想是通过一个中介对象封装一系列对象之间的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,可以独立地改变它们之间的交互。中介者承担了协调多个对象间复杂交互的职责,对象只需知道中介者而无需知道其他同事对象。
为什么要使用中介者模式
- 降低类之间的耦合度:通过将对象之间的交互封装到中介者中,各个对象无需知道对方的实现细节。
- 集中控制交互逻辑:交互的管理和协调被集中到一个中介者对象中,使得系统易于理解和维护。
- 更易于修改和扩展交互:中介者将系统中对象间的通信封装起来,增加新的中介者或修改现有中介者都较为方便,不需要修改实际对象。
使用中介者模式需要注意的点
- 中介者的复杂性:随着系统的扩展,中介者可能会变得非常复杂,聚集过多的逻辑。
- 过度集中化:如果过多地使用中介者,可能导致中介者成为一个超级对象,难以维护。
- 性能问题:所有的对象间交互都需要经过中介者,可能会引入性能瓶颈。
工程的应用场景
- 用户界面中的组件通信:例如,MVC 架构中,控制器作为中介者,协调视图和模型之间的交互。
- 聊天室:聊天室服务器作为中介者,管理用户之间的消息传递。
- 航空交通控制系统:控制塔作为中介者,协调多架飞机的起降和空中交通。
示例代码及解释
假设我们正在开发一个简单的聊天室系统,其中ChatRoom
充当中介者的角色,协调用户之间的消息传递。
定义中介者接口和具体中介者:
#include <iostream>
#include <string>
#include <map>
class User;
// 中介者接口
class ChatMediator
{
public:
virtual void sendMessage(const std::string& message, User* user) = 0;
virtual void addUser(User* user) = 0;
virtual ~ChatMediator() {}
};
// 具体中介者
class ChatRoom : public ChatMediator
{
std::map<std::string, User*> users;
public:
void addUser(User* user) override;
void sendMessage(const std::string& message, User* user) override;
};
// 同事类
class User
{
std::string name;
ChatMediator* mediator;
public:
User(const std::string& name, ChatMediator* med) : name(name), mediator(med)
{
mediator->addUser(this);
}
void send(const std::string& message)
{
std::cout << this->name << " sends: " << message << std::endl;
mediator->sendMessage(message, this);
}
void receive(const std::string& message)
{
std::cout << this->name << " receives: " << message << std::endl;
}
std::string getName() const { return name; }
};
void ChatRoom::addUser(User* user)
{
users[user->getName()] = user;
}
void ChatRoom::sendMessage(const std::string& message, User* user)
{
for (auto u : users)
{
if (u.second != user)
{ // do not send message to self
u.second->receive(message);
}
}
}
客户端代码:
int main()
{
ChatRoom room;
User user1("Alice", &room);
User user2("Bob", &room);
user1.send("Hi Bob!");
user2.send("Hey Alice!");
return 0;
}
输出代码运行结果
Alice sends: Hi Bob!
Bob receives: Hi Bob!
Bob sends: Hey Alice!
Alice receives: Hey Alice!
这个示例演示了中介者模式在聊天室应用中的使用。ChatRoom
类作为中介者,负责协调用户之间的消息传递,每当一个用户发送消息时,ChatRoom
负责将消息转发给其他所有用户。这样,用户类不直接与其他用户通信,而是通过中介者进行,符合中介者模式的定义。