JDK是如何支持观察者模式的?举例说明其实现方式。
JDK 实现观察者模式主要是通过 java.util.Observer
接口和 java.util.Observable
类。这是一个简单的实现,但在实际应用中可能需要更加复杂和灵活的实现。
在这个实现中,任何想要被观察的对象可以使用 Observable
类,而所有的观察者需要实现 Observer
接口。当 Observable
类的实例状态发生改变时,它可以调用 setChanged
方法,然后调用 notifyObservers
方法来通知所有的观察者。
Observer
接口有一个 update
方法,当被观察的对象状态改变时,这个方法会被调用。对象的状态可以作为参数传递给 update
方法。
这是一个简单的例子:
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();
}
public float getTemperature() {
return temperature;
}
}
// 观察者类
class CurrentConditionsDisplay implements Observer {
@Override
public void update(Observable obs, Object arg) {
if (obs instanceof WeatherData) {
WeatherData weatherData = (WeatherData) obs;
System.out.println("Temperature has changed to: " + weatherData.getTemperature());
}
}
}
// 测试类
public class Test {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
weatherData.addObserver(currentDisplay);
weatherData.setTemperature(80);
}
}
在这个例子中,当气温改变时,所有注册的观察者(如 CurrentConditionsDisplay
)都会被通知。
然而,需要注意的是,自从 JDK 9 开始,Observer
和 Observable
已经被标记为废弃。这是因为存在更好的实现方式,如使用 Java 的函数式编程特性,或者使用更复杂、更灵活的观察者设计模式实现,例如 “发布-订阅” 模式。