中介者模式
简介
参考链接
中介者模式是一种行为设计模式,当一个项目中模块比较多的时候,如果模块之间交互很多,很复杂,可以考虑用中介者模式,每个模块都通过中介者进行交互,各个模块之间不会有耦合。实现了一种类与类之间的交互方式。
MVC 框架中,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
代码实现
#include <iostream>
class Mediator;
class IUser;
// 中介者接口类
class IMediator {
public:
virtual void transmit(const std::string &msg, IUser *user) = 0;
};
// 模块user抽象类
class IUser {
public:
IUser() {}
void send(const std::string &msg) {
mediator_->transmit(msg, this);
}
virtual void set_mediator(IMediator *mediator) {
mediator_ = mediator;
}
virtual void recv(const std::string &msg) = 0;
IMediator *mediator_ = nullptr;
};
// 具体user1
class User1: public IUser {
public:
User1() {}
virtual void recv(const std::string &msg) {
std::cout << "User1 recv msg: " << msg << std::endl;
}
};
// 具体user2
class User2: public IUser {
public:
User2() {}
virtual void recv(const std::string &msg) {
std::cout << "User2 recv msg: " << msg << std::endl;
}
};
// 具体中介者类
class Mediator: public IMediator {
public:
Mediator(IUser *user1, IUser *user2): user1_(user1), user2_(user2) {
user1_->set_mediator(this);
user2_->set_mediator(this);
}
// transmit 实现每个模块的交互
// user1->send==>user2->revv
// user2->send==>user1->revv
virtual void transmit(const std::string &msg, IUser *user) {
if (user == user1_) {
user2_->recv(msg);
} else if(user == user2_) {
user1_->recv(msg);
}
}
IUser *user1_ = nullptr;
IUser *user2_ = nullptr;
};
int main() {
IUser *user1 = new User1();
IUser *user2 = new User2();
IMediator *mediator = new Mediator(user1, user2);
user1->send("Hello");
user2->send("Hello");
user1->send("Hello");
user1->send("Hello");
delete user1;
delete user2;
delete mediator;
}
// 运行结果
/*
User2 recv msg: Hello
User1 recv msg: Hello
User2 recv msg: Hello
User2 recv msg: Hello
*/
上面的例子中,user1和user2两个模块通过中介者进行交互,user分别实现了send用来发送数据,recv来接受数据。它俩通过中介者进行通讯,在mediator类中,处理了两个模块的交互逻辑,在上面的例子中就是user1和user2之间互相发送接受消息。
优缺点
优点:
- 单一职责原则。你可以将多个组件间的交流抽取到同一位置, 使其更易于理解和维护。
- 开闭原则。 你无需修改实际组件就能增加新的中介者。
- 你可以减轻应用中多个组件间的耦合情况。
- 你可以更方便地复用各个组件。
缺点:
- 当组件越来越多是,中介者类会变得很复杂,会处理很多逻辑。