文章目錄
- 一、釋出-訂閱模式
- 二、代碼實作釋出-訂閱模式
-
- 1、訂閱者接口
- 2、訂閱者實作類
- 3、釋出者
- 4、排程中心
- 5、用戶端
一、釋出-訂閱模式
釋出訂閱模式 :
- 釋出者 Publisher : 狀态改變時 , 向 消息中心 發送事件 ;
- 訂閱者 Subscriber : 到 消息中心 訂閱自己關心的事件 ;
- 消息中心 : 負責維護一個 消息隊列 , 根據 消息類型 将 消息 轉發給 對應的 訂閱者 ;
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiATN381dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM3QDN4EWYwMzMiFzYkJGZxYzXzITMxUTMwEzLcFDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
下面按照該結構實作一個簡單的 釋出-訂閱模式 ;
二、代碼實作釋出-訂閱模式
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");
}
}