1. 程式人生 > >設計模式C++版:第十三式中介者模式

設計模式C++版:第十三式中介者模式

A:“我想租房,價位1500左右。”

中介:“好的,我這邊有房源。什麼時候過來看看,價錢划算。”

B:“我這邊有閒置房間,想租出去,2000以上。”

中介:“可以的,我這邊有客戶。價錢好商量。”

中介---A:“房東B說了,低於2000不可以。”

中介---B:“客戶A說了,高於18000,就太高了,不想考慮。”

......

儘管講一個系統分割成所需物件,通常可以增加其複用性。但是物件間相互連線的激增,會降低其複用性。尤其是大量連結,會使得系統耦合性增加,對系統的改動,將會變得複雜和困難。這時可以考慮中介者模式。

中介者不參與實際宣告,只負責傳遞訊息。優點:集中控制,降低各個物件間的耦合。缺點:集中控制,使得中介者變得複雜。如果系統出現了多對多互動複雜的物件群時,不要急於使用該模式,而是想想是不是系統設計上存在不合理。總的來說該模式相對比較雞肋。

#pragma  once
#include<iostream>
#include<string>
using std::string;

class Country;
//中介者抽象
class UniteNations
{
public:
	virtual void declare(string messasge ,const Country* country){ }
	virtual ~UniteNations(){}
protected:

};

//具體物件
class Country
{
public:
	 Country(UniteNations * unite) :m_unite(unite)
	{

	}
	virtual~Country(){}

protected:
	UniteNations * m_unite;
};


class USA : public Country
{
public:
	USA(UniteNations * unite) :Country(unite)
	{

	}

	void declare(string msg)
	{
		m_unite->declare(msg,this);
	}

	void getmsg(string msg)
	{
		printf("USA獲得訊息:%s\n", msg.c_str());
	}

};

class IRAQ : public Country
{
public:
	IRAQ(UniteNations * unite) :Country(unite)
	{

	}

	void declare(string msg)
	{
		m_unite->declare(msg, this);
	}

	void getmsg(string msg)
	{
		printf("IRAQ獲得訊息:%s\n", msg.c_str());
	}

};

//具體中介者
class UniteSecurityCouncil :public UniteNations
{
public:
	void setUSA(USA *usa)
	{
		m_usa = usa;
	}

	void setIRAQ(IRAQ *iraq)
	{
		m_iraq = iraq;
	}


	void declare(string messasge, const Country* country)
	{
		if (country==m_usa)
		{
			m_iraq->getmsg(messasge);
		}
		else
		{
			m_usa->getmsg(messasge);
		}
	}
private:
	USA *m_usa;
	IRAQ *m_iraq;
};


int main()
{
	UniteSecurityCouncil unsc;

	USA usa(&unsc);
	IRAQ iraq(&unsc);

	unsc.setUSA(&usa);
	unsc.setIRAQ(&iraq);

	usa.declare("把石油給我,否則發動戰爭!");
	iraq.declare("艹,你以為老子威脅大的?");

	return 0;
}