Mediator模式
該模型主要解決兩個或多個對象間的相互通信的問題。(個人認為該模式的思想同Observer模式的思想還是有點類似的。表面上看,他們所解決的問題類型根本不同,那為什么我會這么認為了?后面再說明)。按理說,各對象間的通信假如:ObjA與ObjB要進行通信。方法有好多種。比如:可以在它們內部各存一份對方的引用。在一方變動時,調用另一方進行同步即可。但確實如果系統大而復雜時,這將顯示的不那么清晰。因此,就希望中間會有個調停者。Mediator模式就因此而生。此時,ObjA與ObjB內部只存為一份Mediator(MediatorObj)對象的引用。在對象變動時,只需調用MediatorObj的相關接口,通知其他對象需要同步更新即可。因此,對ObjA或ObjB或其他的任何對象來說,它們有可能根本不知道還有其他的對象存在。(如:ObjA可能不知道ObjB的存在。)但通過MediatorObj對象,卻達到了ObjA與ObjB的同步作用。(現在想下,是不是與Observer模式有點類似?因為,如果在Observer模式的實現上,抽象出一個IObserverable來。那通過IObserverable對象,可以通知所有View的更新)。
class CClassA;
class CClassB;
class CMediator
{
public:
CMediator(){}
CMediator(CClassA* pObjA, CClassB* pObjB)
{
this->m_pObjA = pObjA;
this->m_pObjB = pObjB;
}
void DoSyncFromAToB(void)
{
this->m_pObjB->xxx
}
void DoSyncFromBToA(void)
{
this->m_pObjA->xxx
}
private:
CClassA* m_pObjA;
CClassB* m_pObjB;
};
class CClassA
{
public:
CClassA(){}
CClassA(CMediator* pMediator)
{
this->m_pMediator = pMediator;
}
void DoAction(void)
{
// do some work here

// 通知其他對象,需要同步
this->m_pMediator->DoSyncFromAToB();
}
private:
CMediator* m_pMediator;
};
class CClassB
{
public:
CClassB(){}
CClassB(CMediator* pMediator)
{
this->m_pMediator = pMediator;
}
void DoAction(void)
{
// do some work here

// 通知其他對象,需要同步
this->m_pMediator->DoSyncFromBToA();
}
private:
CMediator* m_pMediator;
};
該模型主要解決兩個或多個對象間的相互通信的問題。(個人認為該模式的思想同Observer模式的思想還是有點類似的。表面上看,他們所解決的問題類型根本不同,那為什么我會這么認為了?后面再說明)。按理說,各對象間的通信假如:ObjA與ObjB要進行通信。方法有好多種。比如:可以在它們內部各存一份對方的引用。在一方變動時,調用另一方進行同步即可。但確實如果系統大而復雜時,這將顯示的不那么清晰。因此,就希望中間會有個調停者。Mediator模式就因此而生。此時,ObjA與ObjB內部只存為一份Mediator(MediatorObj)對象的引用。在對象變動時,只需調用MediatorObj的相關接口,通知其他對象需要同步更新即可。因此,對ObjA或ObjB或其他的任何對象來說,它們有可能根本不知道還有其他的對象存在。(如:ObjA可能不知道ObjB的存在。)但通過MediatorObj對象,卻達到了ObjA與ObjB的同步作用。(現在想下,是不是與Observer模式有點類似?因為,如果在Observer模式的實現上,抽象出一個IObserverable來。那通過IObserverable對象,可以通知所有View的更新)。
class CClassA;
class CClassB;
class CMediator
{
public:
CMediator(){}
CMediator(CClassA* pObjA, CClassB* pObjB)
{
this->m_pObjA = pObjA;
this->m_pObjB = pObjB;
}
void DoSyncFromAToB(void)
{
this->m_pObjB->xxx
}
void DoSyncFromBToA(void)
{
this->m_pObjA->xxx
}
private:
CClassA* m_pObjA;
CClassB* m_pObjB;
};
class CClassA
{
public:
CClassA(){}
CClassA(CMediator* pMediator)
{
this->m_pMediator = pMediator;
}
void DoAction(void)
{
// do some work here


// 通知其他對象,需要同步
this->m_pMediator->DoSyncFromAToB();
}
private:
CMediator* m_pMediator;
};
class CClassB
{
public:
CClassB(){}
CClassB(CMediator* pMediator)
{
this->m_pMediator = pMediator;
}
void DoAction(void)
{
// do some work here


// 通知其他對象,需要同步
this->m_pMediator->DoSyncFromBToA();
}
private:
CMediator* m_pMediator;
};