• 发布订阅模式


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

    1. const EventEmitter = require('events');
    2. const emitter = new EventEmitter();
    3. emitter.on('event', (data) => {
    4. console.log(data);
    5. });
    6. emitter.emit('event', 'Hello World');

    发布订阅模式是一种软件设计模式,用于实现观察者模式。它基于一种事件机制,即一个主题对象(也称为发布者或发布源)维护了一个事件列表,并允许其他对象(也称为订阅者或观察者)注册自己,以接收特定事件的通知。

    在发布订阅模式中,发布者和订阅者之间是解耦的,它们之间没有直接的依赖关系。发布者只需要发送事件通知给所有已注册的订阅者即可,而订阅者可以选择性地处理这些事件通知。这样可以实现一对多的通信方式,即一个事件可以同时通知给多个订阅者。

    发布订阅模式主要包含以下几个关键角色:

    1. 发布者(也称为发布源):负责维护事件列表和事件通知的发送。它提供了事件注册和取消注册的功能,并在事件发生时将通知发送给已注册的订阅者。

    2. 订阅者(也称为观察者):为感兴趣的事件注册自己,并定义事件发生时的处理逻辑。

    3. 事件列表:维护了发布者可以触发的事件及其对应的订阅者列表。当发布者触发某个事件时,会遍历该事件的订阅者列表,并将事件通知发送给每个订阅者。

    发布订阅模式的优点是可以实现松耦合的通信方式,发布者和订阅者之间没有直接的依赖关系,可以动态地增加或移除订阅者,而不需要对发布者进行修改。这种模式提高了系统的可扩展性和可维护性。

    例如,一个新闻发布系统可以使用发布订阅模式实现,新闻发布者负责发布新闻事件,而订阅者可以是用户订阅了感兴趣的新闻频道。当有新闻发布时,发布者会将该新闻通知给所有已注册的订阅者,订阅者可以选择性地接收并处理这些新闻。这种方式能够实现新闻的及时推送,并提供了一种灵活的方式来处理新闻的订阅和取消订阅。

    假设有一个餐厅需要提供外卖服务,有多个顾客可以订购不同的菜品。发布订阅模式可以通过以下代码实现:

    1. // 发布者(餐厅)对象
    2. const restaurant = {
    3. orders: [],
    4. // 添加订单
    5. addOrder: function(order) {
    6. this.orders.push(order);
    7. this.notifySubscribers();
    8. },
    9. // 通知所有订阅者(顾客)有新订单
    10. notifySubscribers: function() {
    11. this.subscribers.forEach(subscriber => {
    12. subscriber.update();
    13. });
    14. },
    15. // 订阅者(顾客)列表
    16. subscribers: [],
    17. // 添加订阅者
    18. addSubscriber: function(subscriber) {
    19. this.subscribers.push(subscriber);
    20. }
    21. };
    22. // 订阅者(顾客)对象
    23. const customer1 = {
    24. name: "Alice",
    25. update: function() {
    26. console.log(`${this.name}收到新订单:${restaurant.orders[restaurant.orders.length - 1]}`);
    27. }
    28. };
    29. const customer2 = {
    30. name: "Bob",
    31. update: function() {
    32. console.log(`${this.name}收到新订单:${restaurant.orders[restaurant.orders.length - 1]}`);
    33. }
    34. };
    35. // 添加订阅者
    36. restaurant.addSubscriber(customer1);
    37. restaurant.addSubscriber(customer2);
    38. // 餐厅新增订单
    39. restaurant.addOrder("鱼香肉丝");

    以上代码中,餐厅(发布者)有一个订单列表,当新增订单时会触发notifySubscribers方法,通知所有的顾客(订阅者)有新订单。顾客根据收到的通知,执行update方法来处理订单信息。

    在这个例子中,餐厅和顾客之间通过发布订阅模式解耦,餐厅只需要维护订单列表,并通过addOrder方法添加订单,而顾客只需要实现update方法来处理收到的新订单通知。这样,餐厅和顾客之间的关系不是直接的耦合,而是通过订阅和发布的方式进行交流。

  • 相关阅读:
    UML-各种图
    一种模型压缩技术
    C++ 时间函数整理详解
    【示波器专题】用示波器进行频率测量精度为什么低于频率计
    【数据结构】 顺序表
    04 C++STL之迭代器
    分布式搜索引擎03
    淘宝/天猫添加收货地址 API
    STM32移植LVGL8.2
    Linux 使用NC命令监听本地端口
  • 原文地址:https://blog.csdn.net/m0_47999208/article/details/133988665