1. 发布订阅
- 大白话解释
订阅好一件事,当这件事发生的时候,触发对应的函数
订阅: on
发布:emit
promise 内部也是基于发布订阅的
- 好处
多个类之间可以解耦合
- 特点
订阅方和发布方没有任何的关系
- 实现
let fs = require('fs')
let e = {
_obj: {},
_callback: [],
on(callBack) { // 订阅就是将函数放到数组中
this._callback.push(callBack)
},
emit(key, val) {
this._obj[key] = val // 让订阅的数组中的方法依次执行
this._callback.forEach(method => {
method(this._obj)
})
}
}
e.on(function(obj) { // 每次发布都会触发此函数
console.log(obj); // 用户根据结果自己决定输出
})
fs.readFile('./testfile/name.txt', 'utf8', (err, data) => {
e.emit('name', data)
})
fs.readFile('./testfile/age.txt', 'utf8', (err, data) => {
e.emit('age', data)
})
2. 观察者
- 大白话解释
观察者和被观察者是有关联的
观察者需要将自己放到被观察者之上
当被观察者状态发生变化的时候,需要通知所有的观察者
- 实例
/**
* 实例场景
* 1. 我家有个小宝宝 我要监控小宝宝的状态 - 小宝宝就是被观察者 , 我就是观察者
* 2. 小宝宝的状态是 开心 / 不开心
*/
class Observer { // 观察者
constructor(name) {
this.name = name
}
update(s) { // 等会被观察者的状态发生变化的时候会调用这个方法
console.log(`${this.name}说,${s.name}当前的状态是${s.state}`);
}
}
class Subject { // 被观察者
constructor(name) {
this.name = name
this.state = '开心'
this.observers = [] // 这里存的是观察者
}
attach(o) { // 需要将注册者放到自己身上,也就是说需要小宝宝同意你的观察
this.observers.push(o)
}
setData(state) {
this.state = state
this.observers.forEach(o => {
o.update(this)
})
}
}
let baby = new Subject('小宝宝')
let parent = new Observer('爸爸')
let mother = new Observer('妈妈')
baby.attach(parent)
baby.attach(mother)
baby.setData('不开心')