Java观察者框架
观察者模式是软件设计模式中的一种行为型模式。它定义了一种一对多的依赖关系,当被观察者的状态发生改变时,所有依赖于它的观察者都会自动收到通知并进行更新。在Java中,观察者模式可以使用Java观察者框架来实现。
什么是Java观察者框架?
Java观察者框架是Java语言提供的一个内置框架,用于实现观察者模式。它由两个核心接口组成:Observer
和Observable
。观察者通过实现Observer
接口来定义观察者的行为,而被观察者则通过继承Observable
类来实现被观察者的功能。
示例代码
让我们通过一个简单的示例来说明Java观察者框架的使用方法。假设我们有一个名为WeatherData
的类,它表示一个天气数据源,我们希望能够订阅该数据源并在数据更新时收到通知。
import java.util.Observable;
import java.util.Observer;
public class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public void measurementsChanged() {
setChanged();
notifyObservers();
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
public class CurrentConditionsDisplay implements Observer {
private float temperature;
private float humidity;
public void update(Observable observable, Object arg) {
if (observable instanceof WeatherData) {
WeatherData weatherData = (WeatherData) observable;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
在上面的示例代码中,WeatherData
类继承自Observable
类,并通过setChanged()
和notifyObservers()
方法来通知所有的观察者。CurrentConditionsDisplay
类实现了Observer
接口,并通过update()
方法来接收数据更新的通知。
使用Java观察者框架
使用Java观察者框架非常简单。我们只需要创建一个被观察者对象和若干个观察者对象,然后将观察者注册到被观察者上即可。
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
weatherData.addObserver(currentDisplay);
weatherData.setMeasurements(80, 65, 30.4f);
}
}
在上面的示例中,我们创建了一个WeatherData
对象和一个CurrentConditionsDisplay
对象。然后,我们通过调用addObserver()
方法将CurrentConditionsDisplay
对象注册为WeatherData
对象的观察者。最后,我们通过调用setMeasurements()
方法来更新天气数据,并自动通知观察者。
类图
下面是示例代码中使用的类的类图:
classDiagram
class WeatherData {
+ measurementsChanged()
+ setMeasurements(float, float, float)
+ getTemperature(): float
+ getHumidity(): float
+ getPressure(): float
}
class CurrentConditionsDisplay {
+ update(Observable, Object): void
+ display(): void
}
WeatherData <|-- Observable
CurrentConditionsDisplay <|-- Observer
流程图
下面是示例代码中的流程图:
flowchart TD
subgraph WeatherData
measurementsChanged --> setChanged
setChanged --> notifyObservers
end
subgraph CurrentConditionsDisplay
update --> display
end
setMeasurements --> measurementsChanged
measurementsChanged --> setChanged
setChanged --> notifyObservers
notifyObservers --> update
update --> display
``