观察者模式
- 观察者(订阅者) --Watcher
- update():当事件发生时要做的事情
- 目标(发布者) --Dep
- subs数组: 存储所有观察者
- addSub(): 添加观察者
- notify(): 当事件发生时调用观察者的update()方法
- 没有事件中心
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>观察者模式</title>
</head>
<body>
<div id="app"></div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
// 目标-发布者
class Dep {
constructor(){
this.subs = []
}
// 添加观察者-要判断观察者是否存在以及是否拥有update方法
addSub(sub){
if(sub&&sub.update){
this.subs.push(sub)
}
}
// 发布通知-事件发生时调用观察者的update方法
notify(depName,fn){
this.subs.forEach(sub=>{
sub.update()
})
}
}
// 观察者-订阅者
class Watcher {
update(){
console.log('update打印了~')
}
}
//创建一个订阅者
let watch = new Watcher()
//订阅者可以对update方法进行自定义,也可以继承自父类
watch.update = function(){
console.log('huhuhu')
}
//创建一个目标,也就是最终发布消息的目标
let dep = new Dep()
//将订阅者追加到目标的订阅列表中
dep.addSub(watch)
//目标开始发送通知,此时观察者的update会被调用
dep.notify()
</script>
</html>
控制台输出结果如下:
总结来看,观察者模式比较简单,目标记录了都是谁关注了我,我有更新时会调用这些观察者的update方法。