博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之二十一:中介者模式(Mediator)
阅读量:6709 次
发布时间:2019-06-25

本文共 4076 字,大约阅读时间需要 13 分钟。

中介者模式:定义了一个对象。用来封装一系列对象的交互。中介者模式通过使对象之间不必显式引用减少了对象之间的耦合,而且同意你独立改变它们之间的交互。

中介者模式就是将对象之间的交互封装在了一个独立的对象中。这个独立的对象用来控制对象之间的交互行为,所以这个对象还是蛮复杂的。

UML类图:

这里写图片描写叙述

主要包含:

  1. Mediator:定义了一个Colleague对象之间交互的接口。
  2. ConcreteMediator:实现了Colleague对象之间的交互行为,并了解和能操作Colleague对象。
  3. 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
#include
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
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<
<<" to "<
<<" : "<
<
(p,p->getName())); } p->setChatRoom(this); } void ChatRoom::send(string from,string to ,string message) { map
::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<<"聊天室中介者模式代码"<
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;}

运行输出:

这里写图片描写叙述

你可能感兴趣的文章
LVM配置与管理
查看>>
RAC节点服务ora.rac2.gsd的offline问题解决方法
查看>>
SharedPreferences小细节
查看>>
Configuring Default-network for EIGRP
查看>>
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记32 NSNotification
查看>>
【嵌入式】探究bootloader,分析u-boot源码
查看>>
Oracle数据库通过定义TYPE及Member对象来实现日志信息的分级管理
查看>>
pb之autocommit
查看>>
UDT拥塞控制算法
查看>>
Bsidesiowa 2015 Track2: Secure Process Isolation With Docker By Greg Rice
查看>>
解决开机 svchost.exe 进程占用居高不下的问题
查看>>
如何控制某个方法允许并发访问线程的个数?
查看>>
Android2.2 API 中文文档系列(2) —— EditText
查看>>
openstack iptables
查看>>
Matlab中的ans小结
查看>>
三行代码接入,社交软件打字时底下弹出的表情布局,自定义ViewPager+页面点标+各种功能的android小框架。...
查看>>
nginx学习总结二(nginx的启动停止以及版本平滑升级)
查看>>
linux网卡绑定
查看>>
fastjson报java.lang.ClassNotFoundError
查看>>
Microsoft Dynamics CRM server 2013 系统和SQL server 备份 为升级 CRM 2015版本准备
查看>>