观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在Java开发中,JDK提供了java.util.Observable和java.util.Observer接口来实现观察者模式,下面将深入解析JDK观察者模式,并提供一些实践技巧。
观察者模式原理
观察者模式的核心是两个角色:观察者(Observer)和被观察者(Observable)。被观察者维护一个观察者列表,当状态发生变化时,通知所有观察者。以下是观察者模式的基本结构:
- Subject(被观察者):负责维护一个观察者列表,并提供注册、删除、通知观察者的接口。
- Observer(观察者):实现一个更新接口,当被观察者状态变化时,接收通知并自动更新。
JDK观察者模式实现
在JDK中,Observable类实现了被观察者的功能,而Observer接口定义了观察者的更新方法。以下是一个简单的示例:
import java.util.Observable;
import java.util.Observer;
public class WeatherStation {
private float temperature;
public void setTemperature(float temperature) {
this.temperature = temperature;
notifyObservers();
}
public float getTemperature() {
return temperature;
}
public void addObserver(Observer observer) {
Observable.super.addObserver(observer);
}
public void deleteObserver(Observer observer) {
Observable.super.deleteObserver(observer);
}
protected void setChanged() {
Observable.super.setChanged();
}
protected void notifyObservers() {
Observable.super.notifyObservers();
}
protected void notifyObservers(Object arg) {
Observable.super.notifyObservers(arg);
}
}
public class TemperatureDisplay implements Observer {
private float currentTemperature;
public void update(Observable observable, Object arg) {
if (arg instanceof Float) {
currentTemperature = (Float) arg;
display();
}
}
private void display() {
System.out.println("当前温度:" + currentTemperature);
}
}
public class WeatherStationTest {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
TemperatureDisplay temperatureDisplay = new TemperatureDisplay();
weatherStation.addObserver(temperatureDisplay);
weatherStation.setTemperature(30.5f);
weatherStation.setTemperature(35.2f);
}
}
在上面的示例中,WeatherStation类实现了Observable,TemperatureDisplay类实现了Observer。当WeatherStation的温度发生变化时,TemperatureDisplay会自动更新显示温度。
实践技巧
- 合理使用观察者模式:观察者模式适用于那些需要对象之间一对多依赖关系,并且状态变化需要通知多个对象的场景。
- 避免过度使用:如果系统中存在大量的观察者,可能会导致性能问题。在可能的情况下,尽量减少观察者的数量。
- 使用弱引用观察者:在JDK中,可以使用
java.util.WeakReference来创建弱引用观察者,这样可以避免内存泄漏。 - 考虑使用其他模式:在某些情况下,观察者模式可能不是最佳选择,可以考虑使用其他模式,如发布/订阅模式。
通过以上解析和实践技巧,相信您已经对JDK观察者模式有了更深入的了解。在实际开发中,灵活运用观察者模式,可以有效地提高代码的可扩展性和可维护性。
