Java设计模式之观察者模式(Observer Pattern)

观察者模式(Observer Pattern)是一种常用的软件设计模式,它用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,它的所有依赖对象都会得到通知并自动更新。观察者模式属于行为型模式。

在观察者模式中,有两个核心角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它维护了一个观察者列表,可以动态地添加、删除和通知观察者。观察者是依赖于主题的对象,当主题的状态发生变化时,观察者会得到通知并执行相应的操作。

下面是一个简单的示例,展示了如何使用观察者模式实现一个简单的气象站:

import java.util.ArrayList;
import java.util.List;

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 观察者接口
interface Observer {
    void update(float temperature, float humidity, float pressure);
}

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

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

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

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

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.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();
    }
}

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

    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 ObserverPatternExample {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();

        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
        weatherData.registerObserver(currentDisplay);

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

在上面的示例中,WeatherData充当主题,它实现了Subject接口,并维护了一个观察者列表。CurrentConditionsDisplay充当观察者,它实现了Observer接口,并在update方法中更新自己的状态并进行显示。

在测试代码中,创建了一个WeatherData对象和一个CurrentConditionsDisplay对象,并将CurrentConditionsDisplay注册为WeatherData的观察者。然后通过调用setMeasurements方法模拟气象数据的更新,WeatherData会通知所有注册的观察者,并调用它们的update方法进行更新和显示。

这个示例展示了观察者模式的基本结构和使用方法。观察者模式可以帮助我们实现松耦合的对象之间的通信,使得对象之间的依赖关系更加灵活和可扩展。

你可能感兴趣的:(java,设计模式,观察者模式)