就是设计一个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. Gridview表格控件

    Gridview表格控件 效果图: 分析: 使用和ListvVew很像,都是经过适配器将数据绑定到控件上 具体步骤如下: 1.创建GridView控件,并指定列数 android:numColumns ...

  2. Super超级ERP系统---(5)采购管理--采购入库

    采购商品完成后,下一步要进行入库操作.为了做到精细化管理,入库操作主要分以下几个步骤,采购到货确认,采购入库,入库完成.接下来我们看看这些步骤是怎样实现的. 1.到货确认 采购商品到达仓库后,仓库收货 ...

  3. Tomcat web deploy

    环境: apache-tomcat-7.0.73 java version "1.8.0_112" 创建普通用户,使用 sudu进行操作 JDK 配置 下载地址:http://ww ...

  4. IE浏览器缓存导致Ajax请求失败

    在IE浏览器中通过Ajax请求后台的数据,如果Page请求是postback类型的,可能会导致Ajax请求失败的问题 我们都知道ajax能提高页面载入的速度主要的原因是通过ajax减少了重复数据的载入 ...

  5. css浮动导致的高度塌陷问题及清楚浮动的方法

    浮动很好用,但是用浮动后,当浮动元素的父级元素没有高度时,就会造成高度塌陷,从而影响布局.下面就从一开接触前端时,渐渐发现解决高度塌陷的问题的方式. 一.给浮动元素的父级元素添加固定的高度css[he ...

  6. js---通过arguments来获取指定参数

    通过访问arguments对象的length属性可以获取有多少个参数传递给了函数. 如:每次被调用的时候,输出传入其中的参数个数 function doAdd(){ alert(arguments.l ...

  7. Charles设置抓取https请求

    1.在手机上设置HTTP代理,将手机与电脑连接. 打开手机设置-WLAN,设置代理 2.(iPhone)使用iPhone自带的浏览器打开Safari,并输入地址:http://charlesproxy ...

  8. apk回编译问题汇总(阶段)

    反编译apk,在smali中注入一段自己的代码. 试了几个工具(apkdb.apktool.apkSign), 发现反编译都可以,但是回编译都不兼容java1.8,导致回编译成功,但apk没有签名,不 ...

  9. poj3281 Dining 最大流(奇妙的构图)

    我是按照图论500题的文档来刷题的,看了这题怎么也不觉得这是最大流的题目.这应该是题目做得太少的缘故. 什么是最大流问题?最大流有什么特点? 最大流的特点我觉得有一下几点: 1.只有一个起点.一个终点 ...

  10. 【Oracle】手工建库启动到nomount状态时错误ORA-09925,ORA-01017

    配置好pfile和口令文件后启动数据库到nomount状态下出现错误: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2 ...