天天看點

【EventBus】釋出-訂閱模式 ( 使用代碼實作釋出-訂閱模式 )

文章目錄

  • 一、釋出-訂閱模式
  • 二、代碼實作釋出-訂閱模式
    • 1、訂閱者接口
    • 2、訂閱者實作類
    • 3、釋出者
    • 4、排程中心
    • 5、用戶端

一、釋出-訂閱模式

釋出訂閱模式 :

  • 釋出者 Publisher : 狀态改變時 , 向 消息中心 發送事件 ;
  • 訂閱者 Subscriber : 到 消息中心 訂閱自己關心的事件 ;
  • 消息中心 : 負責維護一個 消息隊列 , 根據 消息類型 将 消息 轉發給 對應的 訂閱者 ;
【EventBus】釋出-訂閱模式 ( 使用代碼實作釋出-訂閱模式 )

下面按照該結構實作一個簡單的 釋出-訂閱模式 ;

二、代碼實作釋出-訂閱模式

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");
    }
}