行为型模式-中介者模式
1 什么是中介者模式
中介模式是一种行为型设计模式,用于将对象之间的通信封装到一个中介者对象中,以减少对象之间的直接依赖和耦合度。通常情况下,一个系统中的对象需要和其他对象进行通信,如果直接依赖其他对象,会导致系统的可扩展性和可维护性变差。而中介模式使用中介者对象作为协调者,将对象之间的通信通过中介者进行处理,从而避免了对象之间的直接通信。
中介模式的关键角色包括:
- Mediator(中介者):定义了一个接口用于与各个同事对象进行通信,并提供了一个发送消息的方法。
- ConcreteMediator(具体中介者):实现中介者接口,协调各个同事对象之间的通信。通常会持有一个同事对象的集合,并负责将接收到的消息转发给其他同事对象。
- Colleague(同事):定义了一些公共方法,并维护了一个中介者的引用。
- ConcreteColleague(具体同事):实现同事接口,并实现自己的业务逻辑。在需要与其他同事通信时,通过中介者对象发送消息。
2 举个例子
下面以一个聊天室的例子来说明中介模式的用法。假设有一个简单的聊天室,其中有多个用户可以相互发送消息。
#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) : name(name) {}
void setMediator(ChatRoomMediator* mediator) {
this->mediator = mediator;
}
void sendMessage(const std::string& message) {
mediator->sendMessage("[" + name + "]: " + message, this);
}
void receiveMessage(const std::string& message) {
std::cout << message << std::endl;
}
};
// 具体中介者
class ChatRoomMediatorImpl : public ChatRoomMediator {
private:
std::vector<User*> users;
public:
void addUser(User* user) {
users.push_back(user);
}
virtual void sendMessage(const std::string& message, User* user) override {
for (auto u : users) {
if (u != user) {
u->receiveMessage(message);
}
}
}
};
int main() {
ChatRoomMediatorImpl chatRoom;
User user1("User1");
User user2("User2");
User user3("User3");
user1.setMediator(&chatRoom);
user2.setMediator(&chatRoom);
user3.setMediator(&chatRoom);
chatRoom.addUser(&user1);
chatRoom.addUser(&user2);
chatRoom.addUser(&user3);
user1.sendMessage("Hello, everyone!");
user2.sendMessage("Hi, User1!");
return 0;
}
在上述示例中,ChatRoomMediator 是中介者接口,User 是同事类。ChatRoomMediatorImpl 是具体中介者,负责管理用户并将消息转发给其他用户。当用户发送消息时,它们会通过中介者发送消息,由中介者将消息转发给其他用户。
当用户发送消息时,消息会包含发送者的用户名,最终在聊天室中的其他用户将收到该消息。通过使用中介者模式,用户之间不需要直接依赖彼此,而是通过中介者进行通信,实现了解耦。这样,当需要扩展聊天室并添加更多的用户时,只需将用户添加到中介者中即可,而不需要修改用户类的代码。
3 总结
中介者模式通过引入一个中心化的中介对象,来将一组对象之间的复杂交互转化为与中介对象的简单通信,从而解耦对象之间的依赖关系。
作者QQ:115124903,欢迎交流。
每一步踏出,都是一次探索,一次成长。
每一步踏出,都是一次探索,一次成长。