| name | metaframe-observer-pattern |
|---|---|
| category | engineering |
| description | 观察者模式 | Code & Engineering |
英文名: Observer Pattern
分类: 编码实践
作者: Gamma, Helm, Johnson, Vlissides, 1994
复杂度: intermediate
成熟度: foundational
AI 相关: ✅ 是
当对象状态发生变化时自动通知所有依赖方
- 主题(可观察者):维护观察者列表,在状态变化时广播通知
- 观察者:主题在通知时调用的接口或回调,将其与具体实现解耦
- 推送 vs 拉取:主题可在通知负载中推送状态(推送模式),或观察者在收到通知后查询状态(拉取模式)
- 定义主题接口:暴露注册、注销和通知观察者的方法,使主题独立于具体观察者类型
- 定义观察者接口:声明主题将调用的 update 方法,携带相关状态或事件数据
- 实现具体主题:维护观察者列表,管理状态,并在有意义的状态变更时调用通知方法
- 实现具体观察者:向主题注册,通过读取主题状态或推送的事件负载对通知做出响应
- 管理订阅生命周期:确保观察者在不再需要时取消订阅,防止内存泄漏和陈旧通知
['一个对象的状态变化需要触发数量未知或可变的其他对象的更新', '希望将事件生产者与消费者解耦,无需双方互相了解', '构建响应式 UI、事件驱动的智能体环境或实时数据流,多个组件对变化做出响应']
- 使用弱引用或显式取消订阅,防止观察者比主题生命周期更长时造成内存泄漏
- 保持观察者的 update 方法快速且非阻塞;将繁重工作卸载到后台线程或队列
- 考虑在通知中传递事件数据,而非强制观察者回调主题
- 不要创建级联通知链,即一个观察者触发另一个主题的通知——这会导致难以追踪的更新风暴
- 当观察者相互依赖对方效果时,不要以不确定的顺序通知观察者
- 不要将观察者用于简单的一对一回调;直接方法调用或委托更简单
Sources: SDFrame (Software Design) MetaFrame: 💻 Code & Engineering / 编码与工程