
文章目錄
- 前言
- 中介者模式
- 缺點
- 應用場景
- 案例:大型相親現場 VS 傳統媒人模式
- 中介者模式類圖
- 類圖代碼闡釋
前言
什么是中介者模式呢?看上面那張圖應該是一目了然了吧,
我在做FTP本地云小專案的后端建設時用了中介者模式,將幾個大塊的職責分布到不同的服務器中去,

我有寫日報的好習慣,所以當時的事情是可以基本復現的,
具體在這篇:FTP檔案管理專案(本地云)專案日報(五),細節可查,
中介者模式
又叫調停者模式,但是我更喜歡中介者這個名字,因為一下就表達出這個設計的意圖了,
用一個中介物件封裝一系列物件互動,中介者使各物件不需要顯示的相互作用,從而使其耦合松散,而且可以改變他們之間的互動,
缺點
中介者負荷過高,
應用場景
用于一堆亂麻式的互動場景,中介者模式簡單,但是也容易誤用,不要為了使用中介者模式而使用它,
案例:大型相親現場 VS 傳統媒人模式
(圓的是女的,五角星是男的)

有沒有發現這個圖,耦合度極高,
好,現在哪兩對互看不順眼了,要換人,然后再換人,再換人,這個圖越弄越亂了,
媒人相親模式是這樣的:

這樣就實作了每對男男女女之間的解耦,有啥事兒跟中間人說一下,讓中間人去解決,
但是這樣中間人的責任就過大,是違背了單一職責原則,因為中間人就需要認識那么多人,你有辦法?
中介者模式的優勢就在于它的集中處理,但是缺點也在這里,
中介者模式類圖

類圖代碼闡釋
#include<iostream>
using namespace std;
class Mediator; //定義一個類,但是不馬上實作,這招我以前還真沒試過,漲知識了
//因為下面兩個類要互包
//抽象同事類
class Colleague {
protected :
Mediator *mediator;
public:
Colleague(Mediator* m) { mediator = m; }
virtual void Sent(string message) = 0;
};
//抽象中介者類
class Mediator {
public:
virtual void Send(string message, Colleague *colleague) = 0;
};
//具體同事類
class ConcreteColleague1 :public Colleague {
public:
ConcreteColleague1(Mediator* m) : Colleague(m) {}
void Sent(string message) { mediator->Send(message, this); }
void Notify(string message) { cout << "同事1得到訊息:" << message << endl; }
};
class ConcreteColleague2 :public Colleague {
public:
ConcreteColleague2(Mediator* m) : Colleague(m) {}
void Sent(string message) { mediator->Send(message, this); }
void Notify(string message) { cout << "同事2得到訊息:" << message << endl; }
};
//具體中介者類
class Concretemediator :public Mediator {
private:
ConcreteColleague1* colleague1;
ConcreteColleague2* colleague2;
public:
//無法將父類物件轉化為子類物件,所以采用第二種方法
/*void SetColleague1(Colleague* pColleague){ colleague1 = pColleague; }
void SetColleague2(Colleague* pColleague){ colleague2 = pColleague; }*/
void SetColleague1(Colleague* pColleague){
colleague1 = dynamic_cast<ConcreteColleague1*>(pColleague);
}
void SetColleague2(Colleague * pColleague){
colleague2 = dynamic_cast<ConcreteColleague2*>(pColleague);
}
void Send(string message, Colleague* colleague){
if (colleague == colleague1)
colleague2->Notify(message);
else if (colleague == colleague2)
colleague1->Notify(message);
}
};
int main()
{
Concretemediator* mediator = new Concretemediator();
ConcreteColleague1* colleague1 = new ConcreteColleague1(mediator); //讓他倆認識一下中介
ConcreteColleague2* colleague2 = new ConcreteColleague2(mediator);
mediator->SetColleague1(colleague1); //讓中介認識一下他倆
mediator->SetColleague2(colleague2);
colleague1->Sent("有男朋友沒?");
colleague2->Sent("有了");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/258473.html
標籤:其他
