5、观察者模式

81 阅读1分钟

观察者模式:允许一个对象在发生某个变化时自动通知其他关联模式

白话:存在两个角色:观察者、被观察者;观察者保持对被观察者的监视,当发现被观察者在做某件事时,就做出某些反应

// 观察者类
class Observer {
  update(subjectState) {
    throw new Error("该方法主要给子类重写");
  }
}

// 观察者子类 A
class createObserverA extends Observer {
  update(subjectState) {
    console.log("createObserverA subjectState", subjectState);
    // 其他逻辑....
  }
}

// 观察者子类 B
class createObserverB extends Observer {
  update(subjectState) {
    console.log("createObserverB subjectState", subjectState);
    // 其他逻辑....
  }
}

// 被观察者
class Subject {
  constructor(state) {
    this.observers = [];
    this.state = state;
  }

  // 注册观察者
  addObserver(observer) {
    this.observers.push(observer);
  }

  // 被观察者的数据更新操作
  updateState(state) {
    this.state = state;

    // 通知所有观察者
    this.observers.forEach((ob) => ob.update(state));
  }
}

const subject = new Subject(1);
subject.addObserver(new createObserverA());
subject.addObserver(new createObserverB());

subject.updateState(2); // 将会自动通知观察者

实际案例:

Vue 的响应式就采用了代理模式 + 观察者模式

// 省略其他...

// reactive 函数
const reactive = (obj) => {
  return new Proxy(obj, { // Proxy 代理模式
    get(target, prop, receiver) {
      track(target, key, receiver) // 依赖收集
      return Reflect.get(target, prop)
    }
    set(target, prop, value, receiver) {
      Reflect.set(target, prop, value, receiver)

      trigger(target, prop, receiver) // 依赖触发
    }
  })
}

总结:一个‘做’,一个‘看’,‘看者’发现‘做者’做了某事,那就做出对应反应。

比如:妈妈在拖地,当你看到要拖到你面前时,你自然就抬脚了。