林秀栋的技术博客

设计模式(九) 观察者模式

//在不影响其他闭包的情况下写入新功能

var Observer = (function(){
    var _message = {};
    return {
        regist: function(type, fn){
            if(typeof _message[type] === 'undefined'){
                _message[type] = [fn];
            }else{
                _message[type].push(fn);
            }
        },
        fire: function(type, args){
            if(!_message[type]){
                return;
            }
            var events = {
                type: type,
                args: args || {}
            },
                i = 0,
                len = _message[type].length;
            for(; i < len; i++){
                _message[type][i].call(this, events);
            }
        },
        remove: function(){
            if(_message[type] instanceof Array){
                var i = _message[type].length - 1;
                for(; i >= 0; i--){
                    _message[type][i] === fn && _message[type].splice(i, 1);
                }
            }
        }
    }
})();

//project A
(function(){
    function add(){
        console.log('add11');
    }
    Observer.regist('add', add);
})();

//project B
(function(){
    $('button').click(function(){
        Observer.fire('add', null);
    })
})();