一、概述
中介者模式用一箇中介對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使其鬆耦合,而且可以獨立地改變它們之間的交互。
二、類圖
Colleague是抽象同事類。
而ConcreteColleague是具體同事類,每個具體同事類只知道自己的行爲,而不瞭解其他同事的情況,但它們卻都認識中介者對象,通過中介者角色來和其他同事角色進行通信協作。
Mediator是抽象中介者,定義了同事對象到中介者對象的接口,用於各同事角色間的通信。
ConcreteMediator是具體中介者對象,實現抽象類的方法,它需要知道所有具體同事類,並從具體同事接收消息,向具體同事對象發出命令。
三、示例
class Mediator
{
public:
void Send(string sMessage,Colleague* pSender);
};
class ConcreteMediator : Mediator
{
public:
void SetColleague1(ConcreteColleague1* pColleague1);
void SetColleague2(ConcreteColleague2* pColleague2);
void Send(string sMessage,Colleague* pSender)
{
if(pSender == m_pColleague1)
{
m_pColleague2->Notify(sMessage);
}
else
{
m_pColleague1->Notify(sMessage);
}
}
private:
//這裏需要了解具體的同事類對象而不是抽象同事類對象
ConcreteColleague1* m_pColleague1;
ConcreteColleague2* m_pColleague2;
};
class Colleague
{
public:
Colleague(Mediator* pMediator)
{
m_pMediator = pMediator;
}
private:
Mediator* m_pMediator;
};
class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1(Mediator* pMediator)
:Colleague(pMediator)
{
}
void Send(string sMessage)
{
m_pMediator.Send(sMessage,this);
}
void Notify(string sMessage)
{
cout<<"ConcreteColleague1 receive message:"<<sMessage<<endl;
}
};
class ConcreteColleague2 : public Colleague
{
public:
ConcreteColleague2(Mediator* pMediator)
:Colleague(pMediator)
{
}
void Send(string sMessage)
{
m_pMediator.Send(sMessage,this);
}
void Notify(string sMessage)
{
cout<<"ConcreteColleague2 receive message:"<<sMessage<<endl;
}
};
void main()
{
ConcreteMediator* pMediator = new ConcreteMediator();
ConcreteColleague1* pColleague1 = new ConcreteColleague1(pMediator);
ConcreteColleague2* pColleague2 = new ConcreteColleague2(pMediator);
pMediator->SetColleague1(pColleague1);
pMediator->SetColleague2(pColleague2);
pColleague1->Send("有人在嗎");
pColleague2->Send("我在呢");
}
四、優缺點
中介模式的優點是減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,同事類只依賴中介者,降低了類間的耦合。
中介模式的缺點就是中介者會膨脹得很大,邏輯複雜。
五、中介者模式和外觀模式
外觀模式是對一個對象子系統進行抽象,提供一個統一的接口,它的協議是單向的,即facade對象對這個子系統提出請求,單反之則不行。相反,Mediator提供了各Colleague對象不能支持的協作行爲,而且協議是多向的。