发布-订阅模式
先简单说一下发布订阅模式各个组件的定义:
发布者 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、调度中心
调度中心提供如下功能 :
订阅者队列 : 维护一个订阅者集合 , 收到消息后 , 需要将数据发送给各个订阅者 ;
注册订阅者 : 可以添加订阅者到集合中 ;
删除订阅者 : 将订阅者从集合中删除 ;
/**
* 调度中心
*/
public class Dispatcher {
/**
* 维护订阅者集合
*/
private List<Subscriber> subscribers;
/**
* 单例模式实例对象
*/
private static Dispat public static Dispatcher getInstance() {
if (instance == null) {
instance = new Dispatcher();
}
return instance;
}
/**
* 注册订阅者
* @param subscriber
*/
private Dispatcher() {
this.subscribers = new ArrayList<>();
}
/**
* 取消订阅者
* @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");
}
}