13. 观察者模式(Observer)

问题:一个对象状态变化时,需要自动通知多个依赖对象。

核心:目标维护观察者列表,状态变化时遍历通知。

class EventEmitter {
  #listeners = {};

  on(event, fn) {
    (this.#listeners[event] ??= []).push(fn);
    return this;
  }

  emit(event, data) {
    (this.#listeners[event] ?? []).forEach(fn => fn(data));
  }
}

const bus = new EventEmitter();
bus.on('login', user => console.log(`${user} 已登录`));
bus.on('login', user => console.log(`记录日志: ${user} 登录`));

bus.emit('login', '小明');
// 小明 已登录
// 记录日志: 小明 登录
package observer

import "fmt"

type Observer interface {
  OnNotify(event string, data any)
}

type EventEmitter struct {
  listeners map[string][]Observer
}

func NewEventEmitter() *EventEmitter {
  return &EventEmitter{listeners: make(map[string][]Observer)}
}

func (e *EventEmitter) On(event string, obs Observer) {
  e.listeners[event] = append(e.listeners[event], obs)
}

func (e *EventEmitter) Emit(event string, data any) {
  for _, obs := range e.listeners[event] {
    obs.OnNotify(event, data)
  }
}

// 示例观察者
type Logger struct{}

func (l Logger) OnNotify(event string, data any) {
  fmt.Printf("记录日志: %v %v\n", event, data)
}

DOM 的 addEventListener、Node.js 的 EventEmitter、Vue 的响应式系统都是观察者模式。