欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > JS 设计模式之发布订阅模式

JS 设计模式之发布订阅模式

2025/11/4 7:02:51 来源:https://blog.csdn.net/fyw1789/article/details/141886195  浏览:    关键词:JS 设计模式之发布订阅模式

发布订阅模式和观察者模式很像,他们的主要区别就是发布订阅模式在中间加了一层,完成对订阅者的通知

Broker.js(中间层)

class Broker {constructor() {// 存储订阅的频道和订阅者this.infoMap = new Map();}// topic为订阅的主题getSubscriber(topic) {return this.infoMap.get(topic) || [];}subscribe(topic, sub) {const subscribers = this.getSubscriber(topic);subscribers.push(sub);this.infoMap.set(topic, subscribers);}unsubscribe(topic, sub) {const subscribers = this.getSubscriber(topic);const index = subscribers.indexOf(sub);if (index > -1) {subscribers.splice(index, 1);}this.infoMap.set(topic, subscriber);}notifySubscribers(topic, msg) {const subscribers = this.getSubscriber(topic);subscribers.forEach((sub) => {sub.getMsg(topic, msg);});}
}

Publisher.js (发布者)

class Publisher {constructor(broker) {this.broker = broker;}publish(topic, msg) {console.log(`${topic}已经发布了新内容----${msg}`);this.broker.notifySubscribers(topic, msg);}
}

Subscriber.js

class Subscriber {constructor(broker) {this.broker = broker;}subscribe(topic) {console.log("订阅成功");// 通过中间层对发布者进行订阅this.broker.subscribe(topic, this);}unsubscribe(topic) {console.log("取消订阅成功");// 通过中间层取消对发布者的订阅this.broker.unsubscribe(topic, this);}getMsg(topic, msg) {console.log(`${topic}主题更新了--${msg}`);}
}

使用`

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script src="./Broker.js"></script><script src="./Publisher.js"></script><script src="./Subscriber.js"></script><script>const broker = new Broker();const sub1 = new Subscriber(broker);const sub2 = new Subscriber(broker);const pub = new Publisher(broker);sub1.subscribe("恐怖片");sub2.subscribe("恐怖片");pub.publish("恐怖片", "恐怖片更新了");</script></body>
</html>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词