依赖者
都会收到通知并自动更新。拍卖场景
,拍卖师观察最高标价,然后通知给其他竞价者竞价。优点:
缺点:
具体实现
class Observer {
constructor(name) {
this.name = name
}
update(data) {
console.log(`观察者${this.name} 收到了: ${data}`)
}
}
class Subject {
constructor() {
this.observers = []
}
add(observer) {
this.observers.push(observer)
}
notify(data) {
this.observers.forEach((i) => i.update(data))
}
delete(observer) {
this.observers = this.observers.filter((i) => i !== observer)
}
}
具体使用
const sub = new Subject()
const observer1 = new Observer('A')
const observer2 = new Observer('B')
sub.add(observer1)
sub.add(observer2)
sub.notify('一条新闻')
// 观察者A 收到了: 一条新闻
// 观察者B 收到了: 一条新闻
sub.notify('今天的天气是晴天')
// 观察者A 收到了: 今天的天气是晴天
// 观察者B 收到了: 今天的天气是晴天
sub.delete(observer1)
发送者
(称为发布者)不会将消息直接发送给特定的 接收者
(称为订阅者)。邮件系统
,你可以作为 订阅者
订阅某个网站的通知,邮件系统在其中充当 发布订阅中心
的角色,而 发布者
则是你订阅的网站。优点:
缺点:
具体实现
class Dep {
constructor() {
this.subscriptions = {}
}
subscribe(topic, callback) {
if (!this.subscriptions[topic]) {
this.subscriptions[topic] = []
}
this.subscriptions[topic].push(callback)
}
unSubscribe(topic) {
if (!this.subscriptions[topic]) {
return
}
delete this.subscriptions[topic]
}
publish(topic, data) {
if (!this.subscriptions[topic]) {
return
}
this.subscriptions[topic].forEach((callback) => {
callback(data)
})
}
}
class Publisher {
constructor(pub) {
this.pub = pub
}
publishMessage(topic, message) {
this.pub.publish(topic, message)
}
}
class Subscriber {
constructor(sub, name) {
this.sub = sub
this.name = name
}
subscribeToTopic(topic) {
this.sub.subscribe(topic, (data) => {
console.log(`订阅者 ${this.name} 收到${topic}消息: ${data}`)
})
}
unSubscribeToTopic(topic) {
this.sub.unSubscribe(topic, (data) => {
console.log(`订阅者 ${this.name} 取消订阅${topic}消息: ${data}`)
})
}
}
具体使用
const dep = new Dep()
const publisher = new Publisher(dep)
const subscriber1 = new Subscriber(dep, 'A')
const subscriber2 = new Subscriber(dep, 'B')
subscriber1.subscribeToTopic('news')
subscriber2.subscribeToTopic('weather')
publisher.publishMessage('news', '一条新闻')
// 订阅者 A 收到news消息: 一条新闻
publisher.publishMessage('weather', '今天的天气是晴天')
// 订阅者 B 收到weather消息: 今天的天气是晴天
subscriber1.unSubscribeToTopic('news')