JDK是如何支持观察者模式的?举例说明其实现方式。

参考回答

问题:JDK是如何支持观察者模式的?举例说明其实现方式。

JDK本身通过java.util.Observer接口和java.util.Observable类来实现观察者模式。这对类提供了一个简单的机制来实现一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知。

详细讲解与拓展

1. Observable

Observable类是JDK实现观察者模式的核心类。它是一个被观察者类,允许注册多个观察者。当该类的状态发生变化时,所有注册的观察者都会被通知。

  • addObserver(Observer o):向此Observable对象添加一个观察者。
  • deleteObserver(Observer o):从观察者列表中移除指定的观察者。
  • setChanged():标记该对象的状态发生了变化。
  • notifyObservers():通知所有注册的观察者更新。

2. Observer接口

Observer接口用于定义观察者的行为。它只有一个方法:
update(Observable o, Object arg):当被观察对象的状态发生变化时,update()方法会被调用,通知观察者更新。

3. 代码示例

以下是一个使用JDK内置的观察者模式实现的简单例子:

import java.util.Observable;
import java.util.Observer;

// 具体的观察者类,实现Observer接口
class CurrentConditionsDisplay implements Observer {
    private float temperature;
    private float humidity;

    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof WeatherData) {
            WeatherData weatherData = (WeatherData) o;
            this.temperature = weatherData.getTemperature();
            this.humidity = weatherData.getHumidity();
            display();
        }
    }

    public void display() {
        System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
    }
}

// 具体的被观察者类,实现Observable类
class WeatherData extends Observable {
    private float temperature;
    private float humidity;

    // 设置天气数据
    public void setMeasurements(float temperature, float humidity) {
        this.temperature = temperature;
        this.humidity = humidity;
        setChanged(); // 标记数据发生了变化
        notifyObservers(); // 通知所有观察者
    }

    public float getTemperature() {
        return temperature;
    }

    public float getHumidity() {
        return humidity;
    }
}

// 测试
public class WeatherStation {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();

        // 注册观察者
        weatherData.addObserver(currentDisplay);

        // 设置天气数据,触发通知
        weatherData.setMeasurements(80, 65);
        weatherData.setMeasurements(82, 70);
    }
}
Java

4. 代码解析

  • WeatherData:是被观察者,继承了Observable类。它包含了天气数据和更新方法(setMeasurements)。当数据发生变化时,调用setChanged()标记数据已变,并通过notifyObservers()通知所有注册的观察者。

  • CurrentConditionsDisplay:是观察者,实现了Observer接口。在update()方法中,它获取WeatherData的最新数据并显示。

  • 测试:在WeatherStation类中,我们创建了一个WeatherData实例和一个CurrentConditionsDisplay实例,并注册CurrentConditionsDisplayWeatherData的观察者。当我们调用setMeasurements()设置新的天气数据时,CurrentConditionsDisplay会自动接收到通知,并更新显示内容。

5. 输出结果

Current conditions: 80.0F degrees and 65.0% humidity
Current conditions: 82.0F degrees and 70.0% humidity

总结

JDK通过Observable类和Observer接口内置了对观察者模式的支持,允许一个对象(被观察者)通知多个依赖于它的对象(观察者)状态变化。使用这种机制非常简单,只需要让被观察者继承Observable类,让观察者实现Observer接口,并注册观察者即可。每当被观察者的状态发生变化时,所有注册的观察者会收到通知并更新。

发表评论

后才能评论