关键计算变量需封装变更逻辑于被观察者内部,通过私有字段+带通知的setter统一入口,结合值变化判断、链式计算收口、观察者职责隔离、生命周期对齐、节流/合并通知及线程安全存储实现高效响应。

要让关键计算变量一变就触发响应,核心不是“监听变量”,而是把变量变更动作封装进被观察者内部,并在每次赋值时主动广播通知。
被观察者必须接管变量的读写入口
不能把变量暴露为 public 或提供不带通知逻辑的 setter。所有状态修改必须经过统一入口:
- 定义私有字段(如 private double totalScore)
- 只提供带通知的 public 方法(如 setTotalScore(double s))
- 方法内先判断值是否真变化(避免无意义通知),再更新字段,最后调用 notifyAllObservers()
- 若变量参与链式计算(如 score = accuracy × weight),建议将整个计算逻辑收口到被观察者中,setter 只接受原始输入,由它内部重算并决定是否通知
观察者需聚焦自身职责,避免副作用
每个观察者只处理自己关心的更新逻辑,且不能反向修改被观察者状态:
- UI 观察者:拿到新值后刷新图表或文本,不调用任何 setter
- 校验观察者:检查 totalScore 是否超阈值,仅记录告警或抛异常
- 持久化观察者:将新值写入数据库或本地缓存,完成后不反馈
- 所有 update() 方法里禁止调用被观察者的 setState 类方法,否则可能引发循环通知
注册解绑必须严格生命周期对齐
尤其在有明确生命周期的环境(如 Android Activity、Spring Bean、React 组件)中,漏解绑会导致内存泄漏或空指针:
- Android:onCreate 中 add,onDestroy 中 remove
- Spring:@PostConstruct 注册,@PreDestroy 解绑;或用 DisposableBean 接口
- 前端组件:mounted 时注册,unmounted / useEffect cleanup 时移除
- 临时监听可设计为“一次性观察者”——update 执行后自动从列表中删除自身
高频变更需加控制,防止雪崩式通知
当变量因算法迭代频繁更新(如每秒数十次),直接逐次通知会拖慢主线程或压垮下游:
- 采用节流(throttle):限定单位时间内最多通知一次,取最后一次值
- 改用合并通知(debounce):等待变更暂停后再发最终值
- 区分通知等级:对 UI 观察者发节流值,对日志观察者发全量快照
- 多线程下使用 CopyOnWriteArrayList 存储观察者列表,保证遍历时增删安全

















