【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

目录
相关文章
|
7月前
|
JavaScript 前端开发 API
第二十九章 使用消息订阅发布实现组件通信
第二十九章 使用消息订阅发布实现组件通信
|
2月前
|
设计模式 消息中间件 安全
C# 一分钟浅谈:观察者模式与订阅发布模式
【10月更文挑战第11天】本文介绍了观察者模式和订阅发布模式,这两种设计模式主要用于实现对象间的解耦。观察者模式通过事件和委托实现一个对象状态改变时通知多个依赖对象;订阅发布模式则通过事件聚合器实现发布者与订阅者之间的解耦。文章详细探讨了这两种模式的实现方式、常见问题及避免方法,帮助开发者在实际项目中更好地应用这些模式,提升代码的可维护性和扩展性。
80 1
|
5月前
|
消息中间件 NoSQL 中间件
中间件发布-订阅模式(Pub/Sub)
【7月更文挑战第1天】
152 2
|
6月前
|
存储 负载均衡 安全
中间件消息发布-订阅模式
【6月更文挑战第9天】
140 5
|
7月前
|
传感器 监控 网络协议
MQTT 发布、订阅模式介绍
【2月更文挑战第17天】
486 6
MQTT 发布、订阅模式介绍
|
7月前
|
移动开发 小程序 Go
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
50 0
EMQ
|
消息中间件 传感器 存储
MQTT 发布/订阅模式介绍
MQTT发布/订阅模式区别于传统的客户端/服务器模式,它使发布者与订阅者分离,发布者与订阅者不需要建立直接联系。
EMQ
1080 0
MQTT 发布/订阅模式介绍
|
缓存 调度
手写发布-订阅模式
发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知。
285 0
|
小程序 开发工具
微信小程序订阅消息:用云服务编写订阅消息超详细描述
微信小程序订阅消息:用云服务编写订阅消息超详细描述
微信小程序订阅消息:用云服务编写订阅消息超详细描述
|
消息中间件 调度
【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
150 0
【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )