【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )

简介: 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )

文章目录

一、发布-订阅模式

二、代码实现发布-订阅模式

1、订阅者接口

2、订阅者实现类

3、发布者

4、调度中心

5、客户端





一、发布-订阅模式


发布订阅模式 :


发布者 Publisher : 状态改变时 , 向 消息中心 发送事件 ;

订阅者 Subscriber : 到 消息中心 订阅自己关心的事件 ;

消息中心 : 负责维护一个 消息队列 , 根据 消息类型 将 消息 转发给 对应的 订阅者 ;


image.png

下面按照该结构实现一个简单的 发布-订阅模式 ;






二、代码实现发布-订阅模式



1、订阅者接口


/**
 * 订阅者
 */
public interface Subscriber {
    /**
     * 处理事件
     * @param msg 接收到的事件
     */
    void onEvent(String msg);
}



2、订阅者实现类


订阅者实现类 1 :


public class Subscriber1 implements Subscriber {
    @Override
    public void onEvent(String msg) {
        System.out.println("Subscriber1 订阅者收到消息 " + msg);
    }
}


订阅者实现类 2 :


public class Subscriber2 implements Subscriber {
    @Override
    public void onEvent(String msg) {
        System.out.println("Subscriber2 订阅者收到消息 " + msg);
    }
}



3、发布者


/**
 * 发布者
 */
public class Publisher {
    /**
     * 发布消息
     * @param msg 要发布的消息
     */
    public void post(String msg) {
        Dispatcher.getInstance().post(msg);
    }
}



4、调度中心


调度中心提供如下功能 :


订阅者队列 : 维护一个订阅者集合 , 收到消息后 , 需要将数据发送给各个订阅者 ;

注册订阅者 : 可以添加订阅者到集合中 ;

删除订阅者 : 将订阅者从集合中删除 ;

import java.util.ArrayList;

import java.util.List;


/**
 * 调度中心
 */
public class Dispatcher {
    /**
     * 维护订阅者集合
     */
    private List<Subscriber> subscribers;
    /**
     * 单例模式实例对象
     */
    private static Dispatcher instance;
    private Dispatcher() {
        this.subscribers = new ArrayList<>();
    }
    public static Dispatcher getInstance() {
        if (instance == null) {
            instance = new Dispatcher();
        }
        return instance;
    }
    /**
     * 注册订阅者
     * @param subscriber
     */
    public void register(Subscriber subscriber) {
        subscribers.add(subscriber);
    }
    /**
     * 取消订阅者
     * @param subscriber
     */
    public void unregister(Subscriber subscriber) {
        subscribers.remove(subscriber);
    }
    /**
     * 发送消息
     *      将接收到的事件发送给订阅者
     * @param msg
     */
    public void post(String msg) {
        for (int i = 0; i < subscribers.size(); i++) {
            subscribers.get(i).onEvent(msg);
        }
    }
}


5、客户端


public class Client {
    public static void main(String[] args) {
        // 创建订阅者
        Subscriber1 subscriber1 = new Subscriber1();
        Subscriber2 subscriber2 = new Subscriber2();
        // 注册订阅者
        Dispatcher.getInstance().register(subscriber1);
        Dispatcher.getInstance().register(subscriber2);
        // 创建发布者
        Publisher publisher = new Publisher();
        // 发布消息
        publisher.post("Hello");
    }
}


执行结果 :

image.png

目录
相关文章
|
2月前
|
JavaScript 前端开发 API
第二十九章 使用消息订阅发布实现组件通信
第二十九章 使用消息订阅发布实现组件通信
|
18天前
|
存储 负载均衡 安全
中间件消息发布-订阅模式
【6月更文挑战第9天】
16 5
|
2月前
|
传感器 监控 网络协议
MQTT 发布、订阅模式介绍
【2月更文挑战第17天】
193 6
MQTT 发布、订阅模式介绍
|
2月前
|
移动开发 小程序 Go
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
25 0
|
2月前
|
消息中间件 Java
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
60 0
|
9月前
|
存储
06JMS发布/订阅模式
06JMS发布/订阅模式
33 0
|
消息中间件 传感器 存储
MQTT介绍-发布/订阅模式
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议。
5419 0
EMQ
|
消息中间件 传感器 存储
MQTT 发布/订阅模式介绍
MQTT发布/订阅模式区别于传统的客户端/服务器模式,它使发布者与订阅者分离,发布者与订阅者不需要建立直接联系。
EMQ
969 0
MQTT 发布/订阅模式介绍
|
小程序 开发工具
微信小程序订阅消息:用云服务编写订阅消息超详细描述
微信小程序订阅消息:用云服务编写订阅消息超详细描述
微信小程序订阅消息:用云服务编写订阅消息超详细描述
EMQ
|
存储 数据采集 运维
EMQX v4.4.5 发布:新增排他订阅及 MQTT 5.0 发布属性支持
EMQX此次发布实现了与流数据库HStreamDB的集成,提供一站式数据接入与实时处理分析,新增排他订阅功能等帮助用户应对更多场景使用需求。
EMQ
187 0
EMQX v4.4.5 发布:新增排他订阅及 MQTT 5.0 发布属性支持