We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
前言 之前网上看文章,一直以为观察者模式就是相当于发布订阅模式,只是换了个说法,而且很多js开发者跟我有一样的问题。后来接触得多了,才发现其实两者有区别。
前言
之前网上看文章,一直以为观察者模式就是相当于发布订阅模式,只是换了个说法,而且很多js开发者跟我有一样的问题。后来接触得多了,才发现其实两者有区别。
首先透过@swnow_in的一张图来谈一下自己的理解
从图中可以看出:
两者的优缺点:
举个栗子:
以上面这张图为思路:
首先目标对象(被观察者)称为Subject,有若干个观察者Observer进行观察。当Subject被某些对应事件驱动了,则通知相对应的观察者,调用其回调操作。
Subject
Observer
代码实现如下,关键部分已上注释:
// 目标(被观察者)对象模型 class Subject{ constructor () { this.obs = []; } // 添加观察者 addObserver (ob) { this.obs.push(ob); } // 通知所有观察者 notify () { this.obs.forEach( ob => { ob.update(); }); } } // 观察者对象模型 class Observer{ update(){ console.log('update'); } // ... } // 测试 let subject = new Subject(); let ob = new Observer(); //目标添加观察者了 subject.addObserver(ob); //目标发布消息调用观察者的更新方法了 subject.notify(); //update
首先要构造一个总线控制中心,负责中间操作,实现以下三个功能:
实现代码如下,关键部分已上注释:
// 发布者订阅模式,事件模型 const eventProxy = { onList: {}, // 订阅 on: function (key, fn) { if (!this.onList[key]) { this.onList[key] = [] } this.onList[key].push(fn) }, // 取消订阅 off: function(key, fn) { if (!this.onList[key]) return false let fnIndex = this.onList[key].indexOf(fn) if (fnIndex === -1) return false this.onList[key].splice(fnIndex, 1) return true }, // 发布 emit: function(...args) { if (!args.length) return // 如果没有任何订阅则返回 const key = args[0] if (!this.onList[key] || !this.onList[key].length) return // 发布对应的订阅事件 const subscriber = this.onList[key] const newArgs = args.slice(1) subscriber.forEach(cb => { cb.apply(null, newArgs) }) } }
The text was updated successfully, but these errors were encountered:
不错!
Sorry, something went wrong.
No branches or pull requests
首先透过@swnow_in的一张图来谈一下自己的理解
从图中可以看出:
两者的优缺点:
举个栗子:
观察者模式实现
以上面这张图为思路:
首先目标对象(被观察者)称为
Subject
,有若干个观察者Observer
进行观察。当Subject被某些对应事件驱动了,则通知相对应的观察者,调用其回调操作。代码实现如下,关键部分已上注释:
发布订阅模式实现
首先要构造一个总线控制中心,负责中间操作,实现以下三个功能:
实现代码如下,关键部分已上注释:
The text was updated successfully, but these errors were encountered: