本文最后更新于 2024-03-23T16:42:04+00:00
观察者模式:允许一个对象在发生某个变化时自动通知其他关联模式
白话:存在两个角色:观察者、被观察者;观察者保持对被观察者的监视,当发现被观察者在做某件事时,就做出某些反应
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Observer { update(subjectState) { throw new Error("该方法主要给子类重写"); } }
class createObserverA extends Observer { update(subjectState) { console.log("createObserverA subjectState", subjectState); } }
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 的响应式就采用了代理模式 + 观察者模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
const reactive = (obj) => { return new Proxy(obj, { 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) } }) }
|
总结:一个‘做’,一个‘看’,‘看者’发现‘做者’做了某事,那就做出对应反应。
比如:妈妈在拖地,当你看到要拖到你面前时,你自然就抬脚了。