简介
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
优点
中介者模式简化了对象之间的交互,它用一对多交互代替了原来多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星型结构。
更好地符合“开闭原则”。
应用场景
系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象
代码如下:
#include <iostream>
#include <string>
#include <memory>
#include <map>
#include <list>
class colleague;
class mediator
{
public:
virtual void register_colleague(colleague *cool)
{
m_colleagues.push_back(cool);
}
const std::list<colleague *>& get_colleagues() const
{
return m_colleagues;
}
void clear(void)
{
m_colleagues.clear();
}
virtual void send_msg(const colleague *sender, const std::string& msg) const = 0;
private:
std::list<colleague *> m_colleagues;
};
class colleague
{
public:
colleague(std::string name) : m_name (name) {}
std::string get_name() const { return m_name; }
virtual void send_msg(const mediator& mdt, const std::string& msg) const = 0;
virtual void receive_msg(const colleague* sender, const std::string& msg) const = 0;
private:
std::string m_name;
};
class headhunter : public mediator
{
public:
virtual void send_msg(const colleague *sender, const std::string& msg) const
{
for (const colleague* c : get_colleagues())
if (c != sender)
c->receive_msg(sender, msg);
}
};
class concrete_colleague : public colleague
{
public:
using colleague::colleague;
virtual void send_msg(const mediator& mdt, const std::string& msg) const {
mdt.send_msg(this, msg);
}
private:
virtual void receive_msg(const colleague* sender, const std::string& msg) const override {
std::cout << get_name() << " received the message from "
<< sender->get_name() << ": " << msg << std::endl;
}
};
int main()
{
std::cout << "start-up .." << std::endl;
colleague *pg1 = new concrete_colleague("比尔盖茨");
colleague *pg2 = new concrete_colleague("马云");
colleague *pg3 = new concrete_colleague("马化腾");
headhunter hh;
hh.register_colleague(pg2);
hh.register_colleague(pg3);
//hh.register_colleague(pg3);
pg1->send_msg(hh, "招聘一名高级软件工程师 3000人民币/每个月!");
hh.clear();
delete pg1;
delete pg2;
delete pg3;
std::cout << "done .." << std::endl;
return 0;
}
运行结果: