設計模式之Mediator(中介者)

來源:互聯網
上載者:User

Mediator中介者模式定義:
用一個中介對象來封裝一系列關於對象互動行為.

為何使用Mediator?
各個對象之間的互動操作非常多;每個對象的行為操作都依賴彼此對方,修改一個對象的行為,同時會涉及到修改很多其他對象的行為,如果使用Mediator模式,可以使各個對象間的耦合鬆散,只需關心和 Mediator的關係,使多對多的關係變成了一對多的關係,可以降低系統的複雜性,提高可修改擴充性.

如何使用?

首先 有一個介面,用來定義成員對象之間的互動連絡方式:

public interface Mediator { }

Meiator具體實現,真正實現互動操作的內容:

public class ConcreteMediator implements Mediator {

   //假設當前有兩個成員.
   private ConcreteColleague1 colleague1 = new ConcreteColleague1(); 
   private ConcreteColleague2 colleague2 = new ConcreteColleague2();

   ...

}

再看看另外一個參與者:成員,因為是互動行為,都需要雙方提供一些共同介面,這種要求在Visitor Observer等模式中都是相同的.

public class Colleague {
   private Mediator mediator;
   public Mediator getMediator() { 
      return mediator;
   }

   public void setMediator( Mediator mediator ) { 
      this.mediator = mediator; 
   }
}

public class ConcreteColleague1 { }

public class ConcreteColleague2 { }

每個成員都必須知道Mediator,並且和 Mediator聯絡,而不是和其他成員聯絡.

至此,Mediator模式架構完成,可以發現Mediator模式規定不是很多,大體架構也比較簡單,但實際使用起來就非常靈活.

Mediator模式在事件驅動類應用中比較多,例如介面設計GUI.;聊天,訊息傳遞等,在聊天應用中,需要有一個MessageMediator,專門負責request/reponse之間任務的調節.

MVC是J2EE的一個基本模式,View Controller是一種Mediator,它是Jsp和伺服器上應用程式間的Mediator.

 

===============================================================================

