13. 观察者模式(Observer)
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 的响应式系统都是观察者模式。