中介者模式
模式定義
中介者模式(Mediator),用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。
模式動機
- 儘管講一個系統分割成許多物件通常可以增加其可複用性,但是物件間相互連線的激增又會降低其可複用性了。大量的連線使得一個物件不可能在沒有其他物件的支援下工作,系統表現為一個不可分割的整體,所以,對系統的行為進行任何較大的改動就十分困難了
- 中介者模式一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合,以及想定製以一個分佈在多個類中的行為,而又不想生成太多的子類的場合。
UML類圖
原始碼實現
- colleague.h
#include <string>
class Mediator;
class Colleague
{
public:
Colleague(Mediator* mediator);
virtual ~Colleague();
virtual void Notify(std::string message) = 0;
void Send(std::string message);
private:
Mediator* m_Mediator;
};
- concretecolleague.h
#include "colleague.h"
class Mediator;
class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1(Mediator* mediator);
void Notify(std::string message) override;
private:
Mediator* m_Mediator;
};
- concretecolleague.cpp
#include "colleague.h"
class Mediator;
class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1(Mediator* mediator);
void Notify(std::string message) override;
private:
Mediator* m_Mediator;
};
- mediator.h
#include <string>
class Colleague;
class Mediator
{
public:
Mediator();
void Send(std::string message, Colleague* colleague);
void SetColleague1(Colleague* colleague);
void SetColleague2(Colleague* colleague);
private:
Colleague* m_Colleague1;
Colleague* m_Colleague2;
};
- mediator.cpp
#include <string>
class Colleague;
class Mediator
{
public:
Mediator();
void Send(std::string message, Colleague* colleague);
void SetColleague1(Colleague* colleague);
void SetColleague2(Colleague* colleague);
private:
Colleague* m_Colleague1;
Colleague* m_Colleague2;
};
- main.cpp
#include <iostream>
#include "concretecolleague1.h"
#include "concretecolleague2.h"
#include "mediator.h"
using namespace std;
int main()
{
Mediator* mediator = new Mediator();
Colleague* c1 = new ConcreteColleague1(mediator);
Colleague* c2 = new ConcreteColleague2(mediator);
mediator->SetColleague1(c1);
mediator->SetColleague2(c2);
c1->Send("吃了嗎");
c2->Send("我吃過了,你呢");
return 0;
}
- 執行結果
同事2得到訊息:吃了嗎
同事1得到訊息:我吃過了,你呢
優點
中介者模式的優點
- 中介者模式很容易在系統中應用,也很容易在系統中應用。當系統出現了“多對多”互動複雜的物件群時,不要急於使用中介者模式,而要先煩死你的系統在設計上是不是合理。
- Mediator的出現減少了各個Colleague的耦合,使得可以獨立的改變和複用各個Colleague類和Mediator。由於把物件如何協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個物件中,這樣關注的物件就從物件各自本身的行為轉移到他們之間的互動上來,也就是站在一個更巨集觀的角度去看待系統。
缺點
中介者模式的缺點
- 由於ConcreteMediator控制了集中化,於是就把互動複雜性變為了中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜。