简短结论:观察者模式(Observer)在很多场景下可以替代回调(Callback),但二者并不等价,也不能完全互相取代。
下面从概念、对比、适用场景和替代关系来说明。
常见形式:
button.setOnClickListener(() -> {
System.out.println("clicked");
});
subject.addObserver(this);
subject.notifyObservers();
✅ 非常适合用观察者替代回调
例如:
✅ 优势:
✅ 观察者更合适
回调:
onSuccess(result);
观察者:
for (Observer o : observers) {
o.onSuccess(result);
}
❌ 不适合
如:
回调更自然:
fetchData(result -> handle(result));
观察者会显得过度设计
❌ 观察者不适合
观察者通常是:
❌ 回调更直观
例如:
api.login(username, password, callback);
换成观察者会让 API 变复杂
| 维度 | 回调 | 观察者模式 |
|---|---|---|
| 耦合度 | 较高 | 低 |
| 通信方式 | 一对一 | 一对多 |
| 扩展能力 | 差 | 强 |
| 使用复杂度 | 简单 | 稍复杂 |
| 适合场景 | 单次、流程性 | 事件、状态变化 |
| 是否可替代 | ✅ 部分 | ✅ 部分 |
很多框架同时使用两者:
例如:
onClickListener(回调)LiveData(观察者)回调是“点对面”的调用,观察者模式是“面对多”的通知。
观察者模式可以替代回调用于事件通知,但不适合替代回调用于流程控制和一次性结果返回。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。