設計模式-中介者模式Mediator(對象行爲型)

一、概述

中介者模式用一箇中介對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而使其鬆耦合,而且可以獨立地改變它們之間的交互。

二、類圖

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對象不能支持的協作行爲,而且協議是多向的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章