📜  观察者模式 |设置 2(实施)(1)

📅  最后修改于: 2023-12-03 15:27:54.707000             🧑  作者: Mango

观察者模式 | 实施

观察者模式是一种行为型设计模式,它允许你定义一种订阅机制,让一些对象能够被自动通知,当一个被观察的对象发生了改变。

这个模式非常实用,在许多现代应用程序和框架中都有广泛的使用,如事件驱动的编程方式,其中组件可以通过发布事件的方式与订阅者交互。

组件

在实现观察者模式时,使用两种类型的组件,即主题(Subject)和观察者(Observer)。

主题(Subject)

主题是程序中的一个类,它包含了一些可被观察的状态和行为。当主题的状态或行为改变时,它会通知它所知道的某些观察者。

观察者(Observer)

观察者是一个接口,其包含了一个更新(update)方法,当被观察的对象的状态或行为改变时,它的 update 方法将被调用。

实现

在这里,我们将实现一个简单的观察者模式示例,它将模拟一个气象站,用于记录气温、湿度和气压的变化,并将该数据获取的所有观察者实时通知。

类 UML 图

以下是我们将要实现的类 UML 图:

类 UML 图

代码实现

在代码实现中,我们将实现一个基本的观察者模式,包括以下类:

  • 主题(Subject) – WeatherData
  • 观察者(Observer) – Observer
  • 具体主题(ConcreteSubject) – WeatherData
  • 具体观察者(ConcreteObserver) – CurrentConditionsDisplay
/**
 * 主题
 */
public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

/**
 * 观察者
 */
public interface Observer {
    void update(float temp, float humidity, float pressure);
}

/**
 * 具体主题
 */
public class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData() {
        observers = new ArrayList<Observer>();
    }

    public void registerObserver(Observer o) {
        observers.add(o);
    }

    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    public void notifyObservers() {
        for (Observer o : observers) {
            o.update(temperature, humidity, pressure);
        }
    }

    public void measurementsChanged() {
        notifyObservers();
    }

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }
}

/**
 * 具体观察者
 */
public class CurrentConditionsDisplay implements Observer {
    private float temperature;
    private float humidity;

    public CurrentConditionsDisplay(Subject weatherData) {
        weatherData.registerObserver(this);
    }

    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        display();
    }

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

以下是使用上述代码的示例:

public class WeatherStation {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();

        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);

        weatherData.setMeasurements(80, 65, 30.4f);
        weatherData.setMeasurements(82, 70, 29.2f);
        weatherData.setMeasurements(78, 90, 29.2f);
    }
}

该程序将输出以下数据:

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

注意,在该示例中,CurrentConditionsDisplay 只是一个观察者,它仅仅输出气象站提供的最新数据。

总结

观察者模式可以很好地应用在各种场景中,如企业级应用程序、桌面应用程序等。它允许组件之间的松耦合,并支持事件驱动的编程方式。因此,在编写应用程序时,您需要考虑到观察者模式,并根据您的需求灵活地使用它。