中介者模式(c++實現)
中介者模式
模式定義
中介者模式(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都複雜。