当你学习比较深入的时候会发现发布订阅模式无处不在,vue2的双向绑定,EventBus,IOC和DI,node的事件驱动, mitt, uni.$on和uni.$emit




- const EventEmitter = require('events');
-
- const emitter = new EventEmitter();
-
- emitter.on('event', (data) => {
- console.log(data);
- });
- emitter.emit('event', 'Hello World');
发布订阅模式是一种软件设计模式,用于实现观察者模式。它基于一种事件机制,即一个主题对象(也称为发布者或发布源)维护了一个事件列表,并允许其他对象(也称为订阅者或观察者)注册自己,以接收特定事件的通知。
在发布订阅模式中,发布者和订阅者之间是解耦的,它们之间没有直接的依赖关系。发布者只需要发送事件通知给所有已注册的订阅者即可,而订阅者可以选择性地处理这些事件通知。这样可以实现一对多的通信方式,即一个事件可以同时通知给多个订阅者。
发布订阅模式主要包含以下几个关键角色:
1. 发布者(也称为发布源):负责维护事件列表和事件通知的发送。它提供了事件注册和取消注册的功能,并在事件发生时将通知发送给已注册的订阅者。
2. 订阅者(也称为观察者):为感兴趣的事件注册自己,并定义事件发生时的处理逻辑。
3. 事件列表:维护了发布者可以触发的事件及其对应的订阅者列表。当发布者触发某个事件时,会遍历该事件的订阅者列表,并将事件通知发送给每个订阅者。
发布订阅模式的优点是可以实现松耦合的通信方式,发布者和订阅者之间没有直接的依赖关系,可以动态地增加或移除订阅者,而不需要对发布者进行修改。这种模式提高了系统的可扩展性和可维护性。
例如,一个新闻发布系统可以使用发布订阅模式实现,新闻发布者负责发布新闻事件,而订阅者可以是用户订阅了感兴趣的新闻频道。当有新闻发布时,发布者会将该新闻通知给所有已注册的订阅者,订阅者可以选择性地接收并处理这些新闻。这种方式能够实现新闻的及时推送,并提供了一种灵活的方式来处理新闻的订阅和取消订阅。
假设有一个餐厅需要提供外卖服务,有多个顾客可以订购不同的菜品。发布订阅模式可以通过以下代码实现:
-
- // 发布者(餐厅)对象
- const restaurant = {
- orders: [],
-
- // 添加订单
- addOrder: function(order) {
- this.orders.push(order);
- this.notifySubscribers();
- },
-
- // 通知所有订阅者(顾客)有新订单
- notifySubscribers: function() {
- this.subscribers.forEach(subscriber => {
- subscriber.update();
- });
- },
-
- // 订阅者(顾客)列表
- subscribers: [],
-
- // 添加订阅者
- addSubscriber: function(subscriber) {
- this.subscribers.push(subscriber);
- }
- };
- // 订阅者(顾客)对象
- const customer1 = {
- name: "Alice",
- update: function() {
- console.log(`${this.name}收到新订单:${restaurant.orders[restaurant.orders.length - 1]}`);
- }
- };
- const customer2 = {
- name: "Bob",
- update: function() {
- console.log(`${this.name}收到新订单:${restaurant.orders[restaurant.orders.length - 1]}`);
- }
- };
- // 添加订阅者
- restaurant.addSubscriber(customer1);
- restaurant.addSubscriber(customer2);
- // 餐厅新增订单
- restaurant.addOrder("鱼香肉丝");
以上代码中,餐厅(发布者)有一个订单列表,当新增订单时会触发notifySubscribers方法,通知所有的顾客(订阅者)有新订单。顾客根据收到的通知,执行update方法来处理订单信息。
在这个例子中,餐厅和顾客之间通过发布订阅模式解耦,餐厅只需要维护订单列表,并通过addOrder方法添加订单,而顾客只需要实现update方法来处理收到的新订单通知。这样,餐厅和顾客之间的关系不是直接的耦合,而是通过订阅和发布的方式进行交流。