設計模式之中介者模式(C++)
阿新 • • 發佈:2018-12-17
設計模式之中介者模式
中介者模式,用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地互相引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。該模式很好理解,其UML圖如下:
Mediator中每個互動者的引用,在Mediator內部封裝了各種類之間的互動。至於那個類和那個類交合則有具體的需求來決定。示例程式碼如下:
// MediatorModel.h檔案
#pragma once
#include <string>
#include <iostream>
class Colleague;
class Mediator
{
public:
virtual void send(std::string msg, Colleague * p) = 0;
};
class Colleague
{
protected:
Mediator * m_mediator;
public:
Colleague(Mediator * p)
{
m_mediator = p;
}
virtual void send(std::string msg) = 0;
virtual void notify(std::string msg) = 0;
};
class ConcreteColleague_0 : public Colleague
{
public :
ConcreteColleague_0(Mediator * p) : Colleague(p) {}
void send(std::string msg)
{
m_mediator->send(msg, this);
}
void notify(std::string msg)
{
std::cout << "Colleague_0 收到了訊息:" << msg << std::endl;
}
};
class ConcreteColleague_1 : public Colleague
{
public:
ConcreteColleague_1 (Mediator * p) : Colleague(p) {}
void send(std::string msg)
{
m_mediator->send(msg, this);
}
void notify(std::string msg)
{
std::cout << "Colleague_1 收到了訊息:" << msg << std::endl;
}
};
class ConcreteMediator : public Mediator
{
private:
// 這裡也可以是一個列表
Colleague * m_p1;
Colleague * m_p2;
public:
void addColleague(Colleague * p1, Colleague * p2)
{
m_p1 = p1;
m_p2 = p2;
}
void send(std::string msg, Colleague * p)
{
// 這裡接受來自一個同事發過來的訊息,具體應該給誰要根據需求來
// 這裡知識一個很簡單的應用。比如該類總可以是有兩個佇列。
// 一個佇列是客戶,一個佇列是客服
if (p == m_p1)
m_p2->notify(msg);
else
m_p1->notify(msg);
}
};
測試程式碼如下:
#include <iostream>
#include "MediatorModel.h"
int main()
{
using namespace std;
// 中介者模式
ConcreteMediator * p = new ConcreteMediator();
Colleague * pCol1 = new ConcreteColleague_0(p);
Colleague * pCol2 = new ConcreteColleague_1(p);
p->addColleague(pCol1, pCol2);
pCol1->send("你下班了嗎?");
pCol2->send("沒呢,你呢?");
delete pCol1;
delete pCol2;
delete p;
getchar();
return 0;
測試結果如下圖:
Mediator的出現減少了各個Colleague的耦合,使得可以讀來地改變和複用各個Colleague類和Mediator。由於把物件如何協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個物件中,這樣關注的物件就從物件各自本身的行為轉移到它們之間的互動上來,也就是站在一個更巨集觀的角度去看待系統。等於說使把互動的複雜性變為了中介的複雜性。