郭震 AI公众号:郭震AI

12 Java设计模式之观察者模式

发布日期:

分类: Java进阶

预计阅读: 3 分钟

阅读次数: 0

预计阅读3 分钟
结构重点8 个
图文要点0 张
正文规模1.2k 字

在上一篇文章中,我们探讨了Java设计模式中的工厂模式,它帮助我们创建对象,使得代码更加灵活和可维护。而在本篇文章中,我们将讨论 观察者模式,这是一种常用的设计模式,可以让我们更好地处理对象之间的关系。

观察者模式简介

观察者模式是一种行为设计模式,其中一个对象(称为“主题”或“被观察者”)维持一系列依赖于它的对象(称为“观察者”),并在其状态发生变化时,自动通知这些观察者。这样的设计促进了对象之间的解耦,使得系统更加灵活。

观察者模式的组件

  1. 主题(Subject): 主题是被观察的对象,负责维护观察者的集合,以及添加、删除观察者的功能。

  2. 观察者(Observer): 观察者是依赖于主题的对象,当主题的状态改变时,它会收到通知。

  3. 具体主题(ConcreteSubject): 具体实现主题的类,负责存储状态、更新状态并通知所有的观察者。

  4. 具体观察者(ConcreteObserver): 具体实现观察者的类,定义响应主题变化的行为。

观察者模式的实现

让我们通过一个简单的 Java 示例来说明观察者模式的实现。在这个示例中,我们将模拟天气站的工作,天气站作为主题会通知显示的设备(观察者)当前的温度变化。

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

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

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

// 具体主题
class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;

    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);
        }
    }

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

// 具体观察者
class CurrentConditionsDisplay implements Observer {
    private float temperature;

    @Override
    public void update(float temperature) {
        this.temperature = temperature;
        display();
    }

    public void display() {
        System.out.println("Current temperature: " + temperature + "°C");
    }
}

// 测试观察者模式
public class ObserverPatternTest {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();

        weatherData.registerObserver(currentDisplay);

        weatherData.setTemperature(25.0f);
        weatherData.setTemperature(30.0f);
    }
}

代码解读

  1. 我们定义了一个 Observer 接口和一个 Subject 接口,后者提供注册、撤销和通知观察者的方法。

  • WeatherData 类实现了 Subject 接口,维护一个观察者列表和当前温度的状态。在 setTemperature 方法中,当温度更新时,它会调用 notifyObservers 方法,通知所有注册的观察者。

  • CurrentConditionsDisplay 类实现了 Observer 接口,一旦接收到温度更新,它就会调用 display 方法打印当前温度。

  • ObserverPatternTest 类则是主程序,创建 WeatherData 实例并注册观察者,然后通过调用 setTemperature 方法更改温度。

  • 观察者模式的优缺点

    优点:

    • 解耦:观察者模式遵循了 单一职责原则,主题与观察者之间的耦合度低。
    • 灵活性:可以方便地添加或删除观察者。

    缺点:

    • 通知成本:当观察者数量较多时,通知的开销可能会影响性能。
    • 可能的内存泄漏:观察者在不再需要时未能正确解除注册,会导致内存泄漏。

    总结

    在本篇文章中,我们详细探讨了观察者模式,这种模式在实际应用中非常有用,能够很好地支持一对多的依赖关系。在下篇文章中,我们将继续探讨 JVM调优之JVM的工作原理,了解JVM如何管理和优化内存,以提升Java应用的性能。希望本篇文章能够帮助大家掌握观察者模式的概念及其实现。

    分享文章

    转发到常用平台

    微信/朋友圈可先复制链接

    相关内容

    更多相关文章

    返回栏目

    Reader Messages

    读者留言

    有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

    最多 800 字

    为了防刷,每条留言会做长度、链接数量和提交频率限制。

    0/800

    留言列表

    0
    正在加载留言...