学习Vue响应式原理-设计模式-2

170 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

学习Vue响应式原理-设计模式-2

引言

为了学习发布订阅模式,这里顺便学习一下四种常见的设计模式,

  • 单例模式

  • 观察者模式

  • 发布订阅模式

  • 策略模式

今天学习一下最后两个设计模式。

设计模式

发布订阅模式

都说 发布订阅模式观察者模式 类似一样,其实还是有点区别的。

发布订阅模式 相当于 js 中的 addEventListener(),是只需要一个构造函数即可。而 观察者模式 是需要两个构造函数的。

汇结

发布订阅模式 相当于是一个 第三方 观察者,来维护 发布者订阅者 关系。

可以理解如下,但是不一定正确。

  • 发布者 --> 观察者
  • 订阅者 --> 被观察者

vue 中,我们所熟悉的 EventBus 就是 发布订阅者

代码

首先我们创建 Observer

class Observer {
  constructor() {
    this.event = {}
  }
}

有3个常用的方法,就是

  • 订阅事件-->订阅者

      $on(key, fn) {
        if (!this.event[key]) this.event[key] = []
        this.event[key].push(fn)
      }
    
  • 发布事件-->发布者

      $emit(key) {
        // 1.消息队列中 是否存在 key
        if (!this.event[key]) return
    
        // 2.存在key,触发
        this.event[key].forEach((item) => item())
      }
    
  • 关闭事件

      $off(key, fn) {
        // 1.消息队列中 是否存在 key
        if (!this.event[key]) return
    
        // 2.是否传递fn参数
        if (!fn) {
          // this.event[key] = []
          delete this.event[key]
          return
        }
    
        // 3.fn存在
        this.event[key] = this.event[key].filter((item) => item !== fn)
      }
    

进行使用

image.png

策略模式

策略模式,就是在我们有很多 if - else 来处理事情的时候,可以来使用。

但是我这里会有一个疑问,如果 if - else 太多,是不是可以用 switch - case 来处理呢。

既然出现这个模式,自然不是这么简单。

我们可以这样想,既然 if - else 太多,那么能不能先将其转成 switch 的形式呢

function selectName(name) {
  switch (name) {
    case 'aaa':
      return 'aaa'
    case 'bbb':
      return 'bbb'
    case 'ccc':
      return 'ccc'
    default:
      return 'aaa'
  }
}

如果 switch 不满足,非要策略模式上场,那就通过函数的形式来进行映射

const selectName = {
  aaa: function () {
    return 'aaa'
  },
  bbb: function () {
    return 'bbb'
  },
  ccc: function () {
    return 'ccc'
  }
}

const useSelectName = (name) => {
  return selectName[name]
}

总结

学习了 设计模式 中两大经典的模式,发布订阅模式策略模式