您的位置:首页 > 其它

中介者模式(Mediator)

2014-09-16 07:11 169 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: