观察者模式(Observer Pattern)在解耦方面很优秀,但在性能上容易出问题,尤其当观察者数量多、通知频繁或逻辑复杂时。下面从 问题根源 → 优化策略 → 实战建议 三个层面来讲。
通知风暴
同步阻塞
update()观察者管理低效
List 线性查找不必要的通知
内存与生命周期问题
executor.submit(() -> observer.update(event));
interface Observer {
boolean supports(Event event);
void onEvent(Event event);
}
Subject 中:
for (Observer o : observers) {
if (o.supports(event)) {
o.onEvent(event);
}
}
✅ 适合:
例如:
A → B → C → D
↓
只通知 D
✅ 常见场景:
| 场景 | 建议 |
|---|---|
| 观察者多 | CopyOnWriteArrayList |
| 高频注册/注销 | Set 去重 |
| 顺序重要 | List |
| 并发高 | 不可变快照 |
private final List<Observer> observers =
new CopyOnWriteArrayList<>();
update() {
readDB();
callRPC();
compute();
}
Map<Observer, WeakReference<Observer>>
或使用:
WeakReferencePhantomReference用 发布 / 订阅 替代传统观察者:
✅ 优点:
Subject
↓
DomainObserver
↓
UIObserver
↓
LogObserver
✅ 每层只处理自己职责
✅ 避免“上帝观察者”
notifyObservers(List<Event> events);
✅ 减少调用次数
✅ 适合高频数据变化
观察者模式的性能优化核心:减少通知次数、减少阻塞、减少无效工作。
如果你愿意,我可以:
直接说你的使用场景即可。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。