当前位置: 首页 > article >正文

【Java设计模式】数据总线模式:高效统一组件通信

文章目录

  • 【Java设计模式】数据总线模式:高效统一组件通信
    • 一、概述
    • 二、详细解释及实际示例
    • 三、Java中数据总线模式的编程示例
    • 四、何时在Java中使用数据总线模式
    • 五、数据总线模式在Java中的实际应用
    • 六、数据总线模式的优点和权衡
    • 七、源码下载

【Java设计模式】数据总线模式:高效统一组件通信

一、概述

数据总线设计模式旨在提供一个集中式的通信通道,通过该通道,系统的各个组件可以交换数据而无需直接连接,从而促进松散耦合,并增强可扩展性和可维护性。

二、详细解释及实际示例

  1. 实际示例
    • 考虑一个大型机场作为数据总线模式的类似现实世界示例。在机场中,各种航空公司、乘客、行李搬运工和安全人员都需要进行通信和共享信息。与其让每个实体直接与其他每个实体进行通信,机场使用了一个集中式的公告系统(数据总线)。航班信息、安全警报和其他关键更新通过这个系统进行广播,每个实体都监听与它们相关的消息。这种设置允许机场解耦通信过程,确保每个实体仅接收它们所需的信息,同时允许系统进行扩展并集成新的实体,而不会干扰现有的实体。这类似于Java中的数据总线模式促进集中式通信和事件处理,增强系统的可扩展性和可维护性。
  2. 通俗解释
    • 数据总线是一种设计模式,它根据传输的消息或事件的类型连接应用程序的组件进行通信。这种模式促进了解耦,通过允许组件在没有直接依赖关系的情况下进行通信,使系统更容易扩展和维护。

三、Java中数据总线模式的编程示例

假设您有一个应用程序,支持在线预订和参与活动。您希望该应用程序向社区或组织的所有普通成员发送通知,例如活动广告,但不想向活动管理员或组织者发送此类广告。相反,您希望向他们发送有关向所有成员发送新广告的时间的通知。数据总线使您能够通过使它们的类或组件仅接受特定类型的消息,按类型(普通成员或活动管理员)有选择地通知社区成员。因此,普通成员和管理员不需要相互了解,也不需要了解用于通知整个社区的具体类或组件,除了知道发送的消息类型。
在上面的在线活动应用程序示例中,我们首先定义我们的Member接口及其实现:MessageCollectorMember(普通社区成员)和StatusMember(活动管理员或组织者)。

public interface Member extends Consumer<DataType> {
    void accept(DataType event);
}

接下来,我们实现一个数据总线来订阅或取消订阅成员,并发布事件以通知所有社区成员。

public class DataBus {
    private static final DataBus INSTANCE = new DataBus();
    private final Set<Member> listeners = new HashSet<>();
    public static DataBus getInstance() {
        return INSTANCE;
    }
    public void subscribe(final Member member) {
        this.listeners.add(member);
    }
    public void unsubscribe(final Member member) {
        this.listeners.remove(member);
    }
    public void publish(final DataType event) {
        event.setDataBus(this);
        listeners.forEach(
                listener -> listener.accept(event));
    }
}

publish方法中,对每个成员应用accept方法。
对于普通社区成员(MessageCollectorMember),accept方法只能处理MessageData类型的消息。

public class MessageCollectorMember implements Member {
    private final String name;
    private final List<String> messages = new ArrayList<>();
    public MessageCollectorMember(String name) {
        this.name = name;
    }
    @Override
    public void accept(final DataType data) {
        if (data instanceof MessageData) {
            handleEvent((MessageData) data);
        }
    }
}

对于活动管理员或组织者(StatusMember),accept方法可以处理StartingDataStoppingData类型的消息。

public class StatusMember implements Member {
    private final int id;
    private LocalDateTime started;
    private LocalDateTime stopped;
    public StatusMember(int id) {
        this.id = id;
    }
    @Override
    public void accept(final DataType data) {
        if (data instanceof StartingData) {
            handleEvent((StartingData) data);
        } else if (data instanceof StoppingData) {
            handleEvent((StoppingData) data);
        }
    }
}

以下是App类,用于演示数据总线模式的实际应用:

class App {
    public static void main(String[] args) {
        final var bus = DataBus.getInstance();
        bus.subscribe(new StatusMember(1));
        bus.subscribe(new StatusMember(2));
        final var foo = new MessageCollectorMember("Foo");
        final var bar = new MessageCollectorMember("Bar");
        bus.subscribe(foo);
        bus.publish(StartingData.of(LocalDateTime.now()));
    }
}

当数据总线发布消息时,输出如下:

02:33:57.627 [main] INFO com.iluwatar.databus.members.StatusMember - Receiver 2 sees application started at 2022 - 10 - 26T02:33:57.613529100
02:33:57.633 [main] INFO com.iluwatar.databus.members.StatusMember - Receiver 1 sees application started at 2022 - 10 - 26T02:33:57.613529100

如所示,MessageCollectorMembers仅接受MessageData类型的消息,因此它们不会看到StartingDataStoppingData消息,这些消息仅对StatusMember(活动管理员或组织者)可见。这种选择性的消息处理可防止普通社区成员接收管理通知。

四、何时在Java中使用数据总线模式

  1. 当多个组件需要共享数据或事件,但不希望直接耦合时。
  2. 在复杂的、事件驱动的系统中,信息的流动动态变化。
  3. 在分布式系统中,组件可能部署在不同的环境中。
  4. 在微服务架构中用于服务间通信。

五、数据总线模式在Java中的实际应用

  1. 大规模应用程序中的事件处理系统。
  2. 微服务架构中用于服务间通信。
  3. 实时数据处理系统,如股票交易平台。
  4. 在Spring等框架中,特别是其应用程序事件机制。

六、数据总线模式的优点和权衡

优点:

  1. 松散耦合:组件可以相互交互,而无需相互直接依赖。
  2. 灵活性:可以添加新的订阅者或发布者,而不会影响现有组件。
  3. 可扩展性:该模式支持独立扩展组件。
  4. 可重用性:总线和组件可以在不同的系统中重用。

权衡:

  1. 复杂性:引入数据总线可能会增加系统架构的复杂性。
  2. 性能开销:额外的通信层可能会引入延迟。
  3. 调试难度:跟踪通过总线的数据流可能具有挑战性,特别是在具有许多事件的系统中。

七、源码下载

数据总线模式示例代码下载


http://www.kler.cn/news/285305.html

相关文章:

  • 【鬼灭之刃学英语 立志篇】2、义勇对炭治郎的怒斥
  • 4.1 版本管理器——2PL与MVCC
  • 第 20 章 DOM 进阶
  • 应用层协议(下)Https加密Http的秘密(含逻辑图解 简单易学 通俗易懂!)
  • DataSet和DataTable的关系
  • Python爬虫所需的技术及其原理(简单易懂)
  • 策略模式+模版方法模式+简单工厂模式混用优化代码复杂分支问题
  • 【软件测试】bug以及测试用例的设计方法
  • Taro 微信小程序 分页上拉加载
  • C语言程序设计(初识C语言后部分)
  • Java—可变参数、不可变集合
  • 单链表应用
  • 在Jtti服务器上怎么安装和配置Docker?
  • Pandas 绘图的强大之处:后端
  • Vue面试常见知识总结2——spa、vue按需加载、mvc与mvvm、vue的生命周期、Vue2与Vue3区别
  • 鸿蒙OS试题(6)
  • 自动驾驶---什么是Frenet坐标系?
  • AI学习指南深度学习篇-门控循环单元中的门控机制
  • jenkins发送html邮件配置步骤与注意事项?
  • 25. 蓝牙 - BLE相关2
  • 通过 Docker 部署 WordPress 服务器
  • IO进程day04(进程)
  • 文件上传漏洞详解
  • 存储 IO 性能优化策略、方案与瓶颈分析
  • Python 的http.server库详细介绍
  • Codeforces Round 967 (Div. 2)(A,B,C,D)
  • 使用pgrs在wsl中为postgres写拓展
  • HTTP/1和HTTP/2
  • Java面试前言
  • 【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则