深入理解观察者模式(Observer Pattern)

简介: 深入理解观察者模式(Observer Pattern)

深入理解观察者模式(Observer Pattern)


简介:

观察者模式是一种行为设计模式,它允许对象(称为观察者)订阅另一个对象(称为主题)的状态变化。当主题状态发生改变时,观察者会被通知并进行相应的更新。


为什么使用观察者模式?


在现实生活中,我们经常会遇到这样的情况:当一个对象的状态发生改变时,其他对象也需要做出相应的变化。观察者模式提供了一种松耦合的方式来实现这种通信机制,使得主题和观察者之间的依赖关系更加灵活。


核心概念


  • 主题(Subject): 主题是被观察的对象,它会维护一组观察者,并提供方法来添加、删除和通知观察者。
  • 观察者(Observer): 观察者是订阅主题状态变化的对象,当主题状态发生改变时,观察者会接收到通知并执行相应的更新操作。


观察者模式的结构


  • Subject(主题):

注册和移除观察者的方法

通知观察者的方法


  • Observer(观察者):

更新方法,用于接收主题状态的变化


观察者模式的 UML 类图如下所示:

  +-------------+        +----------------+
  |   Subject   | -----> |   Observer     |
  +-------------+        +----------------+
  | + attach(o) |        | + update()     |
  | + detach(o) |        +----------------+
  | + notify()  |
  +-------------+

假设我们有一个简单的气象站应用,气象站会定期测量温度、湿度和气压。我们希望当气象数据发生变化时,能够实时地通知给注册的观察者。


  • 让我们通过一个简单的气象站应用来演示观察者模式的实现。
  • WeatherStation.java
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<>();
    }

    @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(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;

    @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 WeatherStation {
    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 类是主题,它维护了观察者列表,并提供了方法来注册、移除和通知观察者。CurrentConditionsDisplay 类是具体的观察者,它实现了 Observer 接口,并在更新时显示当前的气象数据。


在 main 方法中,我们创建了一个 WeatherData 对象和一个 CurrentConditionsDisplay 对象,并将后者注册为前者的观察者。然后,我们模拟了几次气象数据的变化,并观察观察者的更新情况。


  • 运行结果

以下是代码的运行结果:

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

这个结果显示了每次调用 setMeasurements() 方法后,CurrentConditionsDisplay 观察者都会接收到通知,并且显示当前的气象条件(温度和湿度)。


在 main 方法中,创建了一个 WeatherData 对象和一个 CurrentConditionsDisplay 对象,并将后者注册为前者的观察者。然后,模拟了几次气象数据的变化,并观察观察者的更新情况。


观察者模式的应用场景


1. GUI 开发

在图形用户界面(GUI)开发中,观察者模式被广泛应用。例如,按钮、复选框、滚动条等 GUI 组件可以作为主题,而窗口、文本框等可以作为观察者。当用户与 GUI 组件进行交互时,观察者会接收到通知并执行相应的操作,从而实现 GUI 的实时更新和交互。


2. 股票市场监控系统

股票市场监控系统需要实时监测股票价格的变化,并及时通知相关的投资者或交易员。股票价格变化可以作为主题,而投资者或交易员可以作为观察者。当股票价格发生变化时,观察者会收到通知并做出相应的交易决策。


3. 车辆追踪系统

在车辆追踪系统中,车辆的位置和状态需要实时监测,并及时通知相关的监控中心或用户。车辆的位置和状态可以作为主题,而监控中心或用户可以作为观察者。当车辆的位置或状态发生变化时,观察者会收到通知并进行相应的处理。


4. 观察者模式与事件驱动编程

观察者模式与事件驱动编程密切相关。在事件驱动编程中,事件是主题,而事件处理程序则是观察者。当事件发生时,观察者会收到通知并执行相应的处理逻辑,从而实现程序的事件驱动和响应机制。


相关文章
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
1464 0
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
10月前
|
数据安全/隐私保护 SoC
基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机
本课题基于MATLAB 2022a的Simulink平台,构建了PI控制的三相整流器控制系统,用于PMSM电机发电并为超级电容充电。系统通过调节电流和电压,实现高效能量管理和动力输出。核心模块包括三相整流器、超级电容及其显示模块、PI控制器。仿真结果无水印,完整展示了系统性能。系统原理涵盖交流转直流、超级电容快速充放电及电机驱动,适用于多种工况下的能量管理。
|
设计模式 网络协议 Java
13.观察者模式设计思想
本文详细介绍了观察者模式的设计思想,包括其定义、实现方式、优缺点及应用场景。通过微信公众号的例子,阐述了如何使用观察者模式实现对象间的依赖关系,确保一个对象状态改变时能自动通知其他对象。文章还提供了观察者模式的结构图和时序图,帮助读者更好地理解和应用这一设计模式。
224 2
13.观察者模式设计思想
|
存储 缓存 监控
Redis问题之使用Guava Cache相比自己设计本地缓存有哪些优势
Redis问题之使用Guava Cache相比自己设计本地缓存有哪些优势
209 0
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
664 3
|
消息中间件 存储 网络协议
即时通讯需要用到哪些技术手段?
该文探讨了即时通讯技术,涉及网络协议(TCP/IP、UDP、HTTP/HTTPS)在IM中的应用,数据传输与同步(消息队列、长轮询、WebSocket、数据同步)技术,安全性保障(加密、认证授权、防止攻击)措施,以及多媒体处理(音频、视频处理和实时传输)和用户界面交互设计的重要性。文章旨在帮助读者理解并应用相关技术。
1180 1
IDEA的安装与删除插件
IDEA的安装与删除插件
340 1
|
设计模式 消息中间件 供应链
捕捉变化的风-用观察者模式提升用户体验
观察者模式是一种行为设计模式,允许对象之间定义一种订阅机制,以便在对象状态变化时通知多个观察者。它广泛应用于实现动态事件处理系统、用户界面元素的交互,或监测状态变化等场景。 文章中通过丰富的场景案例,展示了不使用观察者模式可能带来的问题,如紧耦合和难以维护;接着解释了如何应用观察者模式成功解决这些问题,通过主题和观察者的解耦,增强系统的灵活性和可扩展性。 进一步解释了观察者模式的工作原理,并介绍了其结构图和运行机制。该模式有助于在维护一致性和实时性方面提供优势,同时促使我们在高层次上分类对象间的交互。 最后
358 0
捕捉变化的风-用观察者模式提升用户体验

热门文章

最新文章