观察者和发布订阅的区别
本质上的区别是调度的地方不同
观察者
目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口,在具体目标发生变化时候,调度观察者的更新方法。
function Observer() { this.state = '开心' this.arr = [] } Object.prototype.attach = function (s) { this.arr.push(s) } Object.prototype.setState = function (newState) { this.state = newState this.arr.forEach(s => s.update(newState)) } function Subject(name) { this.name = name } Subject.prototype.update = function (newState) { console.log(`${this.name}观察到状态发生改变-${newState}`) } let o = new Observer() let s1 = new Subject('张三') let s2 = new Subject('李四') o.attach(s1) o.attach(s2) o.setState('不开心')
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
发布订阅
在现在的发布订阅模式中,称为发布者的消息发送者不会将消息直接发送给订阅者,这意味着发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在第三个者,称为调度中心,它维持着发布者和订阅者之间的联系
function Events () { this.arr = [] //调度中心 } Events.prototype.on = function (fn) { this.arr.push(fn) } Events.prototype.emit = function (p) { this.arr.forEach((fn) => { fn(p) }) } let e = new Events() e.on(function (p) { console.log(p) }) e.emit('发布')
而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰,消除了发布者和订阅者之间的依赖。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制之类的。还可以做一些节流操作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论