【设计模式】观察者模式

发布于:2024-04-27 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

观察者模式(Observer Pattern)定义

应用场景

Java 代码案例

总结


 

观察者模式(Observer Pattern)定义

观察者模式是一种行为设计模式,允许多个对象监听某一个对象的状态变化。当被观察对象(即主题)的状态发生变化时,所有依赖于它的观察者对象都会被通知并更新。

应用场景

观察者模式广泛应用于实现事件处理系统,其中一个对象的状态变化需要影响其他一个或多个对象的行为,而不需要这些对象之间有紧密的耦合关系。常见的应用场景包括用户界面元素的交互,模型-视图-控制器(MVC)模式中模型的更新通知,或任何其他需要跨系统部分通知更改的场合。

Java 代码案例

假设我们有一个简单的天气监测系统,其中一个天气站对象会记录天气数据,并在数据更新时通知所有注册的观察者。

首先,定义观察者和被观察者接口:

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

// 被观察者接口
interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

实现具体的被观察者:

class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;

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

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

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

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

    // 更新天气数据
    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObservers();
    }
}

实现具体的观察者:

class CurrentConditionsDisplay implements Observer {
    private float temperature;
    private float humidity;

    @Override
    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 ObserverPatternDemo {
    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);
    }
}

输出结果:

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

 

总结

        在这个例子中,WeatherData 充当被观察者(Subject),管理观察者的注册、移除和通知。CurrentConditionsDisplay 是观察者,它根据 WeatherData 的状态更新自己的显示。当 WeatherData 的状态变化时,它通过调用 notifyObservers() 方法通知所有注册的观察者。

        观察者模式使得天气数据的更新和显示之间解耦,增加了代码的灵活性和可扩展性,使得添加新的显示元素或其他依赖于天气数据的组件变得简单。这种模式广泛应用于实现各种发布-订阅系统,提高了组件间的交互效率和可维护性。

        非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~