什么是发布订阅模式
发布订阅模式是软件开发者很常见的一种设计模式,很多开源库都使用了发布订阅模式,例如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("祝你虎年大吉大利"); // 发布新消息
示例结果:
小明发布了新消息;张三,收到消息通知:祝你虎年大吉大利
小明:祝你虎年大吉大利
小明发布了新消息;李四,收到消息通知:祝你虎年大吉大利
小明发布了新消息;王五,收到消息通知:祝你虎年大吉大利
最后,点击查看示例代码
个人公众号,喜欢的可以关注一下:




















