观察者模式

观察者模式主要用于处理对象间的一对多的关系,是一种对象行为模式。当一个对象状态发生变化时,所有 该对象的关注者均能收到状态变化通知,以进行相应的处理。观察者模式通常包括以下几个角色:

  1. Subject(主题):被观察的对象,它维护一组观察者,提供添加和删除观察者的方法,并在状态发生改变时通知观察者。

  2. Observer(观察者):定义一个更新接口,以便在主题状态改变时能够得到通知。

  3. ConcreteSubject(具体主题):实现主题接口,负责维护具体的观察者对象,当状态发生变化时,通知所有观察者。

  4. ConcreteObserver(具体观察者):实现观察者接口,以便在主题状态发生变化时更新自身状态。

下面是一个简单的场景实例,假设我们有一个气象站(Weather Station),它负责采集当前的温度信息,并通知所有注册的观察者,比如显示器和手机应用,来更新其显示。

java 复制代码
import java.util.ArrayList;
import java.util.List;

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

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

// 具体主题
class WeatherStation implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private float temperature;

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

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

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

    // 模拟气象站更新温度信息
    public void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObservers();
    }
}

// 具体观察者 - 显示器
class Display implements Observer {
    @Override
    public void update(float temperature) {
        System.out.println("Display: Temperature updated to " + temperature + " degrees Celsius");
    }
}

// 具体观察者 - 手机应用
class MobileApp implements Observer {
    @Override
    public void update(float temperature) {
        System.out.println("Mobile App: Temperature updated to " + temperature + " degrees Celsius");
    }
}

public class ObserverPatternScenario {
    public static void main(String[] args) {
        // 创建具体主题 - 气象站
        WeatherStation weatherStation = new WeatherStation();

        // 创建具体观察者 - 显示器和手机应用
        Observer display = new Display();
        Observer mobileApp = new MobileApp();

        // 添加观察者到气象站
        weatherStation.addObserver(display);
        weatherStation.addObserver(mobileApp);

        // 模拟气象站更新温度信息,观察者将会得到通知并更新
        weatherStation.setTemperature(25.5f);

        // 移除一个观察者(手机应用)
        weatherStation.removeObserver(mobileApp);

        // 再次更新温度信息,只有显示器会得到通知
        weatherStation.setTemperature(28.0f);
    }
}

在这个场景中,WeatherStation 是具体的主题,它会更新温度信息并通知所有注册的观察者。DisplayMobileApp 分别是具体的观察者,它们实现了 Observer 接口,以便在主题状态发生变化时能够得到通知并更新。在 main 方法中,我们创建了气象站和两个观察者,将观察者注册到气象站,然后模拟温度信息的更新,观察者会收到相应的通知。

相关推荐
o0向阳而生0o4 天前
107、23种设计模式之观察者模式(16/23)
观察者模式·设计模式
青草地溪水旁12 天前
设计模式(C++)详解——观察者模式(Observer)(1)
c++·观察者模式·设计模式
星空寻流年12 天前
设计模式第六章(观察者模式)
网络·观察者模式·设计模式
大飞pkz12 天前
【设计模式】观察者模式
开发语言·观察者模式·设计模式·c#
charlie11451419115 天前
精读 C++20 设计模式:行为型设计模式——观察者模式
c++·学习·观察者模式·设计模式·程序设计·c++20
青草地溪水旁15 天前
设计模式(C++)详解——观察者模式(Observer)(2)
c++·观察者模式·设计模式
PaoloBanchero19 天前
Unity 虚拟仿真实验中设计模式的使用 —— 观察者模式(Observer Pattern)
观察者模式·unity·设计模式
Chan1621 天前
【 设计模式 | 行为型模式 观察者模式 】
java·spring boot·后端·spring·观察者模式·设计模式·idea
静心观复21 天前
观察者模式
观察者模式
宁静致远20211 个月前
【C++设计模式】第三篇:观察者模式(别名:发布-订阅模式、模型-视图模式、源-监听器模式)
c++·观察者模式·设计模式