Search K
Appearance
Appearance
用微信公众号订阅的类比来理解“发布-订阅”模式非常直观。这种模式的核心要素是发布者、订阅者和订阅中心,你订阅的公众号(发布者)发布文章时,微信平台(订阅中心)会推送给每个关注它的用户(订阅者)。
发布-订阅模式的核心思想之一就是通过引入一个订阅中心,使得发布者和订阅者之间不直接依赖,从而提高程序的灵活性和可维护性,同时也可以动态的添加或删除订阅者,满足各自业务的需求。
具备三个因素
tips:
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!' });