介紹
用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互岳掐,中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散烈和,而且可以獨(dú)立地改變它們之間的交互周拐。
參與者
- Mediator: 抽象中介者铡俐。定義了同事對(duì)象到中介者對(duì)象之間的接口。
- ConcreteMediator: 具體中介者速妖。實(shí)現(xiàn)抽象中介者的方法高蜂,它需要知道所有的具體同事類,同時(shí)需要從具體的同事類那里接收信息罕容,并且向具體的同事類發(fā)送信息。
- Colleague: 抽象同事類稿饰。
- ConcreteColleague: 具體同事類锦秒。每個(gè)具體同事類都只需要知道自己的行為即可,但是他們都需要認(rèn)識(shí)中介者喉镰。
實(shí)現(xiàn)代碼
enum{
Widget_A,
Widget_B,
};
class Widget;
class Meadiator{
public:
virtual void showMsg(std::string msg,Widget *meadiator) = 0;
};
class Widget{
public:
Widget(int id_,Meadiator *meadiator1)
{
id = id_;
meadiator = meadiator1;
}
virtual void showMe(std::string) = 0;
int getId()
{
return id;
}
public:
Meadiator *meadiator;
int id;
};
class WidgetA:public Widget{
public:
WidgetA(int id,Meadiator *meadiator1):Widget(id,meadiator1)
{
}
void showMe(std::string msg) override
{
std::cout<<"A: "<<msg<<std::endl;
}
void showMsg(std::string msg)
{
meadiator->showMsg(msg,this);
}
};
lass WidgetB:public Widget{
public:
WidgetB(int id,Meadiator *meadiator1):Widget(id,meadiator1)
{
}
void showMe(std::string msg) override
{
std::cout<<"B: "<<msg<<std::endl;
}
void showMsg(std::string msg)
{
meadiator->showMsg(msg,this);
}
};
class ConcreteMeadiator: public Meadiator{
public:
void SetWidgetA(WidgetA *widgetA1)
{
widgetA = widgetA1;
}
void SetWidgetB(WidgetB *widgetB1)
{
widgetB = widgetB1;
}
void showMsg(std::string msg,Widget *widget) override
{
if(widget->getId() == Widget_A)
{
widgetA->showMe(msg);
}else if(widget->getId() == Widget_B)
{
widgetB->showMe(msg);
}
}
private:
WidgetA *widgetA;
WidgetB *widgetB;
};
int main()
{
ConcreteMeadiator meadiator;
auto *widgetA = new WidgetA(Widget_A,&meadiator);
auto *widgetB = new WidgetB(Widget_B,&meadiator);
meadiator.SetWidgetA(widgetA);
meadiator.SetWidgetB(widgetB);
widgetA->showMsg("你好奥迷瘛!");
widgetB->showMsg("我很好侣姆!");
}
輸出結(jié)果
A: 你好吧妗沉噩!
B: 我很好!
特點(diǎn)
- 簡(jiǎn)化了對(duì)象之間的關(guān)系柱蟀,將系統(tǒng)的各個(gè)對(duì)象之間的相互關(guān)系進(jìn)行封裝川蒙,將各個(gè)同事類解耦,使系統(tǒng)成為松耦合系統(tǒng)长已。
- 減少了子類的生成畜眨。
- 可以減少各同事類的設(shè)計(jì)與實(shí)現(xiàn)。
- 由于中介者對(duì)象封裝了系統(tǒng)中對(duì)象之間的相互關(guān)系术瓮,導(dǎo)致其變得非常復(fù)雜康聂,使得系統(tǒng)維護(hù)比較困難。