17、中介者模式(Mediater)
使用场景:
对象与对象之间存在大量的关联关系,导致它们之间的依赖关系结构混乱而且难以复用该对象,多个类相互耦合,形成了网状结构,将上述网状结构分离为星型结构。。例如,机场调度,mvc框架
优点:
a) 降低了类的复杂度,将一对多转化成了一对一,提高系统的灵活性,使得系统易于维护和扩展
b) 各个类之间的解耦,使得对象易于独立地被复用
c) 类之间各司其职,符合迪米特原则(最少知道原则)
缺点:
中介者会庞大臃肿,变得复杂难以维护
模式结构:
抽象中介者(Mediator):它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者(Concrete Mediator):实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
抽象同事类(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类(Concrete Colleague):是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
#include <iostream>
#include <vector>
using namespace std;
class Colleague;
// 抽象中介者
class Mediator {
public:
virtual void addColleague(Colleague *colleague) = 0;
virtual void relay(Colleague *cl) = 0; //转发
};
//抽象同事类
class Colleague {
public:
Mediator *mediator;
public:
void setMedium(Mediator *mediator) {
this->mediator = mediator;
}
public:
virtual void receive() = 0;
virtual void send() = 0;
};
// 具体中介者
class ConcreteMediator: public Mediator {
private:
vector<Colleague*> colleaguesVec;
public:
void addColleague(Colleague *colleague) {
colleaguesVec.push_back(colleague);
colleague->setMedium(this);
};
void relay(Colleague *cl) {
for (int i = 0; i < colleaguesVec.size(); i++) {
if (colleaguesVec[i]!= cl) {
colleaguesVec[i]->receive();
}
}
}
};
//具体同事类
class ConcreteColleague1: public Colleague {
public:
void receive() {
cout << "具体同事类1: 收到请求。" << endl;
};
void send() {
cout << "具体同事类1: 发出请求。" << endl;
mediator->relay(this); //请中介者转发
}
};
//具体同事类
class ConcreteColleague2: public Colleague {
public:
void receive() {
cout << "具体同事类2: 收到请求。" << endl;
};
void send() {
cout << "具体同事类2: 发出请求。" << endl;
mediator->relay(this); //请中介者转发
};
};
int main()
{
Mediator *md = new ConcreteMediator();
Colleague *c1, *c2;
c1 = new ConcreteColleague1();
c2 = new ConcreteColleague2();
md->addColleague(c1);
md->addColleague(c2);
c1->send();
cout << "----------" << endl;
c2->send();
return 0;
}
结果: