一个简单的观察者模式

114 阅读1分钟

清明在家闲着也是闲着(疫情封控躺的腰酸背痛),来实现一个简单的观察者模式demo叭

先用大白话解释下什么是观察者模式,三月,是个悲伤的31个日子,相信大A的同学并不好过,不过每天工作挺轻松的,毕竟每天都是下午三点才开始写代码(收盘),command+tab两个键已经褪色很多,毕竟得时刻关注纺织机的走线,过高或过低都可能对应加仓或止损,此时股市就是被观察者,而韭菜就是观察者,当被观察者变化时,就会通知观察者做出对应响应。

// 被观察者
class Stocks {
  constructor(name) {
    this.name = name
    this.state = ''
    this.observers = []// 韭菜
  }

  // 添加新的韭菜观察者
  attach (observer) {
    this.observers.push(observer)
  }

  // 获取被观察者状态
  getState () {
    return this.state
  }

  // 状态改变后通知观察者
  setState (state) {
    this.state = state
    this.notifyAllObservers()
  }

  // 通知观察者
  notifyAllObservers () {
    if (this.observers.length > 0) {
      this.observers.forEach(observer => observer.update(this.state))
    }
  }
}

// 观察者
class Leek {
  constructor(name, stock) {
    this.name = name
    // 将当前观察者添加到观察者队列
    stock.attach(this)
  }

  // 更新韭菜状态
  update (newState) {
    this.state = newState
  }

  // 做出响应动作
  action (cb) {
    cb.call(this)
  }
}
// 测试
const stock = new Stocks('海狗')
const leek1 = new Leek('辣条1', stock)
const leek2 = new Leek('辣条2', stock)
stock.setState('抄底时机已到')
const leek1Cb = function () {
  if (this.state === '抄底时机已到') {
    console.log(`我是韭菜${this.name},${this.state},加仓加仓!`)
  }
}
const leek2Cb = function () {
  if (this.state === '抄底时机已到') {
    console.log(`我是韭菜${this.name},${this.state}?你他么是想抄我家吧!`)
  }
}
leek1.action(leek1Cb)
leek2.action(leek2Cb)

image.png