Java设计模式解析:观察者模式的应用和实例

简介: Java设计模式解析:观察者模式的应用和实例

观察者模式是一种行为设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式有时也被称为发布-订阅模式或者模型-视图模式。

观察者模式的核心是两个角色:被观察者(Subject)和观察者(Observer)。被观察者维护一个观察者列表,并提供添加、删除和通知观察者的方法。观察者则定义了一个接口,包含一个或多个用于接收通知的方法。

在实际应用中,观察者模式可以用来实现一些常见的功能,比如事件处理、消息分发和数据更新等。下面我们通过一个简单的例子来演示观察者模式的应用。

假设我们有一个天气站,可以实时发布天气信息给所有订阅者。我们先定义一个天气数据类 WeatherData,它包含一个观察者列表和一些用于获取和更新天气信息的方法。

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

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

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

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

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

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

接下来,我们定义一个观察者接口 Observer,包含一个用于接收天气更新通知的方法。

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

然后,我们实现两个具体的观察者类:CurrentConditionsDisplay 和 ForecastDisplay。它们实现了 Observer 接口,并根据接收到的天气信息进行相应的操作。

public 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 ForecastDisplay 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("Forecast: " + temperature + "F degrees and " + humidity + "% humidity");
    }
}

最后,我们可以在主函数中模拟天气数据的变化,并让观察者接收到通知并更新显示。

public class Main {
   
    public static void main(String[] args) {
   
        WeatherData weatherData = new WeatherData();

        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
        weatherData.addObserver(currentDisplay);

        ForecastDisplay forecastDisplay = new ForecastDisplay();
        weatherData.addObserver(forecastDisplay);

        // 模拟天气数据变化
        weatherData.setMeasurements(80, 65, 30.4f);
        weatherData.setMeasurements(82, 70, 29.2f);
    }
}

运行以上代码,我们可以看到控制台输出了当前天气和天气预报的信息。

观察者模式的优点在于它将观察者和被观察者解耦,使得它们可以独立地进行扩展和修改。同时,它也降低了对象之间的耦合度,增加了代码的可维护性和可复用性。

总结起来,观察者模式是一种简单而又强大的设计模式,它在很多场景下都能发挥作用。通过使用观察者模式,我们可以实现松耦合的对象之间的通信,使得系统更加灵活和可扩展。

相关文章
|
10天前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
88 2
|
9天前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
98 0
|
8天前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
110 35
|
8天前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
100 8
|
17天前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
15天前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
727 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
220 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

热门文章

最新文章

推荐镜像

更多
  • DNS
  • 下一篇
    开通oss服务