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发出了一条信息");
}
注意,中介者模式是将某个成员发送的信息转发给所有其他成员,而不负责点对点发送信息。