中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
中介者模式包含如下角色:
#include <iostream> #include "ConcreteColleagueA.h" #include "ConcreteMediator.h" #include "ConcreteColleagueB.h" using namespace std; int main(int argc, char *argv[]) { ConcreteColleagueA * pa = new ConcreteColleagueA(); ConcreteColleagueB * pb = new ConcreteColleagueB(); ConcreteMediator * pm = new ConcreteMediator(); pm->registered(1,pa); pm->registered(2,pb); // sendmsg from a to b pa->sendmsg(2,"hello,i am a"); // sendmsg from b to a pb->sendmsg(1,"hello,i am b"); delete pa,pb,pm; return 0; }
/////////////////////////////////////////////////////////// // ConcreteMediator.h // Implementation of the Class ConcreteMediator // Created on: 07-十月-2014 21:30:47 // Original author: colin /////////////////////////////////////////////////////////// #if !defined(EA_8CECE546_61DD_456f_A3E7_D98BC078D8E8__INCLUDED_) #define EA_8CECE546_61DD_456f_A3E7_D98BC078D8E8__INCLUDED_ #include "ConcreteColleagueB.h" #include "Mediator.h" #include "ConcreteColleagueA.h" #include <map> using namespace std; class ConcreteMediator : public Mediator { public: ConcreteMediator(); virtual ~ConcreteMediator(); virtual void operation(int nWho,string str); virtual void registered(int nWho, Colleague * aColleague); private: map<int,Colleague*> m_mpColleague; }; #endif // !defined(EA_8CECE546_61DD_456f_A3E7_D98BC078D8E8__INCLUDED_)
/////////////////////////////////////////////////////////// // ConcreteMediator.cpp // Implementation of the Class ConcreteMediator // Created on: 07-十月-2014 21:30:48 // Original author: colin /////////////////////////////////////////////////////////// #include "ConcreteMediator.h" #include <map> #include <iostream> using namespace std; ConcreteMediator::ConcreteMediator(){ } ConcreteMediator::~ConcreteMediator(){ } void ConcreteMediator::operation(int nWho,string str){ map<int,Colleague*>::const_iterator itr = m_mpColleague.find(nWho); if(itr == m_mpColleague.end()) { cout << "not found this colleague!" << endl; return; } Colleague* pc = itr->second; pc->receivemsg(str); } void ConcreteMediator::registered(int nWho,Colleague * aColleague){ map<int,Colleague*>::const_iterator itr = m_mpColleague.find(nWho); if(itr == m_mpColleague.end()) { m_mpColleague.insert(make_pair(nWho,aColleague)); //同时将中介类暴露给colleague aColleague->setMediator(this); } }
/////////////////////////////////////////////////////////// // ConcreteColleagueA.h // Implementation of the Class ConcreteColleagueA // Created on: 07-十月-2014 21:30:47 // Original author: colin /////////////////////////////////////////////////////////// #if !defined(EA_79979DD4_1E73_46db_A635_E3F516ACCE0A__INCLUDED_) #define EA_79979DD4_1E73_46db_A635_E3F516ACCE0A__INCLUDED_ #include "Colleague.h" class ConcreteColleagueA : public Colleague { public: ConcreteColleagueA(); virtual ~ConcreteColleagueA(); virtual void sendmsg(int toWho,string str); virtual void receivemsg(string str); }; #endif // !defined(EA_79979DD4_1E73_46db_A635_E3F516ACCE0A__INCLUDED_)
/////////////////////////////////////////////////////////// // ConcreteColleagueA.cpp // Implementation of the Class ConcreteColleagueA // Created on: 07-十月-2014 21:30:47 // Original author: colin /////////////////////////////////////////////////////////// #include "ConcreteColleagueA.h" #include <iostream> using namespace std; ConcreteColleagueA::ConcreteColleagueA(){ } ConcreteColleagueA::~ConcreteColleagueA(){ } void ConcreteColleagueA::sendmsg(int toWho,string str){ cout << "send msg from colleagueA,to:" << toWho << endl; m_pMediator->operation(toWho,str); } void ConcreteColleagueA::receivemsg(string str){ cout << "ConcreteColleagueA reveivemsg:" << str <<endl; }
运行结果:
中介者模式可以使对象之间的关系数量急剧减少。
中介者承担两方面的职责:
时序图
实例:虚拟聊天室
某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。该聊天室可以对不雅字符进行过滤,如“日”等字符;还可以对发送的图片大小进行控制。用中介者模式设计该虚拟聊天室。
中介者模式的优点
中介者模式的缺点
在以下情况下可以使用中介者模式:
MVC架构中控制器
Controller 作为一种中介者,它负责控制视图对象View和模型对象Model之间的交互。如在Struts中,Action就可以作为JSP页面与业务对象之间的中介者。
中介者模式与迪米特法则
中介者模式与GUI开发
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8