阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

观察者模式和发布订阅模式的区别

33次阅读
没有评论

共计 1686 个字符,预计需要花费 5 分钟才能阅读完成。

导读 之前一直对观察者模式和发布订阅模式的区别理解不深,正好这段时间在看 vue 源码的分析,vue 数据双向绑定也用到了发布订阅模式,于是又把这两者探究了一番,今天做个笔记加强印象。

观察者模式和发布订阅模式最大的区别就是发布订阅模式有个事件调度中心。

观察者模式和发布订阅模式的区别

从图中可以看出,观察者模式中观察者和目标直接进行交互,而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制之类的。还可以做一些节流操作。

接下来看一下代码实现
观察者模式:

// 观察者
class Observer {constructor() { }
    update(val) {}}
// 观察者列表
class ObserverList {constructor() {this.observerList = []
    }
    add(observer) {return this.observerList.push(observer);
    }
    remove(observer) {this.observerList = this.observerList.filter(ob => ob !== observer);
    }
    count() {return this.observerList.length;}
    get(index) {return this.observerList[index];
    }
}
// 目标
class Subject {constructor() {this.observers = new ObserverList();
    }
    addObserver(observer) {this.observers.add(observer);
    }
    removeObserver(observer) {this.observers.remove(observer);
    }
    notify(...args) {let obCount = this.observers.count();
        for (let index = 0; index 

发布订阅模式:

class PubSub {constructor() {this.subscribers = {}
    }
    subscribe(type, fn) {if (!Object.prototype.hasOwnProperty.call(this.subscribers, type)) {this.subscribers[type] = [];}
        
        this.subscribers[type].push(fn);
    }
    unsubscribe(type, fn) {let listeners = this.subscribers[type];
        if (!listeners || !listeners.length) return;
        this.subscribers[type] = listeners.filter(v => v !== fn);
    }
    publish(type, ...args) {let listeners = this.subscribers[type];
        if (!listeners || !listeners.length) return;
        listeners.forEach(fn => fn(...args));        
    }
}

let ob = new PubSub();
ob.subscribe('add', (val) => console.log(val));
ob.publish('add', 1);

从上面代码可以看出,观察者模式由具体目标调度,每个被订阅的目标里面都需要有对观察者的处理,会造成代码的冗余。而发布订阅模式则统一由调度中心处理,消除了发布者和订阅者之间的依赖。

观察者模式跟我们平时用的事件也有一定的关系,比如:

ele.addEventListener('click', () => {});

addEventListener 就相当于注册了一个观察者,当观察到‘click’事件的时候,作出一些处理。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1686字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中