Mediator:中介者模式

Mediator:中介者模式

      新创建了一个QQ账号,还没有加任何好友。现在需要将一条信息发送给n个人。那么需要两个步骤:

①   将所有需要接收信息的人加为好友

②   依次给这些人发送信息

这样非常繁琐。于是,考虑使用一个中介者,即QQ群。无需加任何好友,直接在群里发送一条信息,那么所有其他群成员都会收到。

这就是中介者模式。所谓中介者,就是负责将一个成员发来的信息发送给另外的所有人

于是,所有的通信复杂度转移到了中介者这个中间层上来,令通信的各方不用关心其他成员。

  

1.    抽象同事基类及其派生类

同事基类规定了同事类的标准接口。

同事类中内嵌了一个中介者基类指针,这是为了可以方便地发送信息及被动获取信息。

//预定义中介者基类
class Mediator;
//抽象同事类基类
class Colleague
{
public:
	virtual void setMediator(Mediator *mediator) {} //设置中介
	virtual void sendMessage(string message) {}    //向中介发送信息
	virtual void getMessage(string message) {}     //从中介获取信息
protected:
	Mediator *_mediator; //中介
};
//同事A
class ColleagueA : public Colleague
{
public:
	void setMediator(Mediator *mediator) { _mediator = mediator; }
	void sendMessage(string message) { _mediator->send(message, this); }
	void getMessage(string message) { }
};
//同事B
class ColleagueB : public Colleague
{
public:
	void setMediator(Mediator *mediator) { _mediator = mediator; }
	void sendMessage(string message) { _mediator->send(message, this); }
	void getMessage(string message) { }
};
//同事C
class ColleagueC : public Colleague
{
public:
	void setMediator(Mediator *mediator) { _mediator = mediator; }
	void sendMessage(string message) { _mediator->send(message, this); }
	void getMessage(string message) { }
};

2.    抽象中介者基类及其派生类

抽象中介者基类定义了中介者类的标准接口。

中介者类主要负责保存所有的同事对象,并可以向所有其他同事成员发送信息。

//抽象中介者基类
class Mediator
{
public:
	virtual void send(string message, Colleague *Colleague) {}
	virtual void addColleague(Colleague *A) {}
};

//中介者类
class ConcreteMediator : public Mediator
{
public:
	virtual void addColleague(Colleague *A) { _colleagues.push_back(A); }

	//向所有其他成员发送信息
	void send(string message, Colleague *person)
	{
		for (auto& colleague : _colleagues)
		{
			if (person != colleague)
			{
				colleague->getMessage(message);
			}
		}
	}
private:
	vector<Colleague*>	_colleagues;
};

3.    用户使用

用户使用时,创建出所有的同事对象和中介者对象,将中介者设给每一个对象,从而令每个对象都保存中介者;并将每个对象都添加给中介者,从而中介者保存了所有对象的指针。

这样,当有用户发送信息时,就会通过内部函数调用中介者来将信息发给所有其他成员;而中介者会根据内部存储的所有对象数组进行筛选,将信息发送给其他成员。

void main()
{
	Mediator *mediator = new ConcreteMediator();
	Colleague *colleagueA = new ColleagueA();  //同事A
	Colleague *colleagueB = new ColleagueB();  //同事B
	Colleague *colleagueC = new ColleagueC();  //同事C
	mediator->addColleague(colleagueA);
	mediator->addColleague(colleagueB);
	mediator->addColleague(colleagueC);

	colleagueA->setMediator(mediator);
	colleagueB->setMediator(mediator);
	colleagueC->setMediator(mediator);

	colleagueA->sendMessage("colleagueA发出了一条信息");
	colleagueB->sendMessage("colleagueB发出了一条信息");
	colleagueC->sendMessage("colleagueC发出了一条信息");
}

      注意,中介者模式是将某个成员发送的信息转发给所有其他成员,而不负责点对点发送信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值