java如何实现监听
监听器模式实现
在Java中,监听器模式通常通过定义事件、监听器接口和事件源来实现。事件源负责注册监听器并在特定事件发生时通知它们。
定义监听器接口:
public interface EventListener {
void onEvent(EventObject event);
}
创建事件源类:
public class EventSource {
private List<EventListener> listeners = new ArrayList<>();
public void addListener(EventListener listener) {
listeners.add(listener);
}
public void removeListener(EventListener listener) {
listeners.remove(listener);
}
public void fireEvent(EventObject event) {
for (EventListener listener : listeners) {
listener.onEvent(event);
}
}
}
使用Java内置事件模型
Java提供了java.util.EventObject和java.util.EventListener作为基础类,可以基于这些类构建监听系统。
自定义事件类:
public class CustomEvent extends EventObject {
public CustomEvent(Object source) {
super(source);
}
}
实现具体监听器:

public class CustomListener implements EventListener {
@Override
public void onEvent(EventObject event) {
if (event instanceof CustomEvent) {
System.out.println("Custom event received");
}
}
}
观察者模式实现
Java的java.util.Observable类和java.util.Observer接口提供了另一种监听机制。
创建被观察者:
public class ObservableData extends Observable {
private String data;
public void setData(String data) {
this.data = data;
setChanged();
notifyObservers(data);
}
}
创建观察者:

public class DataObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("Data changed to: " + arg);
}
}
注解驱动监听
现代Java框架如Spring提供了基于注解的监听机制。
Spring事件监听示例:
@Component
public class AnnotationListener {
@EventListener
public void handleContextEvent(ContextRefreshedEvent event) {
System.out.println("Context refreshed event received");
}
}
响应式编程监听
使用Java 9+的Flow API或Reactor等响应式库可以实现更现代的监听模式。
Flow API示例:
public class FlowListener implements Subscriber<String> {
private Subscription subscription;
@Override
public void onSubscribe(Subscription subscription) {
this.subscription = subscription;
subscription.request(1);
}
@Override
public void onNext(String item) {
System.out.println("Received: " + item);
subscription.request(1);
}
@Override
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
@Override
public void onComplete() {
System.out.println("Done");
}
}






