中介者模式(C++实现)

中介者模式:用一个中介对象来封装一系列的对象交互。中介者使得对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

 

      中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了多对多交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。   

     优点:Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator;  由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

       缺点:由于ConcreteMediator控制了集中化。于是就把交互的复杂性变为了中介者的复杂性,使得中介者比任何一个ConcreteColle都复杂。

#include <iostream>
#include <string>


using namespace std;

/*声明抽象同事类*/
class Colleague;

/*抽象中介者类*/
class Mediator
{
public:
	virtual void Send( string& message, Colleague* colleague) = 0;
};

/*抽象同事类*/
class Colleague
{
protected:
	Mediator* mediator;

public:
	Colleague( Mediator* mediator )
	{
		this->mediator = mediator;
	}

	virtual void Send( string& message ) = 0;
	virtual void Notify( string& message ) = 0;
};

class ConcreteColleague1 : public Colleague
{
public:
	ConcreteColleague1( Mediator* mediator ) : Colleague( mediator )
	{}

	void Send( string& message )
	{
		mediator->Send( message, this );
	}

	void Notify( string& message )
	{
		cout<<"同事1得到信息:"<<message<<endl;
	}
};

class ConcreteColleague2 : public Colleague
{
public:
	ConcreteColleague2( Mediator* mediator ) : Colleague( mediator )
	{}

	void Send( 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 SetConcreteColleague1( ConcreteColleague1* value )
	{
		colleague1 = value;
	}

	void SetConcreteColleague2( ConcreteColleague2* value )
	{
		colleague2 = value;
	}

	void Send( string& message, Colleague* colleague )
	{
		if( colleague == colleague1 )
		{
			colleague2->Notify( message );
		}
		else
		{
			colleague1->Notify( message );
		}
	}
};


int main()
{
	ConcreteMediator m;
	ConcreteColleague1 c1( &m );
	ConcreteColleague2 c2( &m );

	m.SetConcreteColleague1( &c1 );
	m.SetConcreteColleague2( &c2);

	c1.Send( string("吃过饭了吗") );
	c2.Send( string("没有呢,你打算请客?") );

	return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值