Java实现发布订阅模式

article/2025/10/27 3:28:29

什么是发布订阅模式

发布订阅模式是软件开发者很常见的一种设计模式,很多开源库都使用了发布订阅模式,例如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;}@Overridepublic void emit(ISubscriber subscriber) {// 将每一个新的订阅者添加到集合中维护events.add(subscriber);}@Overridepublic void on(String msg) {// 触发订阅的原理就是遍历该集合,然后将消息发送给集合中的每一个订阅者for (int i = 0; i < events.size(); i++) {Subscriber subscriber = (Subscriber) events.get(i);subscriber.on(this.name, msg);}}@Overridepublic void remove(ISubscriber subscriber) {// 移除订阅者events.remove(subscriber);}}

二、创建订阅者

1、定义订阅者接口,接口定义收到消息监听方法,所有的订阅者都实现该接口。

public interface ISubscriber {void on(String publisher, String msg);}

2、创建订阅者,订阅者实现ISubscriber接口。

public class Subscriber implements ISubscriber {// 订阅者名称private String name;private Receiver receiver;public interface Receiver {void onMessage(String publisher, String msg);}// 创建订阅者public Subscriber(String name) {this.name = name;}// 创建订阅者,也可以加个回调函数,用来将消息回调出去public Subscriber(String name, Receiver receiver) {this.name = name;this.receiver = receiver;}@Overridepublic void on(String publisher, String msg) {// 这里会收到发布者消息,然后做相应的处理,一般这里会创建一个回调函数,通过回调函数将消息发送出去System.out.println(publisher + "发布了新消息;" + this.name + ",收到消息通知:" + msg);if (receiver != null) {receiver.onMessage(publisher, msg);}}
}

三、使用示例

Subscriber subscriber1 = new Subscriber("张三", new Subscriber.Receiver() {@Overridepublic void onMessage(String publisher, String msg) {// 收到消息System.out.println(publisher + ":" + msg);}
}); // 创建订阅者张三
Subscriber subscriber2 = new Subscriber("李四"); // 创建订阅者李四
Subscriber subscriber3 = new Subscriber("王五"); // 创建订阅者王五EventBus eventBus = new EventBus("小明"); // 创建发布者小明
eventBus.emit(subscriber1); // 添加张三订阅者
eventBus.emit(subscriber2); // 添加李四订阅者
eventBus.emit(subscriber3); // 添加王五订阅者eventBus.on("祝你虎年大吉大利"); // 发布新消息

示例结果:

小明发布了新消息;张三,收到消息通知:祝你虎年大吉大利
小明:祝你虎年大吉大利
小明发布了新消息;李四,收到消息通知:祝你虎年大吉大利
小明发布了新消息;王五,收到消息通知:祝你虎年大吉大利

最后,点击查看示例代码

个人公众号,喜欢的可以关注一下:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/lyYucgtH.shtml

相关文章

设计模式 —— 发布订阅模式

设计模式 —— 发布订阅模式 《工欲善其事&#xff0c;必先利其器》 我在之前有写过一篇关于 《观察者模式》 的文章&#xff0c;大家有兴趣的可以去看看&#xff0c;个人认为那个例子还是挺生动的。&#xff08;狗头&#xff09; 不过今天我们要学习的是&#xff0c;发布订阅…

小侃设计模式(十八)-发布订阅模式

1.概述 发布订阅模式又叫观察者模式&#xff08;Observer Pattern&#xff09;&#xff0c;它是指对象之间一对多的依赖关系&#xff0c;每当那个特定对象改变状态时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新&#xff0c;它是行为型模式的一种。观察者模式内部…

发布-订阅模式

发布-订阅模式 学习知识要善于思考&#xff0c;思考&#xff0c;再思考。 —— 爱因斯在众多设计模式中&#xff0c;可能最常见、最有名的就是发布 - 订阅模式了&#xff0c;本篇我们一起来学习这个模式。 发布 - 订阅模式 &#xff08;Publish-Subscribe Pattern, pub-sub&a…

什么是发布订阅模式?

发布-订阅模式&#xff08;Publish-Subscribe pattern&#xff09;是一种软件架构模式&#xff0c;用于实现组件之间的解耦和消息传递。在这种模式中&#xff0c;组件&#xff08;发布者&#xff09;将消息发送到一个中心&#xff08;消息代理或主题&#xff09;&#xff0c;然…

发布订阅模式

零、目录 应用场景实现原理代码实现全局模式下的订阅发布模式&#xff08;泛化的订阅发布模式&#xff09;总结 一、应用场景 ​ 发布订阅模式&#xff0c;广泛的存在于在我们的生活之中。 ​ 举个一个简单的例子来说&#xff0c;当我们在浏览视频或者博客论坛之类的网…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:VLCPlayer

本文简述如何在Smobiler中使用VLCPlayer插件&#xff0c;该插件支持播放rtsp流。 Step 1. 新建一个SmobilerForm窗体&#xff0c;再拖入VLCPlay&#xff0c;布局如下 在设计器中给VLCPlayer.Url赋值或者在窗体的Load事件中赋值 演示使用的rtsp流地址 rtsp://wowzaec2demo.strea…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:TTS

本文简述如何在Smobiler中使用TTS文字转语音。 Step 1. 新建一个SmobilerForm窗体&#xff0c;并在窗体中加入TTS和Button&#xff0c;布局如下 Button的点击事件代码&#xff1a; private void button1_Press(object sender, EventArgs e){ //第一个参数为文本&#xff1b;第…

Smobiler 仿得到APP个人主页

原型如下&#xff1a; 完整代码参考 https://github.com/comsmobiler/BlogsCode/blob/master/Source/BlogsCode_SmobilerForm/MyForm/dedao.cs 思路 可以将原型按照上图分成2个部分&#xff0c;部分A可以使用label、image、button、imagebutton、fontIcon控件来实现&#xff…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:PDFView

本文简述如何在Smobiler中使用PDFView。 Step 1. 新建一个SmobilerForm窗体&#xff0c;再拖入PDfView&#xff0c;布局如下 PDFView.ResourcrPath默认Document&#xff0c;指项目下\Resources\Document&#xff0c;若是pdf文件放在该文件夹下&#xff0c;则在设计器中直接赋值…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:OCR组件

本文简述如何在Smobiler中使用OCR组件进行文字识别。 Step 1. 新建一个SmobilerForm窗体&#xff0c;并在窗体中加入OCR和Button&#xff0c;布局如下 Button的点击事件代码&#xff1a; private void button1_Press(object sender, EventArgs e){ocr1.Recognize((obj,args)>…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:ArcFace人脸识别

本文简述如何在Smobiler中使用ArcFace&#xff08;虹软人脸识别&#xff09;。 Step 1. 新建一个SmobilerForm窗体&#xff0c;再拖入Button,Label,TextBox和AcrFace,布局如下 在设计器中给MediaView.Url赋值或者在窗体的Load事件中赋值 Button的事件代码如下 string message …

移动OA办公——Smobiler第一个开源应用解决方案,快来get吧

产品简介 SmoONE是一款移动OA类的开源解决方案&#xff0c;通过Smobiler平台开发&#xff0c;包含了注册、登陆、用户信息等基本功能。集成了OA中使用场景较多的报销、请假、部门管理、成本中心等核心功能。 免费获取方案 开源代码&#xff1a;https://github.com/comsmobile…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:UsbSerial串口通讯组件

本文简述如何在Smobiler中使用UsbSerial。 Step 1. 新建一个SmobilerForm窗体&#xff0c;再拖入UsbSerial和Button&#xff0c;布局如下 按钮事件代码&#xff1a; //连接private void button1_Press_2(object sender, EventArgs e){usbSerial1.Connect(Smobiler.Plugins.USBS…

Smobiler实现手机弹窗

前言 在实际项目中有很多场景需要用到弹窗&#xff0c;如图1 那么这些弹窗在Smobiler中如何实现呢&#xff1f; 正文 Smobiler实现弹窗有两种方式&#xff1a;1.MessageBox.Show 2.ShowDialog和ShowContextDialog。前者适合简易弹窗&#xff0c;后者适合自定义弹窗。 Messa…

Smobiler实现美观登录界面——C# 或.NET Smobiler实例开发手机app(二)

目录 一、 本文目标 二、 准备工作 1、 数据库 2、 材料 三、 界面布局 1、设置控件的属性值 &#xff08;1&#xff09; 输入框 &#xff08;2&#xff09; 图片属性 &#xff08;3&#xff09; HandElectricity的标题的label属性 &#xff08;4&#xff09;登录按钮…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:MediaView

本文简述如何在Smobiler中使用MediaView。 Step 1. 新建一个SmobilerForm窗体&#xff0c;再拖入MediaView&#xff0c;MediaView.Size设置&#xff08;300,225&#xff09;,布局如下 在设计器中给MediaView.Url赋值或者在窗体的Load事件中赋值 播放本地视频可以通过GetResourc…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:AliPay组件

本文简述如何在Smobiler中调用支付宝支付。 Step 1. 界面 新建一个窗体&#xff0c;并在窗体中拖入Button&#xff0c;Label&#xff0c;AliPay等控件&#xff0c;布局如下&#xff1a; Step 2. 代码 在窗体中声明变量 //订单编号private string tradeNo;//支付宝应用编号&am…

.NET(C#、VB)APP开发——Smobiler平台控件介绍:BarcodeReader组件

本文简述如何在Smobiler中使用BarcodeReader组件进行条码识别。Barcodereader通过机器学习能识别不规则条码&#xff0c;效率更好。 Step 1. 新建一个SmobilerForm窗体&#xff0c;并在窗体中加入Barcodereader和Button&#xff0c;布局如下 Button的点击事件代码&#xff1a; …

.NET(C#、VB)APP开发——Smobiler平台控件介绍:LiveStream和LiveStreamPlayer

本文简述如何在Smobiler中使用LiveStream和LiveStreamPlayer。 LiveStream 直播推送插件 Step 1. 新建一个SmobilerForm窗体&#xff0c;并在窗体中加入LiveStream和Button&#xff0c;布局如下 选中LisvStream&#xff0c;在设计器中设置Url&#xff08;需要事先准备一个视频…

【转载】smobiler说明

类似开发WinForm的方式&#xff0c;使用C#开发Android和IOS的移动应用&#xff1f;听起来感觉不可思议&#xff0c;那么Smobiler平台到底是如何实现的呢&#xff0c;这里给大家介绍一下。 客户端 Smobiler分为两种客户端&#xff0c;一种是开发版&#xff0c;一种是打包版 开发…