Skip to content
大纲

观察者模式 Observer

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。

观察者模式 (Observer Pattern):定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

观察者模式是一种对象行为型模式

观察者模式中通常有两个模型,一个观察者(observer)和一个观察目标/被观察者(Observed)

观察者模式的别名包括发布 - 订阅(Publish/Subscribe)模式模型 - 视图(Model/View)模式源 - 监听器(Source/Listener)模式从属者(Dependents)模式

细究的话,发布订阅观察者有些不同,可以理解成发布订阅模式属于广义上的观察者模式

实现

js
// 定义观察者对象
class Observer {
  constructor(name, subject) {
    this.name = name
    if (subject) {
      subject.add(this)
    }
  }
  notify(message) {
    console.log(this.name, 'hello', message)
  }
}

// 定义一个观察目标对象
class Subject {
  constructor() {
    this.observerList = []
  }
  add(observer) {
    // 添加
    this.observerList.push(observer)
  }
  remove(observer) {
    // 移除
    const result = []
    for (let i = 0; i < this.observerList.length; i++) {
      const current = this.observerList[i]
      if (current.name !== observer.name) {
        result.push(current)
      }
    }
    this.observerList = result
    return this
    // const index = this.observerList.findIndex(o => o.name === observer.name);
    // this.observerList.splice(index, 1);
  }
  notify(message) {
    // 通知所有观察者
    const observers = this.observerList
    observers.forEach((observer) => observer.notify(message))
  }
}

// testing
let sub = new Subject()
let obs1 = new Observer('observer1', sub)
let obs2 = new Observer('observer2')
sub.add(obs2)
sub.notify('world')