中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
github源码路径:https://github.com/dangwei-90/Design-Mode
// 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
// 参考大话设计模式 - 中介者模式
#include <iostream>
#include <vector>
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
using namespace std;
class Colleague;
// 中介接口 抽象类
class Mediator {
public:
virtual void Send(string str, Colleague* colleague) = 0;
};
// 响应接口 抽象类
class Colleague {
public:
virtual void Notify() = 0;
void SetMediator(Mediator* mediator) {
mediator_ = mediator;
}
protected:
Mediator* mediator_ = nullptr;
};
// 响应接口A
class ConcreteColleagueA : public Colleague{
public:
void SetMediatorA(Mediator* mediator) {
mediator_ = mediator;
}
void Send(string str) {
mediator_->Send(str, this);
}
void Notify() {
cout << "A get a msg" << endl;
}
};
// 响应接口B
class ConcreteColleagueB : public Colleague {
public:
void SetMediatorB(Mediator* mediator) {
mediator_ = mediator;
}
void Send(string str) {
mediator_->Send(str, this);
}
void Notify() {
cout << "B get a msg" << endl;
}
};
// 实现中介:A类 send to B类, B类 send to A类
class ConcreteMediator : public Mediator {
public:
void SetColleagueA(ConcreteColleagueA* colleague) {
colleague_a_ = colleague;
}
void SetColleagueB(ConcreteColleagueB* colleague) {
colleague_b_ = colleague;
}
void Send(string str, Colleague* colleague) {
cout << str << endl;
if (colleague == colleague_a_) {
colleague_b_->Notify();
}
else {
colleague_a_->Notify();
}
}
private:
ConcreteColleagueA* colleague_a_ = nullptr;
ConcreteColleagueB* colleague_b_ = nullptr;
};
int main()
{
ConcreteMediator* mediator = new ConcreteMediator();
ConcreteColleagueA* colleague_a = new ConcreteColleagueA();
ConcreteColleagueB* colleague_b = new ConcreteColleagueB();
colleague_a->SetMediator(mediator);
colleague_b->SetMediator(mediator);
mediator->SetColleagueA(colleague_a);
mediator->SetColleagueB(colleague_b);
colleague_a->Send("a , send a msg");
colleague_b->Send("b , send a msg");
SAFE_DELETE(colleague_a);
SAFE_DELETE(colleague_b);
SAFE_DELETE(mediator);
return 0;
}