定义
定义一个对象,它封装一组相互作用的对象。中介者促使对象之间保持通讯但是又松耦合,你可以很独立的改变他们的相互作用。
提要
中介者提供一个权威中心,用来控制一组对象之间的相互作用。这种模式在这种情境下是非常有用的:在一个复杂的环境里的每一个对象都很希望清楚其他对象的任何状态变化。
中介者模式在开发复杂的表单中非常有用。举一个列子,在一个页面上,你希望预定一个航班;一个简单的中介者规则就是:你必须输入一个有效的出发时间,一个有效的返回时间,返回时间必须晚于出发时间,一个有效的起飞机场,一个有效的降落机场,一个有效的旅行者证件号码,只要这些满足之后,搜索或者提交按钮才能被激活变为可用。
另一个中介者的例子就是飞机场协调起飞和降落的调度中心。
图标说明
一个聊天室的例子
- 中介者 -- 在下面的示例代码中: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