1. 程式人生 > >設計模式C++實現二十一:中介者模式

設計模式C++實現二十一:中介者模式

中介者模式(Mediator):用一箇中介物件來封裝一系列的物件互動。中介者是各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動。

中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現多對多互動複雜的物件群是,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理。

優點:Mediator的出現減少了各個colleague的耦合,使得可以獨立地改變和複用各個colleague類和Mediator;由於把物件如何協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個物件中,這樣關注的物件就從物件各自本身的行為轉移到它們之間的互動上來,也就是站在一個更巨集觀的角度去看待系統。

中介者模式一般應用於一組物件以定義良好但是複雜的方式進行通訊的場合,以及想定製一個分佈在多個類中的行為,而又不想生成太多的子類的場合。

#ifndef MEDIATOR_H
#define MEDIATOR_H
#include<iostream>
#include<string>
using namespace std;
class Country;
class UnitedNations
{
public:
	virtual void Declare(string message, Country *colleague)=0;
	
};
class Country
{
protected:
	UnitedNations *mediator;
public:
	Country(){}
	Country(UnitedNations *m) :mediator(m){}
	virtual void Declare(string m) = 0;
	virtual void GetMessage(string  st) = 0;
};
class USA :public Country
{
public:
	USA(UnitedNations *m) { mediator = m; }
	void Declare(string m)
	{
		mediator->Declare(m, this);
	}
	void GetMessage(string m)
	{
		cout << "美國獲得對方資訊: " << m << endl;
	}
};
class Iraq :public Country
{
public:
	Iraq(UnitedNations* m) { mediator = m; }
	void Declare(string m)
	{
		mediator->Declare(m, this);
	}
	void GetMessage(string m)
	{
		cout << "伊拉克獲得對方資訊: " << m << endl;
	}
};

class UnitedNationsSecurityCouncil :public UnitedNations
{
	Country * colleague1;
	Country * colleague2;
public:
	void SetColleague1(Country * c1){ colleague1 = c1; }
	void SetColleague2(Country * c2){ colleague2 = c2; }
	void Declare(string message, Country *colleague)
	{
		if (colleague == colleague1)
			colleague2->GetMessage(message);
		else
			colleague1->GetMessage(message);
	}

};
#endif

#include "Mediator.h"

int main()
{
	UnitedNationsSecurityCouncil UNSC;
	USA usa(&UNSC);
	Iraq iraq(&UNSC);
	UNSC.SetColleague1(&usa);
	UNSC.SetColleague2(&iraq);

	usa.Declare("不準研製核武器,否則要發動戰爭!");
	iraq.Declare("我們沒有核武器,也不怕侵略!");


	return 0;
}