Mediator 模式
我喜欢直接上代码
<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <script type="application/javascript"> /* * subscribe : 注册函数.. * * publish: 执行函数. * * 具体用法: * mediator.subsrcibe("fuName", function(...){....}) * mediator.publish("fnName", ...args); * * mediator 是中枢处理机构, 任何行为都要经过它. * */ var mediator = (function() { /*订阅*/ var subscribe = function(channel, fn) { if (!mediator.channels[channel]) {// 初始化 mediator.channels[channel] = []; } /* 添加一个函数, 当前这个mediator 是this 谁调用subscribe() 谁就是context */ mediator.channels[channel].push({ context: this, callback: fn }); return this; }, /*发行*/ publish = function(channel) { if (!mediator.channels[channel]) {// 如果不存着个函数, 直接返回.因为豁免是为了执行着个函数 return false; } /* call的作用是改变this的指向,就相当于arguments调用了,slice 这个方法。0就是start=0,end没指定,所以返回整个arguments,这个时候就转换成数组了。 */ /* 这里 call(arguments, 1),表示将channel 去掉, 留下剩下的所有参数 */ var args = Array.prototype.slice.call(arguments, 1); // 将原来的参数转换成数组 // 如果对应的一个channel push了多次,也就是添加了多个处理函数. 这些函数都得到执行 for (var i = 0, l = mediator.channels[channel].length; i < l; i++) { /* subscription = {context: "调用callback的对象". callback: "这是一个函数"}; */ var subscription = mediator.channels[channel][i]; /* 本例就是 this.callback("david") mediator.nameChanged("david"); */ subscription.callback.apply(subscription.context, args); } return this; }; return { channels: {}, publish: publish, subscribe: subscribe, installTo: function(obj) { obj.subscribe = subscribe; obj.publish = publish; } }; } ()); //Pub/sub on a centralized mediator mediator.name = "tim"; mediator.subscribe('nameChange', function(arg) { alert("before: " + this.name); this.name = arg; alert("after: " + this.name); }); mediator.subscribe('nameChange', function(arg) { alert("before1: " + this.name); this.name = arg; alert("after1: " + this.name); }); mediator.publish('nameChange', 'david');//tim, david /** //Pub/sub via third party mediator var obj = { name: 'sam' }; mediator.installTo(obj); obj.subscribe('nameChange', function(arg) { alert(this.name); this.name = arg; alert(this.name); }); obj.publish('nameChange', 'john'); //sam, john */ </script> </head> <body> </body> </html>
ok...