Java观察者框架

观察者模式是软件设计模式中的一种行为型模式。它定义了一种一对多的依赖关系,当被观察者的状态发生改变时,所有依赖于它的观察者都会自动收到通知并进行更新。在Java中,观察者模式可以使用Java观察者框架来实现。

什么是Java观察者框架?

Java观察者框架是Java语言提供的一个内置框架,用于实现观察者模式。它由两个核心接口组成:ObserverObservable。观察者通过实现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
``