java中通过observer和subject接口实现观察者模式,前者定义onevent回调,后者管理注册、移除和通知;newspublisher和email/smssubscriber为具体实现,支持松耦合事件通知。

Java 中通过接口实现观察者(发布-订阅)模式,核心是定义两个关键接口:一个描述“被观察者”(即发布者),一个描述“观察者”(即订阅者)。这种解耦设计让发布者无需知道具体有哪些订阅者,只需通知它们;订阅者也只需关心自己感兴趣的事件,不依赖发布者具体实现。
定义 Observer 接口(观察者)
观察者接口声明一个统一的回调方法,供发布者在状态变化时调用:
public interface Observer {
void onEvent(Object eventData);
}
实际使用中可按需泛型化或拆分为更具体的事件方法(如 onUserCreated()、onOrderPaid()),但基础版本保持简洁通用即可。
定义 Subject 接口(被观察者 / 发布者)
该接口管理观察者注册、移除和通知行为,不涉及具体实现细节:
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(Object eventData);
}
注意:这里用 Object 作为事件数据类型便于演示,生产中建议使用自定义事件类(如 OrderEvent)并配合泛型增强类型安全。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
实现具体发布者(ConcreteSubject)
实现 Subject 接口,内部维护观察者列表,并在状态变更时触发通知:
import java.util.ArrayList;
import java.util.List;
public class NewsPublisher implements Subject {
private final List<observer> observers = new ArrayList();
@Override
public void registerObserver(Observer observer) {
if (!observers.contains(observer)) {
observers.add(observer);
}
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(Object eventData) {
for (Observer observer : observers) {
observer.onEvent(eventData);
}
}
// 模拟发布新闻
public void publishNews(String news) {
System.out.println("【发布】:" + news);
notifyObservers(news);
}
}</observer>
实现具体观察者(ConcreteObserver)
实现 Observer 接口,定义收到通知后的响应逻辑:
public class EmailSubscriber implements Observer {
private final String email;
public EmailSubscriber(String email) {
this.email = email;
}
@Override
public void onEvent(Object eventData) {
System.out.println("? 邮件订阅者 " + email + " 收到:" + eventData);
}
}
public class SmsSubscriber implements Observer {
private final String phoneNumber;
public SmsSubscriber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public void onEvent(Object eventData) {
System.out.println("? 短信订阅者 " + phoneNumber + " 收到:" + eventData);
}
}
使用示例:
public class Main {
public static void main(String[] args) {
NewsPublisher publisher = new NewsPublisher();
publisher.registerObserver(new EmailSubscriber("user@example.com"));
publisher.registerObserver(new SmsSubscriber("138****1234"));
publisher.publishNews("Java 21 正式发布!");
// 输出:
// 【发布】:Java 21 正式发布!
// ? 邮件订阅者 user@example.com 收到:Java 21 正式发布!
// ? 短信订阅者 138****1234 收到:Java 21 正式发布!
}
}
补充说明:
- 线程安全需自行处理:若多线程注册/通知,建议用
CopyOnWriteArrayList替代ArrayList - 避免内存泄漏:记得在观察者不再需要时调用
removeObserver,尤其在 GUI 或 Android 场景中 - 可扩展事件类型:将
onEvent(Object)改为<t> void onEvent(T event)</t>并配合泛型接口提升类型安全性 - JDK 自带支持:Java 提供了
java.util.Observable和java.util.Observer,但已标记为过时(since Java 9),推荐自行定义接口以获得更好控制力和可读性
不复杂但容易忽略的是观察者生命周期管理和事件传递的语义一致性——比如是否保证通知顺序、是否支持异步、失败是否重试等,这些要在接口契约中明确或由具体实现约定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










