Java中观察者模式通过接口回调实现多态:Subject面向Observer接口编程,运行时动态调用各实现类的update方法,实现解耦与可扩展。

Java 中通过接口回调实现观察者模式,本质就是利用多态:被观察者(Subject)不依赖具体观察者(Observer)的实现类,只面向 Observer 接口编程;当状态变化时,调用接口方法,由 JVM 在运行时决定执行哪个观察者的具体逻辑。
定义统一的回调接口(Observer)
这是多态的起点。接口声明“通知方法”,不关心谁来实现、怎么实现:
public interface Observer {
void update(String message); // 回调入口,被 Subject 调用
}
所有具体观察者都实现这个接口,但行为可以完全不同——这就是多态的表现。
被观察者持有接口引用,而非实现类
Subject 类内部用 List
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
public class NewsAgency {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer); // 编译期只检查是否实现了 Observer
}
public void notifyAllObservers(String news) {
for (Observer obs : observers) {
obs.update(news); // 运行时动态绑定:谁的对象,就调谁的 update()
}
}
}
这里没有 new EmailObserver() 或 new SmsObserver() 的硬编码,也没有 if-else 判断类型——完全靠多态分发。
多个观察者实现同一接口,行为各异
不同观察者复写 update 方法,体现“同一操作,不同实现”:
- EmailObserver:把 message 封装成邮件发送
- SmsObserver:调用短信网关推送
- LogObserver:仅写入本地日志文件
它们在被 notifyAllObservers 调用时,自动执行各自逻辑——你不用改 NewsAgency 一行代码,只需新增一个 Observer 实现类并注册进去。
客户端按需组合,彻底解耦
使用方决定哪些观察者参与,且无需修改被观察者:
NewsAgency agency = new NewsAgency();
agency.addObserver(new EmailObserver());
agency.addObserver(new SmsObserver());
agency.notifyAllObservers("突发:Java 21 正式发布!");
// → EmailObserver.update() 和 SmsObserver.update() 先后被调用
接口回调 + 多态,让观察逻辑可插拔、可测试、可扩展。核心就三点:接口定义契约、被观察者面向接口编程、具体观察者覆盖实现。

















