接口隔离_Mediator
目录
接口隔离
在组件构建过程中,某些接口之间直接的依颖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式
- Facade
- Proxy
- Adapter
- Mediator
1 Mediator
1.1 模式动机
在软件构建过程中,经常会出现多个对象互相关联交互的情况, 对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。
在这种情况工,我们可使用一个"中介对象"来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
1.2 模式定义
用一个中介对象来封装(封装变化)一系列的对象交互。 中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互。
1.3 模式示例代码
# include <iostream>
# include <string>
# include <vector>
// 中介者接口:聊天室中介者
class ChatRoomMediator {
public:
virtual void sendMessage(const std::string& message, const std::string& sender) = 0;
virtual void addUser(const std::string& user) = 0;
};
// 具体中介者类:聊天室
class ChatRoom : public ChatRoomMediator {
public:
void sendMessage(const std::string& message, const std::string& sender) {
for (auto user : users) {
if (user != sender) {
receiveMessage(message, user);
}
}
}
void addUser(const std::string& user) {
users.push_back(user);
}
private:
void receiveMessage(const std::string& message, const std::string& receiver) {
std::cout << "接收到来自用户 " << receiver << " 的消息:" << message << std::endl;
}
std::vector<std::string> users;
};
// 抽象同事类:聊天室用户
class ChatRoomUser {
public:
ChatRoomUser(const std::string& name, ChatRoomMediator* mediator) : name(name), mediator(mediator) {}
virtual void sendMessage(const std::string& message) = 0;
virtual void receiveMessage(const std::string& message) = 0;
protected:
std::string name;
ChatRoomMediator* mediator;
};
// 具体同事类:聊天室普通用户
class OrdinaryUser : public ChatRoomUser {
public:
OrdinaryUser(const std::string& name, ChatRoomMediator* mediator) : ChatRoomUser(name, mediator) {}
void sendMessage(const std::string& message) {
mediator->sendMessage(message, name);
}
void receiveMessage(const std::string& message) {
std::cout << name << " 收到消息:" << message << std::endl;
}
};
int main() {
// 创建聊天室中介者
ChatRoomMediator* chatRoom = new ChatRoom();
// 创建聊天室用户
ChatRoomUser* user1 = new OrdinaryUser("User1", chatRoom);
ChatRoomUser* user2 = new OrdinaryUser("User2", chatRoom);
ChatRoomUser* user3 = new OrdinaryUser("User3", chatRoom);
// 添加用户到聊天室
chatRoom->addUser(user1->name);
chatRoom->addUser(user2->name);
chatRoom->addUser(user3->name);
// 用户发送消息
user1->sendMessage("大家好!");
user2->sendMessage("欢迎加入聊天室!");
user3->sendMessage("谢谢!");
// 释放内存(可选)
delete chatRoom;
delete user1;
delete user2;
delete user3;
return 0;
}
2 要点总结
将多个对象间复杂的关联关系解耦,Mediator 模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。
随着控制逻辑的复杂化,Mediator 具体对象的实现可能相当复杂。
这时候可以对 Mediator 对象进行分解处理。
Facade 模式是解耦系统间(单向)的对象关联关系;Mediator 模式是解耦系统内各个对象之间(双向)的关联关系。