本文最后更新于 2025-03-23,文章超过7天没更新,应该是已完结了~

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

核心类:

1.观察者显示最新天气信息

2.管理观察者(第三方网站)

管理观察者类有三个固定接口方法 :

  • 添加观察者

  • 删除观察者

  • 通知所有观察者

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}

具体实现类

public class WeatherData implements Subject{
    /*
        1.包含最新的天气情况
        2.含有 观察者集合 使用集合管理
        3.当数据更新时,就主动调用观察者集合,通知所有观察者接收最新信息
     */
    private float temperature;
    private float pressure;
    private float humidity;
    
    //观察者集合
    private ArrayList<Observer> observers;
    public WeatherData(){
        observers=new ArrayList<Observer>();
    }

    //当数据更新时,就调用setData进行数据更新 并通知观察者进行数据更新
    public void setData(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        notifyObservers();
    }

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

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

    @Override
    public void notifyObservers() {
        for (int i = 0; i < observers.size(); i++) {
            observers.get(i).update(this.temperature,this.pressure,this.humidity);
        }
    }

}

观察者类 固定有

  • 更新方法

public interface Observer {
    public void update(float template,float pressure,float humidity);
}

具体实现类

public class CurrentConditions implements Observer{
    private float temperature;
    private float pressure;
    private float humidity;
    //更新天气,是由WeatherData来调用,并进行显示
    @Override
    public void update(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        display();
    }
    //显示
    public void display(){
        System.out.println("今天温度"+temperature);
        System.out.println("今天气压"+pressure);
        System.out.println("今天湿度"+humidity);
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditions currentConditions = new CurrentConditions();
        //添加观察者给管理观察者类
        weatherData.registerObserver(currentConditions);
        //更新数据 并通知观察者进行更新
        weatherData.setData(10f,20f,30f);
    }
}