什么叫发布订阅模式
用微信公众号订阅的类比来理解“发布-订阅”模式非常直观。这种模式的核心要素是发布者、订阅者和订阅中心,你订阅的公众号(发布者)发布文章时,微信平台(订阅中心)会推送给每个关注它的用户(订阅者)。
核心思想
发布-订阅模式的核心思想之一就是通过引入一个订阅中心,使得发布者和订阅者之间不直接依赖,从而提高程序的灵活性和可维护性,同时也可以动态的添加或删除订阅者,满足各自业务的需求。
发布-订阅模式的概念图
代码实现
具备三个因素
- 发布者 Publisher
- 订阅者 Subscriber
- 订阅中心(事件中心) Pattern
tips:
- 订阅中心用于跟踪和维护发布者与订阅者之间的关联。例如,假设有公众号 A、B、C,其中 A 的订阅者包括 a-1、a-2,B 的订阅者包括 b-1、b-2。订阅中心会将这些公众号及其对应的订阅者进行注册。当用户订阅某个公众号时,该用户会被添加到相应公众号的订阅者队列中。 实现:
class Pattern {
constructor() {
this.events = {};
}
// 订阅事件, 将发布者 和 订阅者关联 一对多的关系
subscribe(eventName, callback) {
if (!this.events[eventName]) {
this.events[eventName] = [];
}
this.events[eventName].push(callback);
}
// 取消订阅事件
unsubscribe(eventName, callback) {
if (!this.events[eventName]) return;
this.events[eventName] = this.events[eventName].filter(
(cb) => cb !== callback
);
}
// 发布事件 发布者向订阅中心发送消息,订阅中心找到,订阅该消息的人群,通知它,然后将消息消费掉
publish(eventName, data) {
if (!this.events[eventName]) return;
this.events[eventName].forEach((callback) => callback(data)); // 这里的callback(data) 就是notify的过程
}
}
使用示例
const eventCenter = new Pattern();
// 定义订阅者(消费者)
const subscriber1 = (data) => {
console.log('Subscriber 1 received:', data);
};
const subscriber2 = (data) => {
console.log('Subscriber 2 received:', data);
};
// 订阅事件
eventCenter.subscribe('event1', subscriber1);
eventCenter.subscribe('event1', subscriber2);
eventCenter.subscribe('event2', subscriber2);
// 发布事件
eventCenter.publish('event1', { message: 'Hello, World!' });
// 取消订阅
eventCenter.unsubscribe('event1', subscriber1);
// 再次发布事件
eventCenter.publish('event1', { message: 'Hello again!' });
应用场景
- 消息队列系统
- 事件驱动架构,例如node
- 实时数据更新
- 日志收集系统
- 插件架构 ...