定义

定义一个对象,它封装一组相互作用的对象。中介者促使对象之间保持通讯但是又松耦合,你可以很独立的改变他们的相互作用。

提要

中介者提供一个权威中心,用来控制一组对象之间的相互作用。这种模式在这种情境下是非常有用的:在一个复杂的环境里的每一个对象都很希望清楚其他对象的任何状态变化。

中介者模式在开发复杂的表单中非常有用。举一个列子,在一个页面上,你希望预定一个航班;一个简单的中介者规则就是:你必须输入一个有效的出发时间,一个有效的返回时间,返回时间必须晚于出发时间,一个有效的起飞机场,一个有效的降落机场,一个有效的旅行者证件号码,只要这些满足之后,搜索或者提交按钮才能被激活变为可用。

另一个中介者的例子就是飞机场协调起飞和降落的调度中心。

图标说明

一个聊天室的例子

  • 中介者 -- 在下面的示例代码中:Chartroom

    •   定义参与对象之间通讯接口
    •   持有所有参与者的引用
    •   整个运作的管理调度中心
  • 参与者 -- 在下面的示例代码中: Participants
    •   被中介者调度的对象
    •   每个对象实例都持有中介者的引用

Javascript 示例代码

在示例代码中,有4个参与者通过注册的方式被添加到了聊天室(中介者)的会话当中。参与者可以给彼此发送消息,聊天室接手控制着相互之间的路由。
这个例子是很简单的,但是可以继续添加复杂的规则,比如垃圾信息过滤,用来避免参与者接收到垃圾信息。

log 方法是一个助手程序,帮助收集和展示结果。

var Participant = function(name){
this.name = name;
this.chartroom = null;
} Participant.prototype = {
send: function(message, to){
//发送方法一般用来向中介者发送消息,告诉中介者我哪些状态发生了变化,让中介者来决定做些什么
this.chartroom.send(message, this, to);
},
receive: function(message, from){
//接受方法一般用来收到中介者的消息之后,做些什么
//下面就是让log把信息收集起来
log.add(from.name + ' to ' + this.name + ': ' + message);
}
} var Chartroom = function(){
//这里定义了一个中介者Chartroom var participants = {}; //用来收集持有参与者的一个变量容器
return { //返回对外暴露的接口
register: function(participant){
participants[participant.name] = participant;
participant.chartroom = this; //把自己这个中介者的引用传给参与者,让参与者持有中介者的引用,让参与者自己知道他的leader是谁
},
send: function(message, from, to){
if(to){
to.receive(message, from);
}else{
for(var key in participants){
if(participants[key] !== from){
participants[key].receive(message, from);
}
}
}
}
};
} //为什么log首字母,是因为后面是一个立即执行的函数,执行完之后,log被赋值了一个对象,所以log是个对象,要小写
var log = (function(){
var log = ''; //相当于用于记录log信息的数据文件
return {
add: function(msg){ log += msg + '\n';},
show: function(){ alert(log); log = '';} //输出log信息,同时清空log文件中的内容
};
})(); function run() {
var yoko = new Participant('Yoko');
var john = new Participant('John');
var paul = new Participant('Paul');
var ringo = new Participant('Ringo'); var chartroom = new Chartroom(); chartroom.register(yoko);
chartroom.register(john);
chartroom.register(paul);
chartroom.register(ringo); yoko.send('All you need is love.');
yoko.send('I love you John.');
john.send('Hey, no need to broadcast', yoko);
paul.send('Ha, I heard that!');
ringo.send('Poul, what do you think?', paul); log.show();
}

运行的结果:

  

参考引用:http://www.dofactory.com/javascript-mediator-pattern.aspx

javascript mediator pattern的更多相关文章

  1. JavaScript Module Pattern: In-Depth

    2010-03-12 JavaScript Module Pattern: In-Depth The module pattern is a common JavaScript coding patt ...

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

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

  3. 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...

  4. [Design Pattern] Mediator Pattern 简单案例

    Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...

  5. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  6. 第17章 中介者模式(Mediator Pattern)

    原文 第17章 中介者模式(Mediator Pattern) 中介者模式  概述:   在软件开发中,我们有时会碰上许多对象互相联系互相交互的情况,对象之间存在复杂的引用关系,当需求更改时,对系统进 ...

  7. JavaScript module pattern精髓

    JavaScript module pattern精髓 avaScript module pattern是一种常见的javascript编码模式.这种模式本身很好理解,但是有很多高级用法还没有得到大家 ...

  8. C#设计模式之十八中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看.“中介者模式”我第一次看到这个名称,我的理解 ...

  9. C#设计模式之十七中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看.“中介者模式”我第一次看到这个名称,我的理解 ...

随机推荐

  1. Java下Elasticsearh应用指南

    简介 本文针对在Java下操作elasticsearch给出应用示例,主要涉及创建连接,构建索引以及检索数据3个部分. 环境 1)elasticsearch2.4.4, 2)jdk1.8. 客户端连接 ...

  2. DRUPAL 关于 $user 用户权限

    按登录非登录判断: < ?php global $user;/*是否为登录用户*/ if ($user -> uid){/*如果是当前浏览者为登录用户则显示下面的内容*/ print ; ...

  3. 利用cURL会话获取一个网页

    1.curl_init 作用:     初始化一个新的会话.返回一个cURL句柄,供curl_setopt(), curl_exec()和curl_close() 函数使用. 格式:    curl_ ...

  4. Linux下编辑利器vim,vimrc,viminfo的高级用法

    1.ci" (由 change operator 和 text-object i" 组成) 这个命令会找到当前光标所在行的下一个 " 括起来的字符串,清除引号裏面的内容, ...

  5. 从gentoo回归Arch,上组图

    Arch一直在我笔记本里边,只是玩gentoo时我不进Arch了,现在回归Arch,升级到了最新,用上了gentoo的最新的2.6.31内核(自己配置,无initrd),引导程序用的grub4dos: ...

  6. 用setitimer实现多个定时器

    从这篇文章中可以看出,setitimer只能实现一个定时器,如果多次调用setitimer,旧值都会被覆盖掉. 如何用setitimer实现多个定时器呢?下面是我的一个实现,具体的方法是: 用链表从小 ...

  7. Python中 append 和 extend 的区别

    Python中Lists 的两个方法: append 和 extend : list.append(object) 向列表中添加一个对象object.append 接受一个参数,这个参数可以是任何数据 ...

  8. DPDK架构与特点

    当年在某公司实习的时候,当时老大给了我一份DPDK的文档,说是将来很有用,熟悉DPDK对能力提高也有帮助,就试着翻译了 <Intel DPDK Getting Started Guide> ...

  9. RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)[转]

    上篇文章中,我们把每个Message都是deliver(提供)到某个Consumer.在这篇文章中,我们将会将同一个Message deliver(提供)到多个Consumer中.这个模式也被成为 & ...

  10. RabbitMQ与.net core(一)安装

    一.安装Erlang环境 前提:erlang版本与rabbitmq版本需按照要求对应!!! 1.在安装erlang之前先安装下依赖文件(这一步不要忘掉了, 不然后面./configure的时候要报错) ...