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 开始,ObserverObservable 已经被标记为废弃。这是因为存在更好的实现方式,如使用 Java 的函数式编程特性,或者使用更复杂、更灵活的观察者设计模式实现,例如 “发布-订阅” 模式。

发表评论

后才能评论