发布订阅模式
概念
概念
一种对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到状态改变的通知。
案例
下面列举观察者模式的案例 假设以外卖网站示例
js
// 定义一个观察者对象
const observers = [];
// 注册观察者
observers.push(A.update);
observers.push(B.next);
observers.push(C.change);
observers.push(D.init);
getAddress().then((res)=>{
const address = res.address;
observers.forEach((observer)=>observer(address));
})
// 优化
import {EventBus} from './event.js';
getAddress().then((res)=>{
const address = res.address;
EventBus.emit('ADDRESS', address);
})
// A模块
import {EventBus} from './event.js';
const update = (address)=>{
//
};
EventBus.on('ADDRESS', update);
// B模块
import {EventBus} from './event.js';
const next = (address)=>{
//
};
EventBus.on('ADDRESS',next);
// C模块
import {EventBus} from './event.js';
const change = (address)=>{
//
};
EventBus.on('ADDRESS',change);
// D模块
import {EventBus} from './event.js';
const init = (address)=>{
//
};
EventBus.on('ADDRESS',init);
应用场景
- 事件处理 当用户触发某个事件时,可以将该事件发布到一个主体上,所有订阅该主体的处理器都可以接收到该事件并进行想要的处理
- 消息队列 当一个应用程序需要处理大量的请求时,可以将这些请求发送到一个主体上,由多个处理器订阅该主体并按照先后顺序处理这些请求
- 日志系统 当应用程序需要记录某些事件或错误时,可以将这些信息发布到一个日志主题上,所有订阅该主题的处理器都可以接收到这些信息并处理这些消息或数据
- 模块通信 当一个模块需要向另一个模块发送消息时或者数据时,可以将这些消息或数据发布到一个主题上,由订阅该主题的模块接收并处理这些消息或数据
特点
- 可扩展性 该模式具有良好的扩展性,新的主题和订阅者可以随时添加到系统中,不会影响现有的发布者和订阅者。
- 可重用性 通过简单的配置来实现不同的功能,从而提高了代码的可重用性
- 解耦合 将系统中的不同组件解耦,从而提高了系统的可维护性和可测试性