JS 設計模式八 -- 發佈訂閱者模式

概念

發佈---訂閱模式又叫觀察者模式,它定義了對象間的一種一對多(一個發佈,多個觀察)的關係,讓多個觀察者對象同時監聽某一個主題對象,當一個對象發生改變時,全部依賴於它的對象都將獲得通知。緩存

 

優勢

一、支持簡單的廣播通訊,當對象狀態發生改變時,會自動通知已經訂閱過的對象。app

二、發佈者與訂閱者耦合性下降this

 

缺點

建立訂閱者須要消耗必定的時間和內存。spa

若是過分使用的話,反而使代碼很差理解及代碼很差維護。prototype

 

代碼實現

var Event = (function(){
    var list = {}, // 緩存訂閱者列表
          listen,   // 訂閱
          trigger,  // 發佈訂閱
          remove;   // 移除訂閱
          listen = function(key,fn){
            if(!list[key]) {
                list[key] = [];
            }
            list[key].push(fn);
        };
        trigger = function(){
            var key = Array.prototype.shift.call(arguments),
                 fns = list[key];
            if(!fns || fns.length === 0) {
                return false;
            }
            for(var i = 0, fn; fn = fns[i++];) {
                fn.apply(this,arguments);
            }
        };
        remove = function(key,fn){
            var fns = list[key];
            if(!fns) {
                return false;
            }
            if(!fn) {
                fns && (fns.length = 0);
            }else {
                for(var i = fns.length - 1; i >= 0; i--){
                    var _fn = fns[i];
                    if(_fn === fn) {
                        fns.splice(i,1);
                    }
                }
            }
        };
        return {
            listen: listen,
            trigger: trigger,
            remove: remove
        }
})();
// 訂閱:
Event.listen("color",function(size) {
    console.log("尺碼爲:"+size); // 打印出尺碼爲42
});// 發佈
Event.trigger("color",42);
相關文章
相關標籤/搜索