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