要理解介者模式(Mediator Pattern),我们可以通过生活中的实际例子来进行讲解,这样更容易理解。
生活中的实际应用:机场的塔台
假设你在一个机场,飞机需要在起飞和降落时进行通信。如果没有中介者,那么每架飞机都需要与其他所有飞机进行直接通信,这会非常复杂且容易出错。
没有中介者的情况:
- 飞机A需要与飞机B、飞机C、飞机D等通讯。
- 飞机B同样需要与飞机A、飞机C、飞机D等通讯。
这样,每架飞机都需要维护与其他所有飞机的联系,管理变得非常复杂。
使用中介者模式的情况:塔台
为了简化这个问题,我们引入了一个中介者:塔台。所有的飞机都只需要与塔台通信,由塔台负责协调和管理所有飞机的通信。
使用中介者后的情况:
- 飞机A只需要向塔台报告自己的状态或请求。
- 塔台会根据飞机A的请求与其他飞机进行协调(例如通知飞机B调整路径)。
这样,任何飞机都不需要知道其他飞机的存在,只需要与塔台通信。这大大简化了各飞机之间的联系,降低了耦合度。
在C++中的实现
下面是一个简单的C++代码示例,用于展示介者模式如何在软件开发中实现:
#include <iostream>
#include <vector>
#include <string>
// 中介者类
class ControlTower {
public:
void registerAirplane(class Airplane* airplane) {
airplanes.push_back(airplane);
}
void sendMessage(const std::string& message, Airplane* sender);
private:
std::vector<class Airplane*> airplanes;
};
// 飞机类
class Airplane {
public:
Airplane(const std::string& name, ControlTower* controlTower)
: name(name), controlTower(controlTower) {
controlTower->registerAirplane(this);
}
void send(const std::string& message) {
controlTower->sendMessage(message, this);
}
void receive(const std::string& message) {
std::cout << name << " received: " << message << std::endl;
}
private:
std::string name;
ControlTower* controlTower;
};
// 中介者方法的实现
void ControlTower::sendMessage(const std::string& message, Airplane* sender) {
for (auto airplane : airplanes) {
// 不发送消息给自己
if (airplane != sender) {
airplane->receive(message);
}
}
}
int main() {
ControlTower* controlTower = new ControlTower();
Airplane* plane1 = new Airplane("Plane1", controlTower);
Airplane* plane2 = new Airplane("Plane2", controlTower);
Airplane* plane3 = new Airplane("Plane3", controlTower);
plane1->send("request to take off");
plane2->send("request to land");
delete plane1;
delete plane2;
delete plane3;
delete controlTower;
return 0;
}
解释
- ControlTower(控制塔):这是中介者类,它维护一个飞机列表,并负责转发消息。
- Airplane(飞机):各飞机类与控制塔通信,而不是与其他飞机直接通信。
- sendMessage 方法:当某个飞机发送消息时,控制塔负责传递消息给其他所有飞机。
通过这个示例,我们可以看到,使用中介者可以非常大简化对象间的通信和互动,使得系统更加容易维护和扩展。