中介者模式
定义:
定义一个中介者对象来封装一系列对象交互
优点:
(1)简化对象间的交互,将多对多的网状关系变成1对多的星状关系
(2)将对象间解耦合
缺点:
(1)大量的交互操作集中在中介者类,增加维护难度
使用范围:
系统间对象存在大量的相互引用关系,一个对象的状态改变需同步影响多个引用对象
如:简历包括纸质、网页、APP三种方式,需要同步更新
结构:
mediator_pattern:中介者抽象类
concrete_mediator_pattern:具体中介者类
person_info:抽象同事类
doc_person,app_person,web_person:具体同事类
实现:
namespace behavioral_pattern
{
class mediator_pattern;
class concrete_mediator_pattern;
class person_info
{
public:
person_info() {};
void set_mediator_pattern(mediator_pattern* m)
{
this->mediator = m;
}
virtual void change() {};
virtual void updata() {};
protected:
mediator_pattern* mediator;
};
class doc_person : public person_info
{
public:
virtual void change();
virtual void updata()
{
std::cout << "doc 更新完成" << std::endl;
}
};
class web_person : public person_info
{
public:
virtual void change();
virtual void updata()
{
std::cout << "web 更新完成" << std::endl;
}
};
class app_person : public person_info
{
public:
virtual void change();
virtual void updata()
{
std::cout << "app 更新完成" << std::endl;
}
};
class mediator_pattern
{
public:
virtual void do_change(person_info* person) = 0;
};
class concrete_mediator_pattern : public mediator_pattern
{
public:
void do_change(person_info* person)
{
if (typeid(*person) == typeid(doc_person))
{
std::cout << "doc_person 发生变化" << std::endl;
web.updata();
app.updata();
}
else if (typeid(*person) == typeid(web_person))
{
std::cout << "web_person 发生变化" << std::endl;
doc.updata();
app.updata();
}
else if (typeid(*person) == typeid(app_person))
{
std::cout << "app_person 发生变化" << std::endl;
doc.updata();
web.updata();
}
}
private:
doc_person doc;
web_person web;
app_person app;
};
}
测试:
基于GoogleTest 的单元测试框架;框架可参考如下网址:
https://www.cnblogs.com/jycboy/p/gtest_catalog.html
TEST(test_mediator_pattern_do_change, success_doc_change)
{
doc_person doc;
mediator_pattern* mediator = new concrete_mediator_pattern();
doc.set_mediator_pattern(mediator);
doc.change();
}
TEST(test_mediator_pattern_do_change, success_web_change)
{
web_person web;
mediator_pattern* mediator = new concrete_mediator_pattern();
web.set_mediator_pattern(mediator);
web.change();
}
总结
(1)中介者是将对象间的交互集中到一个中介者类中
(2)具体中介者类包含了所有同事对象类的成员变量
(3)同事对象触发了中介类的行为,由中介者类调用其它同事类的更新方法