就是设计一个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 中介者模式的更多相关文章

  1. Mediator Pattern --中介者模式原理及实现(C++)

    主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍中介者模式的实现. 中介者模式:What it is:Define an object that ...

  2. 【design pattern】代理模式

    前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...

  3. javascript 中mediator pattern(中介者模式)一个实例demo

    <!doctype html> <html lang="en"> <head> <title>JavaScript Patterns ...

  4. 从壹开始 [ Design Pattern ] 之三 ║ 工厂模式 与 小故事

    编者按: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使得一个类的实例化延迟到子类. 工厂模式,是迄今为止,使用最多,最广泛的设计模式之一,它的身影几乎出现在每一个框架和个人代码之中 ...

  5. 设计模式Design Pattern(4) -- 访问者模式

    什么是访问者模式? 一个对象有稳定的数据结构,却为不同的访问者提供不同的数据操作,对象提供接收访问者的方法,从而保证数据结构的稳定性和操作的多样性.也可以理解为,封装对象的操作方法,达到不改变对象数据 ...

  6. Design Pattern Singleton 单一模式

    单一模式的几个注意点: 一) 设计单一模式,首先须要把构造函数给私有化了,不让外界訪问,那么外界仅仅能通过提供的函数获取一个新的类. 二) C++的单一模式,记得要在类外初始化一个类,否则或内存出错的 ...

  7. javascript设计模式--中介者模式(Mediator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 简单工厂设计模式(Simple Factory Design Pattern)

    [引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...

  9. 深入浅出设计模式——中介者模式(Mediator Pattern)

    模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...

随机推荐

  1. 摘要提取算法——本质上就是pagerank,选择rank最高的句子作为摘要,如果结合word2vec应该有非常好的效果

    最近需要做一些文本摘要的东西,选取了TextRank(论文参见<TextRank: Bringing Order into Texts>)作为对比方案,该方案可以很方便的使用Python相 ...

  2. [JavaEE] Spring学习资源链接

    学习规划 http://forrest-lv.iteye.com/blog/1166947 SpringMVC - 框架配置 http://blog.csdn.net/ljhabc1982/artic ...

  3. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算法! 它的优点包括但不限于: 遗传算法对所求解的优化问题没有太多的 ...

  4. Docker 配置与实践清单

    https://mp.weixin.qq.com/s/yeEkF5DKa9IjmIvuzOTT3g

  5. React安装 脚手架create-react-app安装步骤及问题

    create-react-app 是来自于 Facebook的脚手架,通过该命令我们无需配置就能快速构建 React 开发环境. 安装步骤: 1.先装脚手架     PS:第一次装直接在打开CMD默认 ...

  6. 在django中应用装饰器(一)

    在新写的博客应用中,涉及很多关于权限的问题,比如修改用户信息,博客的修改与删除,虽然默认的提交信息都是session的用户,但是也应该防止一下篡改提交的可能,之前想的是在每个view中加一段判断的逻辑 ...

  7. JavaScript中的工厂方法、构造函数与class

    JavaScript中的工厂方法.构造函数与class 本文转载自:众成翻译 译者:谢于中 链接:http://www.zcfy.cc/article/1129 原文:https://medium.c ...

  8. Apex语言(二)变量与常量

    1.变量 凡是交给计算运算(处理)的数据就是变量,用来保存参加运算的数据和计算结果. 变量由变量名来标识. 变量名由字母数字和下划线组成,不能以数字开头. [正确]number,number1,num ...

  9. 团体程序设计天梯赛-练习集-L1-028. 判断素数

    L1-028. 判断素数 本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(<=10),随后N行,每行给出一个小于231的需要判断的正整数. 输出格 ...

  10. Windows批量查找文件

    for /r 目录名 %i in (匹配模式1,匹配模式2) do @echo %i for /r SATA %i in (*.txt) do @echo %i D:\REY\test>for ...