对于观察者模式和发布者-订阅者模式的一些理解 曾经终败给现在 2022-01-17 22:19 306阅读 0赞 最近在试读vue的源码(vue3都要出来了,vue2的源码还没去读,惭愧惭愧),发现自己对观察者以及发布者-订阅者模式的理解不够,立文来梳理记录一下自己的思路。 ## 一、观察者模式和发布者-订阅者模式模式的区别 ## 有些人认为观察者模式 === 发布者-订阅者模式,也有人觉得两者存在一些区别,其实两者的确有一些区别,但是两者的目的都是为了改善传统的通知机制,解耦通知方和被通知方的关系。那为什么发布者-订阅者模式存在区别呢?其实是因为后者相对于前者而言,多了一个类似于调度中心的存在,后者能集中管理多个主题对象,并且观察者和发布者之间是不存在直接关系的,在调度中心可以很方便的实现分发管理,这个特性让发布者-订阅者模式变得更加灵活。 ## 二、观察者和发布者-订阅者模式的简单实现 ## ### 观察者模式 ### class Observer { constructor(label) { this.label = label } update() { console.log(`update${this.label}`) } } class Target { constructor() { this.observerList = [] } add(observer) { this.observerList.push(observer) } remove(observer) { this.observerList = this.observerList.filter(ob => ob !== observer) } notify() { this.observerList.forEach(ob => { ob.update() }) } } let tar = new Target() for (let i = 0; i < 10; i++) { tar.add(new Observer(i)) } tar.notify()//打印update1到update10 复制代码 ### 发布者-订阅者模式 ### class Publisher { constructor() { this.subscribers = {} this.cache = {} } add(type, fn) { if (Object.prototype.toString.call(fn) !== '[object Function]') return this.subscribers[type] ? this.subscribers[type].push(fn) : this.subscribers[type] = [fn] return this } publish(type, theme) { //存储主题信息 this.cache[type] ? this.cache[type].push(theme) : this.cache[type] = [theme] let subscribers = this.subscribers[type] if (!subscribers || !subscribers.length) { console.warn('no subscriber in subscribers.') return this } subscribers.forEach(fn => fn.call(this, theme)) return this } unbind(type, fn) { this.subscribers[type] = this.subscribers[type].filter(item => item !== fn) return this } history(type, fn) { let cache = this.cache[type] || [] cache.forEach(item => fn.call(this, item)) return this } } let sub1 = data => { console.log(`sub1${data}`) } let sub2 = data => { console.log(`sub2${data}`) } let sub3 = data => { console.log(`sub3${data}`) } let publisher = new Publisher() publisher.add('click', sub1).add('click', sub2).add('change', sub3) publisher.publish('click', '第一次click').publish('change', '第一次change') publisher.unbind('click', sub1).publish('click', '第二次点击').history('click', data => { console.log('history' + data) }) 打印结果: /*** sub1第一次click sub2第一次click sub3第一次change sub2第二次点击 history第一次click history第二次点击 ***/ 复制代码 如以上代码,发布者订阅者模式可以在调度中心(相当于代码中的publish函数)进行一些定制化的操作,比如进行节流操作,过滤操作,权限控制等等,个人感觉会比较灵活一点。 先写这么多~有不对的欢迎指正~ 转载于:https://juejin.im/post/5c948cebe51d4508126c209f
相关 观察者模式 vs 发布订阅模式 目录 场景 观察者模式 发布订阅模式 总结 -------------------- 场景 有一回面试,面试官问: 末蓝、/ 2023年10月06日 19:03/ 0 赞/ 32 阅读
相关 C++设计模式 观察者模式(发布者给订阅者发通知) 文章目录 1. 观察者模式: ObserverPattern 2. 应用 3. 逻辑代码 4. 代码示例 1. 观察者模式: Observer 拼搏现实的明天。/ 2022年09月10日 10:14/ 0 赞/ 173 阅读
相关 订阅发布和观察者模式 发布订阅模式 > 把多个方法暂存起来,最后一次触发执行 作用: 解偶 使用场景: 如,多个类或者函数内,可以分散订阅某个操作,最后统一发布。分散的好处就是不 ╰+攻爆jí腚メ/ 2022年08月28日 14:47/ 0 赞/ 223 阅读
相关 js 订阅者模式(观察者模式) 原文网址:http://www.cnblogs.com/LuckyWinty/p/5796190.html [附加题] 请实现下面的自定义事件 Event 对 悠悠/ 2022年07月15日 13:15/ 0 赞/ 214 阅读
相关 观察者模式(发布-订阅者模式) 观察者模式定义了一种依赖关系,解决了主体对象和观察者之间功能的耦合,主要应用于大型项目的模块化开发中,解决团队开发中模块之间的通信问题,利用观察者模式还可以实现自定义事件。 素颜马尾好姑娘i/ 2022年05月22日 06:00/ 0 赞/ 236 阅读
相关 javascript 观察者模式 发布订阅模式 观察者模式 观察者模式,每一个观察者对象有两个方法 添加监听`subscribe` 发布事件`publish` 观察者有个`list`存放所有的已经添加监 本是古典 何须时尚/ 2022年04月24日 10:14/ 0 赞/ 231 阅读
相关 学习观察者模式与发布/订阅模式 > 最近学习了观察者模式和发布/订阅模式,但是一直有种不得要领的感觉,今天重新复习了一遍又有了新的思考,记录一下学习收获。 观察者模式 概念引用原文的话如下: > T 港控/mmm°/ 2022年01月20日 03:55/ 0 赞/ 299 阅读
相关 对于观察者模式和发布者-订阅者模式的一些理解 最近在试读vue的源码(vue3都要出来了,vue2的源码还没去读,惭愧惭愧),发现自己对观察者以及发布者-订阅者模式的理解不够,立文来梳理记录一下自己的思路。 一、观察者 曾经终败给现在/ 2022年01月17日 22:19/ 0 赞/ 307 阅读
相关 发布订阅模式(观察者模式) 设计模式的目的就是使类成为可复用的组件。 在观察者模式中观察者接口只注重被观察者,而被观察者接口只注重观察者,具体是观察者接口实现类中的哪一个并不在意,而被观察者也是如此。这 清疚/ 2021年12月15日 00:27/ 0 赞/ 311 阅读
还没有评论,来说两句吧...