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...

posted @ 2012-11-30 11:32  Onakaumi  阅读(356)  评论(0编辑  收藏  举报