中介者模式(Mediator)

1.目的

当两个或多个对象之间要建立关联的时候,可以让他们之间不建立直接的关联(A对象不知道B对象,也即不持有其引用或指针),而是通过另外一个对象(Mediator或其实现子类)来建立关联,也即Mediator持有A和B两个对象的指针或引用,当A与B之间要通信时,由Mediator来中转。

中介者模式有个前提,A与B要发生关联,但是A并不知道B的引用,也即A不持有或者找不到B的对象(可能它只知道B的一个名称,或者连B的名称都不知道,下面的例子中,A并没有指定其通信的对象),所有的关联的建立,都是在Mediator中完成。Mediator持有A和B的引用,它可以建立两个对象的关联

 

这个与现实生活中的例子是一样的,买方不知道卖方的信息,卖方不知道买方的信息,中介知道买方和卖方的信息,买方要找到卖方,或者卖方要找到买方,大家都去找中介,由中介来建立买方和卖方的关联,同时继续保持双方相互不知道对方的状态

 

2.代码

Mediator.h

#ifndef MEDIATOR_H_
#define MEDIATOR_H_

#include <string>

class Colleague;

class Mediator
{
public:
	virtual ~Mediator();
	virtual void send(std::string, Colleague&)=0;
	void setColleague1(Colleague&);
	void setColleague2(Colleague&);
protected:
	Colleague* coll1;
	Colleague* coll2;
};

class ConcreteMediator:public Mediator
{
public:
	void send(std::string, Colleague&);
};

class Colleague
{
public:
	Colleague(Mediator&);
	virtual ~Colleague();
	void send(std::string, Colleague&);
	virtual void notify(std::string)=0;
private:
	Mediator* mediator;
};

class Colleague1:public Colleague
{
public:
	Colleague1(Mediator&);
	void notify(std::string);
};

class Colleague2:public Colleague
{
public:
	Colleague2(Mediator&);
	void notify(std::string);
};





#endif /* MEDIATOR_H_ */


 

#include "Mediator.h"
#include <iostream>
using namespace std;

Mediator::~Mediator()
{}

void Mediator::setColleague1(Colleague& arg)
{
	coll1 = &arg;
}

void Mediator::setColleague2(Colleague& arg)
{
	coll2 = &arg;
}

void ConcreteMediator::send(string arg, Colleague& sender)
{
	if(&sender == coll1)
	{
		coll2->notify(arg);
	}
	else
	{
		coll1->notify(arg);
	}
}

Colleague::Colleague(Mediator& arg):mediator(&arg)
{}

Colleague::~Colleague()
{}



void Colleague::send(string arg1, Colleague& arg2)
{
	if(NULL != mediator)
	{
		mediator->send(arg1, arg2);
	}
}

Colleague1::Colleague1(Mediator& arg):Colleague(arg)
{}

void Colleague1::notify(string arg)
{
	cout<<"Colleague1 receive "<<arg<<endl;
}

void Colleague2::notify(string arg)
{
	cout<<"Colleague2 receive "<<arg<<endl;
}

Colleague2::Colleague2(Mediator& arg):Colleague(arg)
{}

void Mediator()
{
	ConcreteMediator mediator;

	Colleague1 col1(mediator);
	Colleague2 col2(mediator);

	mediator.setColleague1(col1);
	mediator.setColleague2(col2);

	col1.send("announce from col1", col1);
	col1.send("announce from col2", col2);
}


运行结果

Colleague2 receive announce from col1
Colleague1 receive announce from col2


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值