在 JDK 11 中,java.util.Observer 和 java.util.Observable 已被废弃,主要是由于这些类在设计上的一些缺陷,例如线程安全性和缺乏灵活性等。推荐使用现代的观察者模式实现,例如 java.beans 包中的相关类,如 PropertyChangeListener 和 PropertyChangeSupport。下面是使用 java.util.Observer 和 java.util.Observable 的示例,以及如何使用 java.beans 包中的相关类来实现同样的功能。
JDK8
使用 java.util.Observer 和 java.util.Observable
这是一个经典的观察者模式实现示例,使用了 java.util.Observer 和 java.util.Observable。
import java.util.Observable;
import java.util.Observer;
// 具体的观察者
class MyObserver implements Observer {
private String name;
public MyObserver(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(name + " received update: " + arg);
}
}
// 具体的可观察者
class MyObservable extends Observable {
public void setData(String data) {
setChanged();
notifyObservers(data);
}
}
public class Main {
public static void main(String[] args) {
MyObservable observable = new MyObservable();
MyObserver observer1 = new MyObserver("Observer1");
MyObserver observer2 = new MyObserver("Observer2");
observable.addObserver(observer1);
observable.addObserver(observer2);
observable.setData("Hello, Observers!");
}
}
JDK11
使用 java.beans.PropertyChangeListener 和 java.beans.PropertyChangeSupport
这是使用 java.beans 包中的 PropertyChangeListener 和 PropertyChangeSupport 来实现观察者模式的示例。
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
// 具体的观察者
class MyPropertyChangeListener implements PropertyChangeListener {
private String name;
public MyPropertyChangeListener(String name) {
this.name = name;
}
@Override
public void propertyChange(java.beans.PropertyChangeEvent evt) {
System.out.println(name + " received update: " + evt.getNewValue());
}
}
// 具体的可观察者
class MyBean {
private String data;
private final PropertyChangeSupport support;
public MyBean() {
this.support = new PropertyChangeSupport(this);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
support.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
support.removePropertyChangeListener(listener);
}
public void setData(String data) {
String oldData = this.data;
this.data = data;
support.firePropertyChange("data", oldData, data);
}
public String getData() {
return data;
}
}
public class Main {
public static void main(String[] args) {
MyBean myBean = new MyBean();
MyPropertyChangeListener listener1 = new MyPropertyChangeListener("Listener1");
MyPropertyChangeListener listener2 = new MyPropertyChangeListener("Listener2");
myBean.addPropertyChangeListener(listener1);
myBean.addPropertyChangeListener(listener2);
myBean.setData("Hello, PropertyChangeListeners!");
}
}