观察者模式(Vue响应式原理)

1,050 阅读1分钟

Vue的响应式机制使用了观察者模式,所以我们首先要先了解一下观察者模式

观察者模式与发布订阅模式的区别是,观察者模式中没有事件中心,只有发布者与订阅者,并且发布者需要知道订阅者的存在。

观察者(订阅者)---Watcher

update(): 当事件发生时,具体要做的事情。

目标(发布者)--Dep

subs 数组:存储所有的观察者

addSub() 添加观察者,将其保存到subs数组中

notify(): 当事件发生后,调用所有观察者的update() 方法。

没事事件中心

具体代码实现如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>观察者模式</title>
  </head>
  <body>
    <script>
      //发布者
      class Dep {
        constructor() {
          //记录所有的订阅者
          this.subs = [];
        }
        //添加订阅者
        addSub(sub) {
          //订阅者中必须有update方法
          if (sub && sub.update) {
            this.subs.push(sub);
          }
        }
        //发布通知
        notify() {
          //遍历subs数组,调用每个订阅者中的update方法
          this.subs.forEach((sub) => {
            sub.update();
          });
        }
      }
      // 订阅者--观察者
      class Watcher {
        //必须有一update方法,当事件发生后,具体要做的事情
        update() {
          console.log("update something");
        }
      }
      //测试
      let dep = new Dep();
      let watcher = new Watcher();
      dep.addSub(watcher);
      dep.notify();
    </script>
  </body>
</html>

下面我们看一下观察者模式与发布订阅模式的区别。

观察者模式:是由具体目标调度的,比如当事件触发,Dep就会去调用观察者的方法,所以观察者模式的订阅者与发布者之间是存在依赖的。

发布订阅模式:由统一调度中心调用,因此发布者和订阅者不需要知道对方的存在。