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;}