JS 设计模式八 -- 发布订阅者模式

Posted GaoSirs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS 设计模式八 -- 发布订阅者模式相关的知识,希望对你有一定的参考价值。

概念

发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多(一个发布,多个观察)的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。

 

优点

1、支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象。

2、发布者与订阅者耦合性降低

 

缺点

创建订阅者需要消耗一定的时间和内存。

如果过度使用的话,反而使代码不好理解及代码不好维护。

 

代码实现

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);

 

以上是关于JS 设计模式八 -- 发布订阅者模式的主要内容,如果未能解决你的问题,请参考以下文章

为啥要使用发布/订阅模式(在 JS/jQuery 中)?

JS设计模式发布订阅模式

Redis:八发布订阅实现原理

js 高阶函数 发布订阅观察者模式 手撕promise

AngularJS的简单订阅发布模式例子

js设计模式-观察者模式来模拟vue的双向数据绑定