深入理解JavaScript系列(36):设计模式之中介者模式详解
介绍
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要内容来自:http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript
正文
软件开发中,中介者是一个行为设计模式,通过提供一个统一的接口让系统的不同部分进行通信。一般,如果系统有很多子模块需要直接沟通,都要创建一个中央控制点让其各模块通过该中央控制点进行交互。中介者模式可以让这些子模块不需要直接沟通,而达到进行解耦的目的。
打个比方,平时常见的机场交通控制系统,塔台就是中介者,它控制着飞机(子模块)的起飞和降落,因为所有的沟通都是从飞机向塔台汇报来完成的,而不是飞机之前相互沟通。中央控制系统就是该系统的关键,也就是软件设计中扮演的中介者角色。
我们先用伪代码来理解一下:
//如下代码是伪代码,请不要过分在意代码 //这里app命名空间就相当于扮演中介者的角色 varapp=app||{}; //通过app中介者来进行Ajax请求 app.sendRequest=function(options){ return$.ajax($.extend({},options); } //请求URL以后,展示View app.populateView=function(url,view){ $.when(app.sendRequest({url:url,method:'GET'}) .then(function(){ //显示内容 }); } //清空内容 app.resetView=function(view){ view.html(''); }
在JavaScript里,中介者非常常见,相当于观察者模式上的消息Bus,只不过不像观察者那样通过调用pub/sub的形式来实现,而是通过中介者统一来管理,让我们在观察者的基础上来给出一个例子:
varmediator=(function(){ //订阅一个事件,并且提供一个事件触发以后的回调函数 varsubscribe=function(channel,fn){ if(!mediator.channels[channel])mediator.channels[channel]=[]; mediator.channels[channel].push({context:this,callback:fn}); returnthis; },
//广播事件 publish=function(channel){ if(!mediator.channels[channel])returnfalse; varargs=Array.prototype.slice.call(arguments,1); for(vari=0,l=mediator.channels[channel].length;i<l;i++){ varsubscription=mediator.channels[channel][i]; subscription.callback.apply(subscription.context,args); } returnthis; };
return{ channels:{}, publish:publish, subscribe:subscribe, installTo:function(obj){ obj.subscribe=subscribe; obj.publish=publish; } };
}());