设计模式之二十一:中介者模式(Mediator)
来源:互联网 发布:抢车位怎么恢复数据 编辑:程序博客网 时间:2024/05/16 17:16
中介者模式:定义了一个对象,用来封装一系列对象的交互。中介者模式通过使对象之间不必显式引用降低了对象之间的耦合,并且允许你独立改变它们之间的交互。
中介者模式就是将对象之间的交互封装在了一个独立的对象中,这个独立的对象用来控制对象之间的交互行为,所以这个对象还是蛮复杂的。
UML类图:
主要包括:
- Mediator:定义了一个Colleague对象之间交互的接口。
- ConcreteMediator:实现了Colleague对象之间的交互行为,并了解和能操作Colleague对象。
- Colleague classes:每一个Colleague都认识Mediator对象,并且通过Mediator来实现彼此之间的通讯。
基础C++代码如下:
#include <iostream>#include <string>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:"<<message<<endl; }};class ConcreteColleague2:public Colleague{ public: ConcreteColleague2(Mediator *m):Colleague(m) { } void notify(string message) { cout<<"concreteColleague2 receive message:"<<message<<endl; }};class ConcreteMediator:public Mediator{ public: void send(string message,Colleague * c) { ConcreteColleague1* c1=dynamic_cast<ConcreteColleague1 *>(c); ConcreteColleague2* c2=dynamic_cast<ConcreteColleague2 *>(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 <iostream>#include <map>#include <string>using namespace std;class Participant;class AbstractChatRoom{ public: virtual void registe(Participant * p)=0; virtual void send(string from,string to ,string message)=0;};class ChatRoom:public AbstractChatRoom{ public: void registe(Participant * p); void send(string from,string to ,string message); private: map<Participant *,string> participants;};class Participant{ public: Participant(string n=""):name(n) { } string getName() { return name; } void setChatRoom(ChatRoom *c) { chatRoom=c; } void send(string to,string message) { chatRoom->send(name,to,message); } virtual void receive(string from,string message) { cout<<from<<" to "<<name<<" : "<<message<<endl; } private: string name; ChatRoom * chatRoom;};void ChatRoom::registe(Participant * p) { if(!participants.count(p)) { participants.insert(pair<Participant *,string>(p,p->getName())); } p->setChatRoom(this); } void ChatRoom::send(string from,string to ,string message) { map<Participant *,string>::iterator iter; for(iter=participants.begin();iter!=participants.end();iter++) { if(iter->second==to) break; } if(iter!=participants.end()) { iter->first->receive(from,message); } }class Beatle:public Participant{ public: Beatle(string n=""):Participant(n) { } void receive(string from,string message) { cout<<"to a beatle : "; Participant::receive(from,message); }};class NonBeatle:public Participant{ public: NonBeatle(string n=""):Participant(n) { } void receive(string from,string message) { cout<<"to a non-beatle : "; Participant::receive(from,message); }};int main(){ cout<<"聊天室中介者模式代码"<<endl; ChatRoom * chatRoom=new ChatRoom(); Participant *george=new Beatle("George"); Participant *paul=new Beatle("Paul"); Participant *ringo=new Beatle("Ringo"); Participant *john=new Beatle("John"); Participant *yoko=new NonBeatle("Yoko"); chatRoom->registe(george); chatRoom->registe(paul); chatRoom->registe(ringo); chatRoom->registe(john); chatRoom->registe(yoko); yoko->send("John","hi John!"); paul->send("Ringo","All you need is love"); ringo->send("George","My sweet Lord"); paul->send("John","can not buy me love"); john->send("Yoko","My sweet love"); return 0;}
执行输出:
0 0
- 设计模式之二十一:中介者模式(Mediator)
- 设计模式实现(二十一)---中介者模式(Mediator)
- 设计模式之Mediator中介者模式
- 设计模式之中介者模式(Mediator)
- 设计模式之中介者模式,mediator
- 设计模式之中介者模式(Mediator)
- 设计模式之中介者模式(Mediator)
- 设计模式之中介者模式Mediator
- 设计模式之中介者模式(Mediator)
- 设计模式之Mediator(中介者)
- 设计模式之Mediator(中介者)
- 设计模式之Mediator(中介者)
- 设计模式之Mediator(中介者)
- 设计模式之十八------Mediator(中介者)
- 设计模式之Mediator(中介者)
- 设计模式(十九)之Mediator(中介者)
- GOF设计模式之MEDIATOR(中介者)
- C++设计模式之二十一--Mediator中介者模式、Interpreter解释器模式、Flyweight享元模式、Memento备忘录模式
- 数据库 UPDATE多条记录不同值,同时UPDATE多个字段
- 18分钟看懂TED
- ARC下查看对象的引用计数
- java序列化与反序列化
- Mediawiki 使用
- 设计模式之二十一:中介者模式(Mediator)
- MyEclipse各种好用的自定义配置(SVN, JDK, Maven, Tomcat, 自动补全, UTF-8, 字体等)
- 序列化和反序列化( 二)
- Java Web应用程序:Oozie及其使用方式
- Material Design控件使用(一)
- 开源运动的破坏性效应
- Material Design控件使用(二)
- 处处可导 但导函数不连续的例子
- Var Function(_JX_)