程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 設計模式C++描述----18.中介者(Mediator)模式

設計模式C++描述----18.中介者(Mediator)模式

編輯:C++入門知識

一. 舉例

比如,現在中圖和日本在關於釣魚島問題上存在爭端。這時,聯合國就會站出來,做為調解者,其實也沒什麼好調解的,釣魚島本來就是中國的,這是不爭的事實!聯合國也就是個傳話者、發言人。

結構圖如下:

\

代碼如下:
[cpp] //抽象國家  
class Country   

protected:   
    Mediator *m_mediator; //中介  
public: 
    virtual void SetMediator(Mediator *mediator){} //設置中介  
    virtual void SendMessage(string message) {}    //向中介發信息  
    virtual void GetMessage(string message) {}     //從中介獲取信息  
}; 
 
//抽象中介者  
class Mediator   

public:   
    virtual void Send(string message, Country *person) {}   
    virtual void SetJanpa(Country *Janpa) {}  //讓中介認識具體的對象  
    virtual void SetChina(Country *China) {}   
}; 
 
//日本  
class Janpa: public Country   
{   
public:   
    void SetMediator(Mediator *mediator) { m_mediator = mediator; }   
    void SendMessage(string message) { m_mediator->Send(message, this); }   
    void GetMessage(string message) { cout<<"日本收到信息: "<<message; }   
}; 
 
//中國  
class China: public Country   
{   
public:   
    void SetMediator(Mediator *mediator) { m_mediator = mediator; }   
    void SendMessage(string message) { m_mediator->Send(message, this); }   
    void GetMessage(string message) { cout<<"中國收到信息: "<<message; }   
}; 
 
//聯合國  
class UN : public Mediator   
{   
private:   
    Country *m_Janpa; //日本  
    Country *m_China; //中國  
public:   
    UN(): m_Janpa(NULL), m_China(NULL) {}   
    void SetJanpa(Country *Janpa) { m_Janpa = Janpa; }   
    void SetChina(Country *China) { m_China = China; }   
    void Send(string message, Country *country)    
    {   
        if(country == m_Janpa) //日本給中圖發信息  
            m_China->GetMessage(message); //中國收到信息  
        else   
            m_Janpa->GetMessage(message);   
    } 
}; 
 
//測試代碼  
int main()   
{      
    Mediator *mediator = new UN();   
    Country *pJanpa = new Janpa();    //日本  
    Country *pChina = new China();  //中國  
     
    mediator->SetJanpa(Janpa);   
    mediator->SetChina(China);   
     
    pJanpa->SetMediator(mediator);   
    pChina->SetMediator(mediator);   
     
    pJanpa->SendMessage("釣魚島是我們的,哈哈哈...\n");   
    pChina->SendMessage("操,你他媽再亂放屁,小心我弄死你!\n");   
     
    delete pJanpa;  
    delete pChina;  
    delete mediator;   
     
    return 0;   

//抽象國家
class Country 
{
protected: 
 Mediator *m_mediator; //中介
public:
 virtual void SetMediator(Mediator *mediator){} //設置中介
 virtual void SendMessage(string message) {}    //向中介發信息
 virtual void GetMessage(string message) {}     //從中介獲取信息
};

//抽象中介者
class Mediator 
{
public: 
 virtual void Send(string message, Country *person) {} 
 virtual void SetJanpa(Country *Janpa) {}  //讓中介認識具體的對象
 virtual void SetChina(Country *China) {} 
};

//日本
class Janpa: public Country 

public: 
 void SetMediator(Mediator *mediator) { m_mediator = mediator; } 
 void SendMessage(string message) { m_mediator->Send(message, this); } 
 void GetMessage(string message) { cout<<"日本收到信息: "<<message; } 
};

//中國
class China: public Country 

public: 
 void SetMediator(Mediator *mediator) { m_mediator = mediator; } 
 void SendMessage(string message) { m_mediator->Send(message, this); } 
 void GetMessage(string message) { cout<<"中國收到信息: "<<message; } 
};

//聯合國
class UN : public Mediator 

private: 
 Country *m_Janpa; //日本
 Country *m_China; //中國
public: 
 UN(): m_Janpa(NULL), m_China(NULL) {} 
 void SetJanpa(Country *Janpa) { m_Janpa = Janpa; } 
 void SetChina(Country *China) { m_China = China; } 
 void Send(string message, Country *country)  
 { 
  if(country == m_Janpa) //日本給中圖發信息
   m_China->GetMessage(message); //中國收到信息
  else 
   m_Janpa->GetMessage(message); 
 }
};

//測試代碼
int main() 
{    
 Mediator *mediator = new UN(); 
 Country *pJanpa = new Janpa();    //日本
 Country *pChina = new China();  //中國
 
 mediator->SetJanpa(Janpa); 
 mediator->SetChina(China); 
 
 pJanpa->SetMediator(mediator); 
 pChina->SetMediator(mediator); 
 
 pJanpa->SendMessage("釣魚島是我們的,哈哈哈...\n"); 
 pChina->SendMessage("操,你他媽再亂放屁,小心我弄死你!\n"); 
 
 delete pJanpa;
 delete pChina;
 delete mediator; 
 
 return 0; 
}

二. 中介者模式

定義:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

 \
 

說明:

1. Mediator 模式中,每個Colleague 維護一個 Mediator,當要進行通信時,每個具體的 Colleague 直接向ConcreteMediator 發信息,至於信息發到哪裡,則由 ConcreteMediator 來決定。

2. ConcreteColleagueA 和 ConcreteColleagueB 不必維護對各自的引用,甚至它們也不知道各個的存在。

3. 優點是,各個 Colleague 減少了耦合。

4. 缺點是,由於 Mediator 控制了集中化,於是就把 Colleague 之間的交互復雜性變為了中介者的復雜性,也就是中介者會變的比任何一個 Colleague 都復雜。

 

 

作者 lwbeyond

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved