【实战揭秘】如何运用Java发布-订阅模式,打造高效响应式天气预报App?

简介: 【8月更文挑战第30天】发布-订阅模式是一种消息通信模型,发送者将消息发布到公共队列,接收者自行订阅并处理。此模式降低了对象间的耦合度,使系统更灵活、可扩展。例如,在天气预报应用中,`WeatherEventPublisher` 类作为发布者收集天气数据并通知订阅者(如 `TemperatureDisplay` 和 `HumidityDisplay`),实现组件间的解耦和动态更新。这种方式适用于事件驱动的应用,提高了系统的扩展性和可维护性。

发布-订阅模式(Publish/Subscribe Pattern)是一种消息通信模式,在这种模式中,发送者不会将消息直接发送给接收者,而是将这些消息发布到一个公共的消息队列中,由接收者自行订阅并消费这些消息。这种模式减少了对象之间的耦合度,让系统的设计更加灵活和可扩展。

让我们通过一个简单的例子来理解发布-订阅模式的运作方式。假设我们正在开发一款天气预报应用,这个应用需要实时更新天气信息,并且能够通知不同的组件,如温度显示组件、湿度显示组件等。使用发布-订阅模式可以轻松实现这一功能。

首先,定义一个 WeatherEventPublisher 类作为发布者,它负责收集天气数据,并向所有订阅者广播变化的信息。

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

public class WeatherEventPublisher {
   
    private List<WeatherEventListener> subscribers = new ArrayList<>();

    public void subscribe(WeatherEventListener subscriber) {
   
        subscribers.add(subscriber);
    }

    public void unsubscribe(WeatherEventListener subscriber) {
   
        subscribers.remove(subscriber);
    }

    public void notifySubscribers(String event) {
   
        for (WeatherEventListener subscriber : subscribers) {
   
            subscriber.onWeatherEvent(event);
        }
    }

    public void setWeatherData(String weatherData) {
   
        System.out.println("Weather data changed: " + weatherData);
        notifySubscribers(weatherData);
    }
}

接下来,定义一个 WeatherEventListener 接口,所有的订阅者都需要实现这个接口中的方法,以便在接收到事件时执行相应的操作。

public interface WeatherEventListener {
   
    void onWeatherEvent(String event);
}

然后创建具体的订阅者类,比如 TemperatureDisplayHumidityDisplay

public class TemperatureDisplay implements WeatherEventListener {
   
    @Override
    public void onWeatherEvent(String event) {
   
        System.out.println("TemperatureDisplay received: " + event);
    }
}

public class HumidityDisplay implements WeatherEventListener {
   
    @Override
    public void onWeatherEvent(String event) {
   
        System.out.println("HumidityDisplay received: " + event);
    }
}

最后,我们可以在主程序中实例化这些类,并测试发布-订阅模式的效果。

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

        // 创建订阅者
        TemperatureDisplay temperatureDisplay = new TemperatureDisplay();
        HumidityDisplay humidityDisplay = new HumidityDisplay();

        // 订阅事件
        publisher.subscribe(temperatureDisplay);
        publisher.subscribe(humidityDisplay);

        // 更新天气数据
        publisher.setWeatherData("Sunny");
        publisher.setWeatherData("Rainy");

        // 取消订阅
        publisher.unsubscribe(temperatureDisplay);

        // 再次更新天气数据
        publisher.setWeatherData("Cloudy");
    }
}

在这个例子中,WeatherEventPublisher 作为发布者,它维护了一个订阅者的列表,并在天气数据发生变化时调用 notifySubscribers 方法来通知所有的订阅者。TemperatureDisplayHumidityDisplay 是订阅者,它们实现了 WeatherEventListener 接口,因此能够在接收到通知后执行特定的操作。

发布-订阅模式非常适合用于构建事件驱动的应用程序或系统,特别是在需要解耦不同组件的情况下。通过这种方式,我们可以轻松地添加新的订阅者或者修改现有订阅者的行为,而不需要改变发布者或其他订阅者的代码,从而使得系统的扩展性和可维护性大大提高。

相关文章
|
8月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
673 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
575 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
909 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
HarmonyOS NEXT仓颉开发语言实战案例:电影App
周末好!本文分享使用仓颉语言重构ArkTS实现的电影App案例,对比两者在UI布局、组件写法及语法差异。内容包括页面结构、列表分组、分类切换与电影展示等。通过代码演示仓颉在HarmonyOS开发中的应用。##仓颉##ArkTS##HarmonyOS开发
|
8月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:健身App
本期分享一个健身App首页的布局实现,顶部采用Stack容器实现重叠背景与偏移效果,列表部分使用List结合Scroll实现可滚动内容。代码结构清晰,适合学习HarmonyOS布局技巧。
HarmonyOS NEXT仓颉开发语言实战案例:小而美的旅行App
本文分享了一个旅行App首页的设计与实现,使用List容器搭配Row、Column布局完成个人信息、功能列表及推荐模块的排版,详细展示了HarmonyOS下的界面构建技巧。
|
8月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:银行App
仓颉语言银行App项目分享,页面布局采用List容器,实现沉浸式体验与模块化设计。顶部资产模块结合Stack与Row布局,背景图与内容分离,代码清晰易懂;功能按钮部分通过负边距实现上移效果,圆角仅保留顶部;热门推荐使用header组件,结构更规范。整体代码风格与ArkTS相似,但细节更灵活,适合金融类应用开发。
|
4月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
266 0
|
5月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。

热门文章

最新文章