中介者模式:定义了一个对象。用来封装一系列对象的交互。中介者模式通过使对象之间不必显式引用减少了对象之间的耦合,而且同意你独立改变它们之间的交互。
中介者模式就是将对象之间的交互封装在了一个独立的对象中。这个独立的对象用来控制对象之间的交互行为,所以这个对象还是蛮复杂的。
UML类图:
主要包含:
- Mediator:定义了一个Colleague对象之间交互的接口。
- ConcreteMediator:实现了Colleague对象之间的交互行为,并了解和能操作Colleague对象。
- Colleague classes:每个Colleague都认识Mediator对象。而且通过Mediator来实现彼此之间的通讯。
基础C++代码例如以下:
#include #include using namespace std;class Colleague;class Mediator{ public: virtual void send(string message,Colleague * c)=0;};class Colleague{ public: Colleague(Mediator *m) { mediator=m; } void send(string message) { mediator->send(message,this); } virtual void notify(string message)=0; protected: Mediator * mediator;};class ConcreteColleague1:public Colleague{ public: ConcreteColleague1(Mediator * c):Colleague(c) { } void notify(string message) { cout<<"concreteColleague1 receive message:"< < (c); ConcreteColleague2* c2=dynamic_cast (c); if(c1!=NULL) { cc2->notify(message); } if(c2!=NULL) { cc1->notify(message); } } void setCC1(ConcreteColleague1 * c) { cc1=c; } void setCC2(ConcreteColleague2 * c) { cc2=c; } private: ConcreteColleague1 * cc1; ConcreteColleague2 * cc2;};int main(){ ConcreteMediator *m=new ConcreteMediator(); ConcreteColleague1 * cc1=new ConcreteColleague1(m); ConcreteColleague2 * cc2=new ConcreteColleague2(m); m->setCC1(cc1); m->setCC2(cc2); cc1->send("how are you !"); cc2->send("fine ,thank you"); return 0;}
运行输出:
一个使用中介者模式的聊天室的样例。
这里实现了Mediator和Colleague的一对多的聚合关系。这种中介者模式才是有意义的使用方式。
UML类图:
C++代码例如以下:
#include #include
运行输出: