发布者-订阅者模式是什么
发布订阅者模式是由订阅者,处理中心,发布者
三部分组成;发布者-订阅者是一种一对多的关系,让多个订阅者对象同时监听一个发布者,当发布者状态改变时就会通知事件调度中心,由事件调度中心通知所有订阅自己的订阅者
例如:一个商店,商店的会员粉丝经常询问有没有什么活动,员工每次都需要对每一位会员单独回复,比较麻烦;建群/收集邮箱,有活动时统一发送信息/回复,会员:订阅者,商店:发布者,建群/邮箱:事件调度中心
发布者-订阅者实现
class Publisher {
constructor() {
//调度中心
this.subscribers = new Set()
this.msg = "暂时没有新消息"
}
// 订阅事件的方法
subscribe (subscriber) {
this.subscribers.add(subscriber)
}
// 取消订阅的方法
unsubscribe (subscriber) {
this.subscribers.delete(subscriber)
}
// 发布通知的方法
notify () {
console.log("商店正在通知所有订阅者...")
for (let subscriber of this.subscribers) {
subscriber.update(this.msg)
}
}
// 更新消息的方法
updateMsg (newMsg) {
console.log(`商店正在更新消息:${newMsg}`)
this.msg = newMsg
this.notify()
}
}
class Subscriber {
constructor(name) {
this.name = name
}
// 接收更新的方法
update (msg) {
console.log(`${this.name} 收到更新啦!新消息内容:${msg}`)
}
}
// 创建发布者实例
const publisher = new Publisher()
// 创建订阅者实例
const subscriber1 = new Subscriber('小明')
const subscriber2 = new Subscriber('小王')
// 订阅事件,之后发布者更新消息会通知到这两个订阅者
publisher.subscribe(subscriber1)
publisher.subscribe(subscriber2)
// 发布者更新消息后通知所有订阅者
publisher.updateMsg('今天牛奶水果打八折!')
// 取消订阅,之后发布者更新消息不会通知到该订阅者
publisher.unsubscribe(subscriber1)
// 发布者更新消息后通知所有订阅者(不包括已取消订阅的订阅者)
publisher.updateMsg('今天牛奶水果已售空!')