观察者模式和发布订阅模式

// 观者着应该有:一个消息容器和三个方法,三个方法分别是:
// 订阅消息的方法,取消订阅的消息方法,发布订阅消息的方法

/**
 * 消息注册的方法,注册方法的作用就是将订阅者注册的消息推入到消息队列中,因此我们需要两个参数
 * 消息类型以及相应的处理动作,在推入到消息队列时,如果此消息不存在则应该创建一个消息类型并将
 * 该消息放入消息队伍中,如果此消息存在则应该将消息执行方法推入该消息对应的执行方法队伍中,
 * 这么做的目的也是保证多个模块注册同一则消息时能顺利执行
 * / 

/**
 * 将观察者放在闭包中,当页面加载就立即执行
 */

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) {
                // 如果该消息没有被注册,则返回
                console.log(_message)
                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 (type, fn) {
                if(_message[type] instanceof Array) {
                    var i = _message[type].length -1;
                    for (; i >=0; i--) {
                        _message[type][i]  === fn && _message[type].splice(i, 1);
                    }
                }
                console.log('已经删除了');
                console.log(_message);
            }

    }
}

var testObs = Observer();
function testFn (e) {
    console.log(e.type, e.args.msg);
}

testObs.regist('test', testFn);

testObs.fire('test', {msg: '传递测试参数'});

testObs.remove('test', testFn)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值