blog
blog copied to clipboard
观察者和发布订阅的区别
本质上的区别是调度的地方不同
观察者
目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口,在具体目标发生变化时候,调度观察者的更新方法。
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('发布')
而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰,消除了发布者和订阅者之间的依赖。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制之类的。还可以做一些节流操作。