发布/订阅模式

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

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

虽然两种模式都存在订阅者和发布者(具体观察者可认为是订阅者、具体目标可认为是发布者),但是观察者模式是由具体目标调度的,而发布/订阅模式是统一由调度中心调的,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会。
在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
说到发布订阅模式,因为是一对一或者一对多的关系,具体实现其实就是把你想要发布的东西,存到一个对象或者数组当中,用的时候直接去遍历调用
代码如下:
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)
})

 

看完这个是不是感觉发布订阅模式很简单呢
posted @ 2020-03-20 10:48  一只吱吱侠  阅读(139)  评论(0编辑  收藏  举报