Java实现发布订阅模式

本文介绍了发布订阅模式的核心原理,以及如何在Java中实现这一模式。通过创建发布者和订阅者接口,以及示例代码展示如何进行消息的发布与接收,强调了发布订阅模式在诸如RxJava、EventBus等库中的应用。
摘要由CSDN通过智能技术生成

什么是发布订阅模式

发布订阅模式是软件开发者很常见的一种设计模式,很多开源库都使用了发布订阅模式,例如RxJava、EventBus、Vue等,所以学习该模式还是很有必要的。

该模式中存在一个或多个发布者,一个或多个订阅者,当发布者发布消息的时候,参与订阅的订阅者会收到对应的消息通知。其实核心原理就是使用一个集合来存储所有的订阅者类,当发布消息的时候遍历这个集合,并调用集合中的每一个订阅者类的通知方法。

下面以一段代码实现发布-订阅原理。

实现发布-订阅原理

一、创建发布者

1、首先定义一个接口,所有的发布者都要实现该接口,该接口定义添加订阅者、发送消息、移除订阅者方法。

public interface IPublisher {
   

    /**
     * 添加订阅者
     */
    void emit(ISubscriber subscriber);

    /**
     * 触发消息
     */
    void on(String msg);

    /**
     * 移除订阅者
     */
    void remove(ISubscriber subscriber);

}

2、创建发布者

这里以EventBus为例,实现发布者接口,并在该类中创建一个集合来添加存储订阅者。当发布消息的时候遍历该集合,调用订阅者的通知函数,将消息发送出去。

public class EventBus implements IPublisher {
   

    // 定义一个集合来存储订阅者
    private ArrayList events = new ArrayList<Subscriber>();

    // 发布者名称
    private String name;

    // 创建发布者
    public EventBus(String name) {
   
        this.name = name;
    
  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,下面是一个简单的Java实现发布订阅模式的示例: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; interface Subscriber { void onEvent(String eventType, Object data); } class Publisher { private Map<String, List<Subscriber>> subscribers = new HashMap<>(); public void subscribe(String eventType, Subscriber subscriber) { List<Subscriber> subscriberList = subscribers.getOrDefault(eventType, new ArrayList<>()); subscriberList.add(subscriber); subscribers.put(eventType, subscriberList); } public void unsubscribe(String eventType, Subscriber subscriber) { List<Subscriber> subscriberList = subscribers.getOrDefault(eventType, new ArrayList<>()); subscriberList.remove(subscriber); subscribers.put(eventType, subscriberList); } public void publish(String eventType, Object data) { List<Subscriber> subscriberList = subscribers.getOrDefault(eventType, new ArrayList<>()); for (Subscriber subscriber : subscriberList) { subscriber.onEvent(eventType, data); } } } class MessageSubscriber implements Subscriber { private String name; public MessageSubscriber(String name) { this.name = name; } @Override public void onEvent(String eventType, Object data) { System.out.println(name + " received message: " + data); } } public class PubSubDemo { public static void main(String[] args) { Publisher publisher = new Publisher(); Subscriber subscriber1 = new MessageSubscriber("Subscriber 1"); Subscriber subscriber2 = new MessageSubscriber("Subscriber 2"); Subscriber subscriber3 = new MessageSubscriber("Subscriber 3"); publisher.subscribe("message", subscriber1); publisher.subscribe("message", subscriber2); publisher.subscribe("alert", subscriber3); publisher.publish("message", "Hello World!"); publisher.publish("alert", "Warning: High CPU usage!"); publisher.unsubscribe("message", subscriber2); publisher.publish("message", "Goodbye World!"); } } ``` 上述代码实现了一个简单的发布订阅模式,其中 `Publisher` 表示发布者,`Subscriber` 表示订阅者,`MessageSubscriber` 是一个订阅者的实现类,`PubSubDemo` 是一个包含 `main` 方法的示例类。在 `main` 方法中,我们创建一个 `Publisher` 对象,然后创建三个不同的订阅者,并通过 `subscribe` 方法订阅了两种事件类型:`message` 和 `alert`。接着我们通过 `publish` 方法向所有订阅了 `message` 事件类型的订阅者发送了一条消息,然后向所有订阅了 `alert` 事件类型的订阅者发送了一条警告消息。最后,我们通过 `unsubscribe` 方法取消了一个订阅者的订阅。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ruiurrui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值