说明
之前听珠峰架构课,姜文老师在《手写Promise》视频课中讲述了手写发布订阅者模式和观察者模式,做个学习记录。
发布订阅者模式
- 使用fs模块分别读取name.txt和age.txt,每次读完文件,通知订阅者,当两个文件读取完之后,打印 "全部读取完成了"
let fs = require('fs')
//先声明一个event作为第三者
let event = {
arr: [],
on(fn) {
this.arr.push(fn)
},
emit() {
this.arr.map(fn => fn())
}
}
let obj = {}
//订阅中介
event.on(() => {
console.log('走了');
})
event.on(() => {
console.log(obj);
if (Object.keys(obj).length === 2) {
console.log('全部读取完了', obj);
}
})
fs.readFile('name.txt', 'utf8', (err, data) => {
obj.name = data
event.emit()
})
fs.readFile('age.txt', 'utf8', (err, data) => {
obj.age = data
event.emit()
})
//发布订阅者模式是emit-on模式,两者没有关系,触发之后中介调用所有的订阅者
- 先声明一个中介event
- 调用event的on方法,两个函数作为订阅者,被收集到event里
- 每当读取完一个文件,触发event的emit方法,通知所有的订阅者
观察者模式
- 两个员工观察老板,老板说加班,员工打印"加班”
//被观察者,有自己的状态state
class Subject {
constructor() {
this.state = '不加班'
this.arr = []
}
attach(o) {
this.arr.push(o)
}
setState(value) {
this.value = value
this.arr.map(o => o.update(this.value))
}
}
//观察者,当被观察者状态发生改变,观察者会触发事件
class Observer {
constructor(name) {
this.name = name
}
update(value) {
console.log(`${this.name}:今天${value}`);
}
}
let boss = new Subject('老板')
let o1 = new Observer('员工1')
let o2 = new Observer('员工2')
boss.attach(o1)
boss.attach(o2)
boss.setState('加班')
- boss作为被观察者,员工1,员工2作为观察者
- boss通过attach方法,将两个观察者收集起来
- boss的状态发生改变,将自己的状态传递给所有的观察者,