在 Java 中优化观察者模式(Observer Pattern),通常目标都是:解耦更彻底、性能更好、线程安全、易扩展、易维护。下面从设计层面和代码层面系统地说。
典型实现:
interface Observer {
void update(String msg);
}
问题:
class UserEvent {
private String username;
// getter/setter
}
interface Observer {
void onEvent(UserEvent event);
}
✅ 好处:
java.util.Observable(不推荐)⚠️ 已过时,同步、设计老旧
EventListener 风格(推荐)Spring / GUI 常用方式:
interface UserEventListener {
void handle(UserEvent event);
}
@Subscribe
public void listen(UserEvent event) {
// 处理逻辑
}
EventBus bus = new EventBus();
bus.register(listener);
bus.post(new UserEvent());
✅ 优点:
@Component
public class UserListener {
@EventListener
public void handle(UserEvent event) {}
}
@Autowired
ApplicationEventPublisher publisher;
publisher.publishEvent(new UserEvent());
✅ 支持:
@Async@TransactionalEventListenerExecutors.newFixedThreadPool(4).submit(() -> observer.onEvent(event));
或使用:
@EventListener
@Async
public void asyncHandle(UserEvent event) {}
✅ 防止慢观察者拖垮主流程
for (Observer o : observers) {
try {
o.onEvent(event);
} catch (Exception e) {
log.error("observer error", e);
}
}
✅ 一个观察者异常不影响其他
CopyOnWriteArrayListprivate final List<Observer> observers =
new CopyOnWriteArrayList<>();
✅ 读多写少,线程安全
interface Observer {
int order();
boolean support(UserEvent event);
void onEvent(UserEvent event);
}
或:
@Order| 场景 | 推荐方案 |
|---|---|
| 简单项目 | 接口 + 事件对象 |
| 中大型 | Spring Event |
| 高性能 | Guava EventBus + 异步 |
| 分布式 | MQ(Kafka / RabbitMQ) |
不要手写观察者,用“事件 + 发布订阅 + 异步 + 异常隔离”来优化它。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。