大型相親現場 VS 傳統媒人模式
爲啥用這個栗子,不解釋了。
大型相親現場是這樣的:
(圓的是女的,五角星是男的)
有沒有發現這個圖,耦合度極高。
好,現在哪兩對互看不順眼了,要換人,然後再換人,再換人,這個圖越弄越亂了。
媒人相親模式是這樣的:
這樣就實現了每對男男女女之間的解耦。有啥事兒跟中間人說一下,讓中間人去解決。
但是這樣中間人的責任就過大,是違背了單一職責原則。因爲中間人就需要認識那麼多人,你有辦法?
中介者模式的優勢就在於它的集中處理,但是缺點也在這裏。
中介者模式架構
UML類圖代碼實現
#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;
}
中介者模式優劣分析
中介者模式很容易在系統中應用,當然,也很容易誤用。
當系統中出現了“多對多”的集羣現象時,先不要急着套上中介者模式,先分析清楚自己的系統設計是不是合理。
中介者模式站在一個更宏觀的角度,將交互複雜性集中到了自己身上,這就使得中介者變得比每個同事類更復雜。
所以,雙刃劍,而且是絕對鋒利的雙刃劍。