在 Java 中,Observer(观察者)模式的实现方式主要有以下几类/几种,从“语言原生支持”到“框架/第三方实现”都有:
java.util.Observer + java.util.Observable(已过时)这是 Java 最早的观察者模式实现。
组成:
Observable:被观察者Observer:观察者示例:
class Subject extends Observable {
void changeData(String data) {
setChanged();
notifyObservers(data);
}
}
class MyObserver implements Observer {
public void update(Observable o, Object arg) {
System.out.println("收到数据:" + arg);
}
}
✅ 优点:简单
❌ 缺点:
Observable(单继承限制)EventListener 机制的观察者模式(GUI / 事件驱动)这是观察者模式在 GUI 中的典型应用。
例子:
button.addActionListener(e -> {
System.out.println("按钮被点击");
});
本质:
✅ 常用于:
HttpSessionListener)不依赖过期 API,完全可控。
示例:
interface Observer {
void update(String msg);
}
class Subject {
private List<Observer> observers = new ArrayList<>();
void add(Observer o) { observers.add(o); }
void notify(String msg) {
observers.forEach(o -> o.update(msg));
}
}
✅ 优点:
java.util.concurrent 实现异步观察者结合线程池或 CompletableFuture。
observers.forEach(o ->
executor.submit(() -> o.update(msg))
);
或:
CompletableFuture.runAsync(() -> o.update(msg));
✅ 适合:
Function / Consumer 作为观察者函数式接口替代 Observer 接口。
List<Consumer<String>> listeners = new ArrayList<>();
void onMessage(Consumer<String> c) {
listeners.add(c);
}
调用:
onMessage(msg -> System.out.println(msg));
✅ 优点:
Spring 本质就是观察者模式。
@Component
public class MyListener implements ApplicationListener<MyEvent> {
public void onApplicationEvent(MyEvent e) {
// 处理事件
}
}
✅ 特点:
@Async)严格说已超出“设计模式”,但是观察者思想的延伸:
✅ 跨 JVM / 跨服务
| 类型 | 是否推荐 | 说明 |
|---|---|---|
| Observable / Observer | ❌ | 已过时 |
| 事件监听 | ✅ | GUI / Web |
| 自定义 Observer | ✅✅ | 最常用 |
| 函数式 Observer | ✅✅ | Java 8+ |
| Spring 事件 | ✅✅✅ | 企业级 |
| MQ | ✅✅✅ | 分布式 |
如果你愿意,我可以:
你想要哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。