本文目录导读:

在Java中实现观察者模式(监听器模式)主要有以下几种方式,我来详细说明:
使用Java内置的Observer/Observable(JDK 9之前)
import java.util.Observable;
import java.util.Observer;
// 被观察者(主题)
class WeatherData extends Observable {
private float temperature;
public void setTemperature(float temperature) {
this.temperature = temperature;
// 数据变化,通知观察者
setChanged();
notifyObservers(temperature);
}
}
// 观察者
class CurrentConditionsDisplay implements Observer {
private String name;
public CurrentConditionsDisplay(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
float temperature = (Float) arg;
System.out.println(name + " 收到温度更新:" + temperature + "°C");
}
}
// 使用示例
public class ObserverExample {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay display1 = new CurrentConditionsDisplay("显示器1");
CurrentConditionsDisplay display2 = new CurrentConditionsDisplay("显示器2");
weatherData.addObserver(display1);
weatherData.addObserver(display2);
weatherData.setTemperature(25.5f);
weatherData.setTemperature(28.0f);
}
}
自定义观察者模式(最常用)
import java.util.ArrayList;
import java.util.List;
// 观察者接口
interface Observer {
void update(String message);
}
// 被观察者接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 具体被观察者
class NewsPublisher implements Subject {
private List<Observer> observers = new ArrayList<>();
private String latestNews;
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(latestNews);
}
}
// 发布新消息
public void publishNews(String news) {
this.latestNews = news;
System.out.println("发布新闻: " + news);
notifyObservers();
}
}
// 具体观察者
class Subscriber implements Observer {
private String name;
public Subscriber(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到新闻: " + message);
}
}
// 使用示例
public class CustomObserverExample {
public static void main(String[] args) {
NewsPublisher publisher = new NewsPublisher();
Subscriber subscriber1 = new Subscriber("张三");
Subscriber subscriber2 = new Subscriber("李四");
publisher.registerObserver(subscriber1);
publisher.registerObserver(subscriber2);
publisher.publishNews("Java 17 发布!");
publisher.publishNews("Spring Boot 3.0 来了!");
publisher.removeObserver(subscriber2);
publisher.publishNews("只通知张三的新闻");
}
}
使用事件监听器模式(AWT/Swing风格)
import java.util.EventListener;
import java.util.EventObject;
import java.util.ArrayList;
import java.util.List;
// 事件对象
class DataChangeEvent extends EventObject {
private String dataType;
private Object newValue;
public DataChangeEvent(Object source, String dataType, Object newValue) {
super(source);
this.dataType = dataType;
this.newValue = newValue;
}
public String getDataType() {
return dataType;
}
public Object getNewValue() {
return newValue;
}
}
// 监听器接口
interface DataChangeListener extends EventListener {
void onDataChanged(DataChangeEvent event);
}
// 事件源
class DataModel {
private List<DataChangeListener> listeners = new ArrayList<>();
private String name;
private int value;
public DataModel(String name) {
this.name = name;
}
public void addDataChangeListener(DataChangeListener listener) {
listeners.add(listener);
}
public void removeDataChangeListener(DataChangeListener listener) {
listeners.remove(listener);
}
public void setValue(int value) {
int oldValue = this.value;
this.value = value;
if (oldValue != value) {
fireDataChanged("value", value);
}
}
private void fireDataChanged(String dataType, Object newValue) {
DataChangeEvent event = new DataChangeEvent(this, dataType, newValue);
for (DataChangeListener listener : listeners) {
listener.onDataChanged(event);
}
}
}
// 监听器实现
class DataChangeHandler implements DataChangeListener {
private String handlerName;
public DataChangeHandler(String handlerName) {
this.handlerName = handlerName;
}
@Override
public void onDataChanged(DataChangeEvent event) {
System.out.println(handlerName + " 处理事件 - 数据: " +
event.getDataType() + " 新值: " + event.getNewValue());
}
}
// 使用示例
public class EventListenerExample {
public static void main(String[] args) {
DataModel model = new DataModel("温度传感器");
DataChangeHandler handler1 = new DataChangeHandler("处理器1");
DataChangeHandler handler2 = new DataChangeHandler("处理器2");
model.addDataChangeListener(handler1);
model.addDataChangeListener(handler2);
model.setValue(25);
model.setValue(30);
}
}
使用Java 8+ 函数式接口(简洁版)
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
class EventManager<T> {
private List<Consumer<T>> listeners = new ArrayList<>();
public void addListener(Consumer<T> listener) {
listeners.add(listener);
}
public void removeListener(Consumer<T> listener) {
listeners.remove(listener);
}
public void fireEvent(T event) {
listeners.forEach(listener -> listener.accept(event));
}
}
// 使用示例
public class FunctionalObserverExample {
public static void main(String[] args) {
EventManager<String> eventManager = new EventManager<>();
// 添加监听器(Lambda表达式)
eventManager.addListener(event ->
System.out.println("监听器1 收到: " + event));
eventManager.addListener(event ->
System.out.println("监听器2 收到: " + event + " (处理完成)"));
// 触发事件
eventManager.fireEvent("任务完成");
eventManager.fireEvent("数据更新");
}
}
推荐实践方案
对于大多数Java应用,推荐使用 方案2(自定义观察者模式),因为:
- 灵活性高
- 不依赖特定JDK版本
- 易于理解和维护
- 可以自定义事件类型和数据
对于Spring项目,还可以使用@EventListener注解实现声明式事件监听:
@Component
public class UserService {
@EventListener
public void handleUserCreated(UserCreatedEvent event) {
System.out.println("用户创建事件: " + event.getUsername());
}
}
选择哪种方式取决于你的具体需求和项目架构。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播