发布订阅者模式和观察者模式

132 阅读1分钟

说明

之前听珠峰架构课,姜文老师在《手写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的状态发生改变,将自己的状态传递给所有的观察者,