中介者模式,就是用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯示地相互引用讯柔,從而使其耦合松散抡蛙,而且可以獨(dú)立地改變它們之間的交互。
中介者模式結(jié)構(gòu)圖
image
中介者模式基本代碼
#include <iostream>
#include <string>
using namespace std;
class Colleague;
class Mediator {
public:
virtual void Send(string message, Colleague* colleague) = 0;
virtual ~Mediator() {}
};
class Colleague {
protected:
Mediator* mediator;
public:
Colleague(Mediator* m) { mediator = m; }
};
class ConcreteColleague1 : public Colleague {
public:
ConcreteColleague1(Mediator* m) : Colleague(m) {}
void Send(string message) {
mediator->Send(message, this);
}
void Notify(string message) {
cout << "ConcreteColleague1 received: " << message << endl;
}
};
class ConcreteColleague2 : public Colleague {
public:
ConcreteColleague2(Mediator* m) : Colleague(m) {}
void Send(string message) {
mediator->Send(message, this);
}
void Notify(string message) {
cout << "ConcreteColleague2 received: " << message << endl;
}
};
class ConcreteMediator : public Mediator {
private:
ConcreteColleague1* c1;
ConcreteColleague2* c2;
public:
void set(ConcreteColleague1* c) { c1 = c; }
void set(ConcreteColleague2* c) { c2 = c; }
void Send(string message, Colleague* colleague) {
if (colleague == c1) c2->Notify(message);
else c1->Notify(message);
}
};
int main() {
ConcreteMediator* m = new ConcreteMediator();
ConcreteColleague1* c1 = new ConcreteColleague1(m);
ConcreteColleague2* c2 = new ConcreteColleague2(m);
m->set(c1);
m->set(c2);
c1->Send("Hello"); // ConcreteColleague2 received: Hello
c2->Send("World"); // ConcreteColleague1 received: World
delete m;
delete c1;
delete c2;
return 0;
}
應(yīng)用場景
中介者模式一般用于一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通信的場合魂迄,以及想定制一個(gè)分布在多個(gè)類中的行為粗截,而又不想生成太多的子類的場合。
優(yōu)點(diǎn):
- Mediator減少了各個(gè)Colleague的耦合捣炬,使得可以獨(dú)立地完成改變和復(fù)用各個(gè)Colleague類和Mediator慈格;
- 由于把對(duì)象如何協(xié)作進(jìn)行了抽象,將中介作為一個(gè)獨(dú)立的概念并將其封裝在一個(gè)對(duì)象中遥金,這樣關(guān)注對(duì)象就從對(duì)象各自本身的行為轉(zhuǎn)移到它們之間的交互上來浴捆,也就是站在一個(gè)更宏觀的角度去看待系統(tǒng)。
缺點(diǎn):
- 由于ConcreteMediator控制了集中化稿械,于是就把交互復(fù)雜性變?yōu)榱酥薪檎叩膹?fù)雜性选泻,這就使得中介者變得比任何一個(gè)ConcreteColleague更復(fù)雜。