弱事件模式是一种设计模式,它在事件传递的过程中使用弱引用,以避免因为强引用导致的内存泄漏。因此,它是对于源和监听器都弱的。
以下是使用弱事件模式的示例。假设我们有一个“Person”类,每个“Person”实例都可以注册在一个“EventManager”上。我们使用弱事件模式来监听“Person”的变化:
public class Person {
private String name;
private int age;
private EventManager eventManager;
public Person(String name, int age, EventManager eventManager) {
this.name = name;
this.age = age;
this.eventManager = eventManager;
}
public void setName(String name) {
this.name = name;
this.eventManager.notifyListeners(new PropertyChangeEvent(this, "name", null, name));
}
public void setAge(int age) {
this.age = age;
this.eventManager.notifyListeners(new PropertyChangeEvent(this, "age", null, age));
}
}
public class EventManager {
private Map<String, List<WeakReference<EventListener>>> listeners = new HashMap<>();
public void addListener(String eventName, EventListener listener) {
List<WeakReference<EventListener>> eventListeners = listeners.computeIfAbsent(eventName, k -> new ArrayList<>());
eventListeners.add(new WeakReference<>(listener));
}
public void notifyListeners(PropertyChangeEvent event) {
List<WeakReference<EventListener>> eventListeners = listeners.get(event.getPropertyName());
if (eventListeners != null) {
for (Iterator<WeakReference<EventListener>> it = eventListeners.iterator(); it.hasNext(); ) {
WeakReference<EventListener> reference = it.next();
EventListener listener = reference.get();
if (listener == null) {
it.remove(); // remove the dead listener
} else {
listener.propertyChanged(event); // notify the listener
}
}
}
}
}
public interface EventListener {
void propertyChanged(PropertyChangeEvent event);
}
public class MyEventListener implements EventListener {
@Override
public void propertyChanged(Property