观察者模式

发布时间 2023-08-11 00:15:13作者: 博客-涛

观察者模式(Observer Pattern)在Java中的使用非常广泛,下面举一个简单的案例来说明如何使用观察者模式:

假设有一个天气监测站,该监测站可以实时获取当前的天气信息,并通知多个订阅者(观察者)。当天气信息发生变化时,订阅者将自动收到更新的通知。

首先,我们需要定义两个接口:Subject(主题)和Observer(观察者)。

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

// 观察者接口
public interface Observer {
    void update(String weather);
}

然后,我们实现这两个接口:

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

// 天气监测站作为主题
public class WeatherStation implements Subject {
    private List<Observer> observers;
    private String weather;

    public WeatherStation() {
        this.observers = new ArrayList<>();
    }

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

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

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(weather);
        }
    }

    // 当天气信息更新时调用该方法
    public void setWeather(String weather) {
        this.weather = weather;
        notifyObservers();
    }
}

// 订阅者作为观察者
public class Subscriber implements Observer {
    private String name;

    public Subscriber(String name) {
        this.name = name;
    }

    @Override
    public void update(String weather) {
        System.out.println(name + " 收到天气更新:" + weather);
    }
}

最后,我们可以测试一下:

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

        // 创建两个订阅者
        Observer subscriber1 = new Subscriber("Subscriber 1");
        Observer subscriber2 = new Subscriber("Subscriber 2");

        // 注册订阅者
        station.registerObserver(subscriber1);
        station.registerObserver(subscriber2);

        // 模拟天气更新
        station.setWeather("晴天");
        station.setWeather("多云");
        station.setWeather("雨天");

        // 订阅者会自动收到天气更新的通知并进行相应的处理
    }
}

以上代码实现了一个简单的观察者模式。当天气监测站的天气信息发生变化时,订阅者将收到相应的更新通知。观察者模式使得主题(天气监测站)和订阅者(观察者)之间解耦,方便扩展和维护。