Mediator Design Pattern 中介者模式
就是设计一个Mediator类,能够处理其它类的关系。
Mediator类:
1 拥有其它全部类的实例对象
2 设置一个接口供其它类使用,其它类也拥有一个Mediator类成员,仅仅需调用这个Mediator接口函数使用,无需自己处理关系。
3 Mediator内部已经设置好各个类的关系了,其它类仅仅要直接使用Mediator处理关系就能够了。
以下是一个聊天室聊天是处理关系的实例程序:
进入聊天室的人仅仅须要选定和谁聊天就能够了,无需操心这些信息是怎样传递的,这个已经由Mediator自己主动处理了。
不能对未进入聊天室的人聊天。
能够看出这种代码还是十分简洁清晰的,假设不使用这个模式,那么会臃肿非常多。并且每次send都要写很多其它额外的代码。
使用Mediator设计模式之后,每次仅仅须要send就能够发送信息到须要的人了。
#include <stdio.h>
#include <vector>
#include <string>
using std::string;
using std::vector; class RoomMember; class Mediator
{
protected:
vector<RoomMember *> rms;
public:
virtual void enterRoom(RoomMember *mem)
{
rms.push_back(mem);
}
virtual void send(string mes, RoomMember *rm) = 0;
}; class RoomMember
{
protected:
Mediator *mediator;
public:
string name; RoomMember(Mediator *m, string n) : mediator(m), name(n) {}
virtual void send(string mes, RoomMember *to)
{
printf("%s send a message.\n", name.c_str());
mediator->send(mes, to);
} virtual void notify(string mes)
{
printf("%s got a message: %s\n", name.c_str(), mes.c_str());
}
}; class MessageMediator : public Mediator
{
public:
void send(string mes, RoomMember *mem)
{
auto it = rms.begin();
for ( ; it != rms.end(); it++)
{
if (*it == mem) break;
}
if (it == rms.end()) //不能是*it != mem。由于it == rms.end()为空指针
{
printf("Not member %s in the room\n", mem->name.c_str());
return ;
}
mem->notify(mes);
}
}; int main()
{
Mediator *mediator = new MessageMediator;
RoomMember *Jelly = new RoomMember(mediator, "Jelly");
RoomMember *Kelly = new RoomMember(mediator, "Kelly");
RoomMember *Billy = new RoomMember(mediator, "Billy");
RoomMember *Silly = new RoomMember(mediator, "Silly"); mediator->enterRoom(Jelly);
mediator->enterRoom(Kelly);
mediator->enterRoom(Billy); Jelly->send("How are you?", Kelly);
Kelly->send("Never better.", Jelly);
Jelly->send("Where are you?", Billy);
Kelly->send("What are you doing?", Silly); delete Silly;
delete Kelly;
delete Billy;
delete Jelly;
delete mediator;
return 0;
}
执行:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Mediator Design Pattern 中介者模式的更多相关文章
- Mediator Pattern --中介者模式原理及实现(C++)
主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍中介者模式的实现. 中介者模式:What it is:Define an object that ...
- 【design pattern】代理模式
前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...
- javascript 中mediator pattern(中介者模式)一个实例demo
<!doctype html> <html lang="en"> <head> <title>JavaScript Patterns ...
- 从壹开始 [ Design Pattern ] 之三 ║ 工厂模式 与 小故事
编者按: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使得一个类的实例化延迟到子类. 工厂模式,是迄今为止,使用最多,最广泛的设计模式之一,它的身影几乎出现在每一个框架和个人代码之中 ...
- 设计模式Design Pattern(4) -- 访问者模式
什么是访问者模式? 一个对象有稳定的数据结构,却为不同的访问者提供不同的数据操作,对象提供接收访问者的方法,从而保证数据结构的稳定性和操作的多样性.也可以理解为,封装对象的操作方法,达到不改变对象数据 ...
- Design Pattern Singleton 单一模式
单一模式的几个注意点: 一) 设计单一模式,首先须要把构造函数给私有化了,不让外界訪问,那么外界仅仅能通过提供的函数获取一个新的类. 二) C++的单一模式,记得要在类外初始化一个类,否则或内存出错的 ...
- javascript设计模式--中介者模式(Mediator)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 简单工厂设计模式(Simple Factory Design Pattern)
[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...
- 深入浅出设计模式——中介者模式(Mediator Pattern)
模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...
随机推荐
- 百度jquery公共引用地址
http://cdn.code.baidu.com/ http://apps.bdimg.com/libs/jquery/1.6.4/jquery.js http://apps.bdimg.com/l ...
- 乐字节-Java8核心特性实战-接口默认方法
JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术 ...
- sublime3 install python3
链接地址:https://blog.csdn.net/Ti__iT/article/details/78830040
- javascript 公历与农历相互转换工具类
/** * 公历[1900-1-31,2100-12-31]时间区间内的公历.农历互转 * @charset UTF-8 * @Author Jea杨(JJonline@JJonline.Cn) * ...
- 继承&封装
扩展一个已有的类,并且继承该类的属性和行为这种方式成为继承. 实例 public class Polygon { public int sides; public double area; publi ...
- Ubuntu14.04引导菜单修复
原文链接:http://www.metsky.com/archives/636.html 独立分区下的Ubuntu引导菜单修复有点麻烦,执行挂载等命令时要小心检查,修复此类引导,首先需要确保当前系统和 ...
- windwo下载完nvm无法执行node
安装node版本管理工具之NVM.安装方法:见链接. window安装完后,下载node后,无法执行node.见图(图片从网上找的). 最后问题原因是,1.nvm安装时,安装目录中存在空格. 解决办法 ...
- <轉>APUE:mmap函数
起初 看过一遍内存映射I/O,意思大概是懂了,就是直接操作文件再而直接通过缓冲区来操作,减少一些read.write调用所花费的时间.加上文中给出一个copy的例子,意思也好理解的.不过困扰的来了,我 ...
- Robot Framework(二)测试数据语法
2.1.1文件和目录 测试数据的层次结构安排如下: 测试数据在测试数据文件中创建. 测试数据文件会自动创建一个包含该文件中的测试数据的测试套件. 包含测试数据文件的目录构成了更高级别的测试套件.这样的 ...
- ajax发送请求是图标转圈圈实现
css部分 .load-img{ //控制图标大小width:40px;height:40px;margin:100px;border-radius:50%;-webkit-animation:cir ...