//发布订阅模式 主要分成两个部分 on emit//on 就是把一些函数维护到一个数组中//emit 让数组中的函数依次执行let fs = require('fs');// 订阅和发布没有明显的关系 靠数组做中介let event = { arr:[], on(fn){ this.arr.push(fn) }, emit(data){ this.arr.forEach(fn=>fn(data)) }}let obj = {}event.on(function(data){ obj = {...obj,...data}; if(Object.keys(obj).length === 2){ console.log('读取完毕: ', obj); }})fs.readFile('./name.txt','utf8',function(err,data){ event.emit({name:data})})fs.readFile('./age.txt','utf8',function(err,data){ event.emit({age:data})})
//观察者模式 有观察者 肯定有被观察者// 观察者需要放到被观察者中 被观察者状态发生变化 需要通知观察者 // 内部也是基于发布订阅模式 收集观察者 状态变化后 通知观察者class Observer{ // constructor(){ this.state = '开心' this.observers = []; } attach(o){ this.observers.push(o) } setState(newState){ this.state = newState; this.observers.forEach(o=>o.update(this)) }}class Subject{ // 观察者 constructor(name){ this.name = name; } update(baby){ console.log('当前' + this.name + '被通知了,当前小宝宝现在的状态是' + baby.state) }}let baby = new Observer('小宝宝')let parent = new Subject('爸爸');let mother = new Subject('妈妈');baby.attach(parent);baby.attach(mother);baby.setState('哭了')