• 发布/订阅模式


    有好多人一提到发布、订阅模式就头大,不了解的人就会想,他是干什么的啊  和观察者模式有什么区别呢

    其实发布订阅模式和观察者模式的区别还是很大的,订阅发布模式比观察者模式多一个调度的部分

    虽然两种模式都存在订阅者和发布者(具体观察者可认为是订阅者、具体目标可认为是发布者),但是观察者模式是由具体目标调度的,而发布/订阅模式是统一由调度中心调的,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会。
    在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
    说到发布订阅模式,因为是一对一或者一对多的关系,具体实现其实就是把你想要发布的东西,存到一个对象或者数组当中,用的时候直接去遍历调用
    代码如下:
    function pubSub() {
      var topics = {};
      function subScribe(topic, fn) {
        if (!topics[topic]) {
          topics[topic] = [];
        }
        //并未去重,如果去重的话不能使用解构赋值,因为[...new Set(arr)]这种方式只能去重基本数值类型,fn是函数引用类型
        topics[topic].push(fn);
      }
      function publish(topic, ...args) {
        // console.log(topics[topic].length)
        if (!topics[topic]) return;
        // 迭代相同topic值对应的函数
        for (let fn of topics[topic]) {
          fn(...args)
        }
    
      }
      return {
        subScribe, publish
      }
    }
    var pubSub1 = new pubSub();
    pubSub1.subScribe('add', function (a, b) {
      console.log(a + b)
    })
    pubSub1.subScribe('minus', function (a, b) {
      console.log(a - b)
    })
    

     

    看完这个是不是感觉发布订阅模式很简单呢
  • 相关阅读:
    LeetCode234回文链表
    LeetCode445两数相加II
    LeetCode24两两交换链表中的节点
    LeetCode19删除链表的倒数第N个节点
    LeetCode513找树左下角的值
    LeetCode637二叉树的层平均值
    LeetCode671二叉树中第二小的节点
    LeetCode337打家劫舍III
    LeetCode124二叉树中的最大路径和
    LeetCode687最长同值路径
  • 原文地址:https://www.cnblogs.com/wb336035888/p/12530234.html
Copyright © 2020-2023  润新知