发布-订阅模式解读

发布-订阅模式

先简单说一下发布订阅模式各个组件的定义:

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值