設計模式Mediator的C++實現源碼
1、抽象類別Media定義#ifndef MEDIATOR_H#define MEDIATOR_H#pragma warning(disable:4786)#include <map>#include <string>#include "Colleague.h"using namespace std;class Colleague;typedef pair<string, Colleague*> Init_Pair;class Mediator{public: virtual void AddColleague(Colleague*); virtual void Notified(Colleague*) = 0; protected: map<string,Colleague*> m_map;};#endif 2、抽象類別Mediator實現#include "Mediator.h"void Mediator::AddColleague(Colleague* c){ m_map.insert(Init_Pair(c->GetName(),c));} 3、抽象類別Colleague定義#ifndef COLLEAGUE_H#define COLLEAGUE_H#include "Mediator.h"class Mediator;class Colleague{public: Colleague(Mediator*); ~Colleague(); virtual void Changed(); virtual void Action() = 0; virtual char* GetName() = 0;private: Mediator* m_pm;};#endif 4、抽象類別Colleague實現#include "Colleague.h"Colleague::Colleague(Mediator* media) : m_pm(media){}Colleague::~Colleague(){}void Colleague::Changed(){ if(m_pm != NULL) {  m_pm->Notified(this); }} 5、具體類ConcreteMediator定義#ifndef CONCRETEMEDIATOR_H#define CONCRETEMEDIATOR_H#include "Mediator.h"class ConcreteMediator : public Mediator{public: ConcreteMediator(); ~ConcreteMediator(); void Notified(Colleague*);};#endif 6、具體類ConcreteColleague實現#include "ConcreteMediator.h"#define COLLEAGUE1 "ConcreteColleague1"#define COLLEAGUE2 "ConcreteColleague2"#define COLLEAGUE3 "ConcreteColleague3"ConcreteMediator::ConcreteMediator(){}ConcreteMediator::~ConcreteMediator(){}void ConcreteMediator::Notified(Colleague* c){ map<string,Colleague*>::const_iterator iter; if(!strcmp(c->GetName(),COLLEAGUE1)) {  printf("ConcreteColleague1 changed!/n");  iter = m_map.find(COLLEAGUE2);  iter->second->Action();  iter = m_map.find(COLLEAGUE3);  iter->second->Action(); } else if(!strcmp(c->GetName(),COLLEAGUE2)) {  printf("ConcreteColleague2 changed!/n");  iter = m_map.find(COLLEAGUE1);  iter->second->Action();  iter = m_map.find(COLLEAGUE3);  iter->second->Action(); } else if(!strcmp(c->GetName(),COLLEAGUE3)) {  printf("ConcreteColleague3 changed!/n");  iter = m_map.find(COLLEAGUE1);  iter->second->Action();  iter = m_map.find(COLLEAGUE2);  iter->second->Action(); }} 7、具體類ConcreteColleague1定義#ifndef CONCRETECOLLEAGUE1_H#define CONCRETECOLLEAGUE1_H#include "Colleague.h"class ConcreteColleague1 : public Colleague{public: ConcreteColleague1(Mediator*); ~ConcreteColleague1(); char* GetName(); void Action();};#endif 8、具體類ConcreteColleague1實現#include "ConcreteColleague1.h"ConcreteColleague1::ConcreteColleague1(Mediator* media) : Colleague(media){}ConcreteColleague1::~ConcreteColleague1(){}char* ConcreteColleague1::GetName(){ return "ConcreteColleague1";}void ConcreteColleague1::Action(){ printf("ConcreteColleague1::Action()/n");} 9、具體類ConcreteColleague2實現#ifndef CONCRETECOLLEAGUE2_H#define CONCRETECOLLEAGUE2_H#include "Colleague.h"class ConcreteColleague2 : public Colleague{public: ConcreteColleague2(Mediator*); ~ConcreteColleague2(); char* GetName(); void Action();};#endif 10、具體類ConcreteColleague2實現#include "ConcreteColleague2.h"ConcreteColleague2::ConcreteColleague2(Mediator* media) : Colleague(media){}ConcreteColleague2::~ConcreteColleague2(){}char* ConcreteColleague2::GetName(){ return "ConcreteColleague2";}void ConcreteColleague2::Action(){ printf("ConcreteColleague2::Action()/n");} 11、具體實作類別ConcreteColleague3定義#ifndef CONCRETECOLLEAGUE3_H#define CONCRETECOLLEAGUE3_H#include "Colleague.h"class ConcreteColleague3 : public Colleague{public: ConcreteColleague3(Mediator*); ~ConcreteColleague3(); char* GetName(); void Action();};#endif 12、具體實作類別ConcreteColleague3實現#include "ConcreteColleague3.h"ConcreteColleague3::ConcreteColleague3(Mediator* media) : Colleague(media){}ConcreteColleague3::~ConcreteColleague3(){}char* ConcreteColleague3::GetName(){ return "ConcreteColleague3";}void ConcreteColleague3::Action(){ printf("ConcreteColleague3::Action()/n");} 13、客戶使用類Client實現#include "Colleague.h"#include "Mediator.h"#include "ConcreteMediator.h"#include "ConcreteColleague1.h"#include "ConcreteColleague2.h"#include "ConcreteColleague3.h"int main(){ Mediator* md = new ConcreteMediator(); Colleague* c1 = new ConcreteColleague1(md); Colleague* c2 = new ConcreteColleague2(md); Colleague* c3 = new ConcreteColleague3(md); md->AddColleague(c1); md->AddColleague(c2); md->AddColleague(c3); c1->Changed(); c2->Changed(); c3->Changed(); delete c3; c3 =NULL; delete c2; c2 = NULL; delete c1; c1 = NULL; delete md; md = NULL; return 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.