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