【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
2023-09-27 14:28:10 时间
一、发布-订阅模式
发布订阅模式 :
- 发布者 Publisher : 状态改变时 , 向 消息中心 发送事件 ;
- 订阅者 Subscriber : 到 消息中心 订阅自己关心的事件 ;
- 消息中心 : 负责维护一个 消息队列 , 根据 消息类型 将 消息 转发给 对应的 订阅者 ;
下面按照该结构实现一个简单的 发布-订阅模式 ;
二、代码实现发布-订阅模式
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");
}
}
执行结果 :
相关文章
- 最新解决Chrome(版本76.0.3809.100) “请停用以开发者模式运行的扩展程序”的方法
- 实践GoF的设计模式:单例模式
- 借助三大举措 IBM GBS启动全新咨询模式
- 设计模式19---设计模式之状态模式(State)(行为型)
- 命令模式在MVC框架中的应用
- 设计模式之访问者模式(Visitor)详解及代码示例
- 设计模式之中介者模式(Mediator)详解及代码示例
- 设计模式之命令模式(Command)详解及代码示例
- 设计模式之责任链模式(Chain of Responsibility)详解及代码示例
- 设计模式之享元模式(Flyweight)详解及代码示例
- 设计模式之外观模式(Facade)详解及代码示例
- 设计模式之适配器模式(Adapter)详解及代码示例
- 设计模式之建造者模式(Bulider模式)详解及代码示例
- 山石网科发布山石云·景产品 安全运维管理进入SaaS模式
- 观察者模式
- 【组合模式 实战(2)——空军指挥系统(Java、附代码)】
- java设计模式之组合模式
- 观察者模式
- 【Vue路由】路由守卫、生命周期钩子、路由器工作模式
- C语言和设计模式(解释器模式)
- I3C协议Single Data Rate(SDR)模式研读(六):通用命令代码(CCC)
- I3C协议Single Data Rate(SDR)模式研读(一):总线配置Bus Configuration
- 【阅读推荐】改变你思维模式的书单
- 利用PowerShell代码注入漏洞绕过受限语言模式
- LUA OOP 单例模式实现的 一个 方案
- 发布订阅模式还不会??戳这里,50行核心代码,手把手教你学会