中介者(Mediator),用一箇中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。【DP】
UML:
源碼:
// Mediator.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Country;
//聯合國機構
class UnitedNations
{
public:
virtual void Declare(string message, Country *colleague) = 0;
};
//國家
class Country
{
protected:
UnitedNations *mediator;
public:
Country(UnitedNations *mediator)
{
this->mediator = mediator;
}
virtual void Declarep(string message){};
};
//美國
class USA : public Country
{
public:
USA(UnitedNations *mediator)
: Country(mediator)
{
}
//聲明
public:
void Declare(string message)
{
mediator->Declare(message, this);
}
//獲得消息
void GetMessage(string message)
{
cout << "美國獲得對方信息:" << message << endl;
}
};
//伊拉克
class Iraq : public Country
{
public:
Iraq(UnitedNations *mediator)
: Country(mediator)
{
}
//聲明
public:
void Declare(string message)
{
mediator->Declare(message, this);
}
//獲得消息
void GetMessage(string message)
{
cout << "伊拉克獲得對方信息:" << message << endl;
}
};
//聯合國安全理事會
class UnitedNationsSecurityCouncil : public UnitedNations
{
public:
USA *colleague1;
Iraq *colleague2;
public:
void Declare(string message, Country *colleague)
{
USA *p = dynamic_cast<USA*>(colleague);
if (p)
{
colleague2->GetMessage(message);
}
else
{
colleague1->GetMessage(message);
}
}
};
int _tmain(int argc, _TCHAR* argv[])
{
UnitedNationsSecurityCouncil *UNSC = new UnitedNationsSecurityCouncil();
USA *c1 = new USA(UNSC);
Iraq *c2 = new Iraq(UNSC);
UNSC->colleague1 = c1;
UNSC->colleague2 = c2;
c1->Declare("不準研製核武器,否則要發動戰爭!");
c2->Declare("我們沒有核武器,也不怕侵略。");
return 0;
}
輸出:
上例中,引入了《大話設計模式》的例子,由於國家非常多,這些國家相當於獨立的但是關係複雜的類,可以通過聯合國這個中介來解決,比如美國和伊拉克有發生戰爭的危機,就需要通過聯合國的安理會來解決。
優點:
1.Mediator的出現減少了各個Colleague的耦合,使得可以獨立地改變和複用各個Colleague類和Mediator
2.由於把對象如何協作進行了抽象,將中介作爲一個獨立的概念並將其封裝在一個對象中,這樣關注的對象就從對象各自本身的行爲轉移到它們之間的交互上來,也就是站在一個更宏觀的角度去看待系統。
缺點:
1.由於concretemediator控制了集中化,於是就把交互複雜性變爲了中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜。
應用場景:
中介者模式一般應用於一組對象時以定義良好但是複雜的方式進行通信的場合,以及想定製一個分佈在多個類中的行爲,而又不想生成太多的子類的場合。