定义javascript
定义一个对象,它封装一组相互做用的对象。中介者促使对象之间保持通信可是又松耦合,你能够很独立的改变他们的相互做用。java
提要函数
中介者提供一个权威中心,用来控制一组对象之间的相互做用。这种模式在这种情境下是很是有用的:在一个复杂的环境里的每个对象都很但愿清楚其余对象的任何状态变化。this
中介者模式在开发复杂的表单中很是有用。举一个列子,在一个页面上,你但愿预约一个航班;一个简单的中介者规则就是:你必须输入一个有效的出发时间,一个有效的返回时间,返回时间必须晚于出发时间,一个有效的起飞机场,一个有效的降落机场,一个有效的旅行者证件号码,只要这些知足以后,搜索或者提交按钮才能被激活变为可用。prototype
另外一个中介者的例子就是飞机场协调起飞和降落的调度中心。对象
图标说明blog
一个聊天室的例子接口
Javascript 示例代码ip
在示例代码中,有4个参与者经过注册的方式被添加到了聊天室(中介者)的会话当中。参与者能够给彼此发送消息,聊天室接手控制着相互之间的路由。
这个例子是很简单的,可是能够继续添加复杂的规则,好比垃圾信息过滤,用来避免参与者接收到垃圾信息。ci
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