用C++跟你聊聊“中介者模式”

在這裏插入圖片描述

大型相親現場 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;
}

中介者模式優劣分析

中介者模式很容易在系統中應用,當然,也很容易誤用。
當系統中出現了“多對多”的集羣現象時,先不要急着套上中介者模式,先分析清楚自己的系統設計是不是合理。

中介者模式站在一個更宏觀的角度,將交互複雜性集中到了自己身上,這就使得中介者變得比每個同事類更復雜。

所以,雙刃劍,而且是絕對鋒利的雙刃劍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章