文章目录
一、发布-订阅模式
二、代码实现发布-订阅模式
1、订阅者接口
2、订阅者实现类
3、发布者
4、调度中心
5、客户端
一、发布-订阅模式
发布订阅模式 :
发布者 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"); } }
执行结果 :