极简实现系列 是用最简单的代码实现一些常见的方法,目的是为了帮助理解原理,所以并没有考虑太多限制条件
好久没有写过极简系列了,最近经常被问到观察者模式和发布订阅模式的区别,之前有写过 发布订阅模式的极简实现,其实两种模式是非常类似的,今天刚好有空来整理一下自己对这两个模式的理解,然后再简单实现一下。
区别
关于这两个的区别,其实网上有很多大牛有文章去详细总结,所以我也不多说那些细的,就说一个最核心的:
- 观察者模式是由具体目标调度的,发布订阅是有第三方调度中心
怎么理解呢,这里举一个例子
假设你在网上买鞋子,刚好没货了,这时候如果有个订阅的操作,你就去订阅一下,然后卖家如果有货了,他就在系统上发布一下,这时候所有订阅的人都会收到消息,这个就是发布订阅模式,这里的系统就是第三方的调度中心。
同样的,假如这个网站并没有订阅的操作,你就直接跟卖家说等有货了告诉你,卖家如果有货了就直接打电话给你,这个就是观察者模式,你就是观察者,卖家就是被观察者
是不是挺好理解的,接下来用代码来实现一下
代码实现
核心代码就几行,直接看注释吧
// 被观察者(卖家)
class Subject {
constructor() {
this.observer = []
}
//收集
add(ob) {
this.observer.push(ob)
}
//通知
notify() {
this.observer.forEach(ob => ob.update())
}
}
// 观察者(买家)
class Observer {
constructor(name) {
this.name = name
}
update() {
console.log(`Hi ${this.name}, 鞋子到货了`)
}
}
let observer1 = new Observer('Tom')
let observer2 = new Observer('Jerry')// 可能有多个买家
let subject = new Subject()
subject.add(observer1)
subject.add(observer2)
subject.notify()
//打印结果
//Hi Tom, 鞋子到货了
//Hi Jerry, 鞋子到货了
看吧,没骗你吧,确实很简单吧,而且是不是感觉跟发布订阅模式基本一样
总结
好像也没啥号总结的,画个简图看吧
完事~