問題
在物件導向系統的設計和開發過程中, 物件之間的互動和通訊是最為常見的情況, 因為物件間的互動本身就是一種通訊。 在系統比較小的時候, 可能物件間的通訊不是很多、 物件也比較少, 我們可以直接硬編碼到各個物件的方法中。 但是當系統規模變大, 物件的量變引起系統複雜度的急劇增加, 物件間的通訊也變得越來越複雜, 這時候我們就要提供乙個專門處理物件間互動和通訊的類,這個中介者就是 mediator 模式。 mediator 模式提供將物件間的互動和通訊封裝在乙個類中, 各個物件間的通訊不必顯勢去宣告和引用, 大大降低了系統的複雜性能(了解乙個物件總比深入熟悉 n 個物件要好)。另外 mediator 模式還帶來了系統物件間的松耦合,這些將在討論中詳細給出。
模式選擇
mediator 模式典型的結構圖為:
mediator 模式中,每個 colleague 維護乙個 mediator,當要進行互動,例如圖中
concretecolleaguea 和 concretecolleagueb 之間的互動就可以通過concretemediator 提供的doactionfromatob 來處理, concretecolleaguea 和 concretecolleagueb 不必維護對各自的引用,甚至它們也不知道各個的存在。 mediator 通過這種方式將多對多的通訊簡化為了一(mediator) 對(colleague)的通訊 。
實現
完整**示例(code)
mediator 模式實現不是很困難, 這裡為了方便初學者的學習和參考, 將給出完整的實現**。
#ifndef _colleage_h_
#define _colleage_h_
#include
using namespace std;
class mediator;
class colleage
;class concretecolleagea:public colleage
;class concretecolleageb:public colleage
;#endif //~_colleage_h_
**片斷 2: colleage.cpp
include "mediator.h"
include "colleage.h"
include using
namespace
std;
colleage::colleage()
colleage::colleage(mediator* mdt)
colleage::~colleage()
concretecolleagea::concretecolleagea()
concretecolleagea::~concretecolleagea()
concretecolleagea::concretecolleagea(mediator* mdt):colleage(mdt)
string concretecolleagea::getstate()
void concretecolleagea::setstate(const
string& sdt)
void concretecolleagea::aciton()
void concretecolleageb::setstate(const
string& sdt)
**片斷 3: mediator.h
ifndef mediator_h
define mediator_h
class colleage;
class mediator
;class concretemediator:public mediator
;endif //~mediator_h
**片斷 4: mediator.cpp
include "mediator.h"
include "colleage.h"
mediator::mediator()
mediator::~mediator()
concretemediator::concretemediator()
concretemediator::~concretemediator()
concretemediator::concretemediator(colleage* clga,colleage* clgb)
void concretemediator::doactionfromatob()
void concretemediator::setconcretecolleagea(colleage* clga)
void concretemediator::setconcretecolleageb(colleage* clgb)
colleage* concretemediator::getconcretecolleagea()
colleage* concretemediator::getconcretecolleageb()
void concretemediator::introcolleage(colleage* clga,colleage* clgb)
void concretemediator::doactionfrombtoa()
**片斷 5: main.cpp
include "mediator.h"
include "colleage.h"
include using
namespace
std;
int main(int argc,char* argv)
中介者模式(Mediator)
一 適用情況 場景中存在多個角色並且其中多個角色互相存在直接關聯,從而導致過多的強耦合和過複雜的關係網路。此時新增乙個中介者角色,其他都角色只會和中介者發生直接關聯,每個角色都通過中介者間接與其他角色進行溝通,從而化解了之前的強耦合。這裡的中介者如同我們辦公室裡的交換機 路由器,我們用的電腦就是各個...
設計模式 中介者模式Mediator
前言 模式總覽 by xingoo 使用乙個中介的物件,封裝一組物件之間的互動,這樣這些物件就可以不用彼此耦合。這個中介者常常起著中間橋梁的作用,使其他的物件可以利用中介者完成某些行為活動,因此它必須對所有的參與活動的物件瞭如指掌!1 當一組物件要進行溝通或者業務上的互動,但是其關係卻又很複雜混亂時...
行為模式之Mediator 中介者
mediator定義 用乙個中介物件來封裝 一系列關於物件互動行為.為何使用mediator?各個物件之間的互動操作非常多 每個物件的行為操作都依賴彼此對方,修改乙個物件的行 為,同時會涉及到修改很多其他物件的行為,如果使用mediator模式,可以使各個物件間的耦合鬆散,只需關心和 mediato...