5、观察者模式

观察者模式:允许一个对象在发生某个变化时自动通知其他关联模式
白话:存在两个角色:观察者、被观察者;观察者保持对被观察者的监视,当发现被观察者在做某件事时,就做出某些反应

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("该方法主要给子类重写");
}
}

// 观察者子类 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 的响应式就采用了代理模式 + 观察者模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 省略其他...

// 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) // 依赖触发
}
})
}

总结:一个‘做’,一个‘看’,‘看者’发现‘做者’做了某事,那就做出对应反应。
比如:妈妈在拖地,当你看到要拖到你面前时,你自然就抬脚了。


5、观察者模式
https://mrhzq.github.io/职业上一二事/前端面试/JS 设计模式/5、观察者模式/
作者
黄智强
发布于
2024年2月13日
许可协议