一文简单说明EventBus实现原理

我们将主要关注以下几个方面:

管理订阅者
发布事件
分发事件
我们将主要关注以下几个方面:
public class MessageEvent {
    public final String message;

    public MessageEvent(String message) {
        this.message = message;
    }
}

接下来,创建一个简化版的 EventBus 类,实现订阅、取消订阅、发布事件和分发事件的功能:

public class SimpleEventBus {
    private final Map<Class<?>, List<Object>> subscribers = new HashMap<>();

    public void register(Object subscriber) {
        // 获取订阅者的类对象
        Class<?> subscriberClass = subscriber.getClass();

        // 遍历事件类
        for (Map.Entry<Class<?>, List<Object>> entry : subscribers.entrySet()) {
            Class<?> eventType = entry.getKey();

            // 检查订阅者是否有一个接收此事件类型的方法
            try {
                subscriberClass.getDeclaredMethod("onEvent", eventType);
                entry.getValue().add(subscriber);
            } catch (NoSuchMethodException ignored) {
            }
        }
    }

    public void unregister(Object subscriber) {
        for (List<Object> subscribersList : subscribers.values()) {
            subscribersList.remove(subscriber);
        }
    }

    public void post(Object event) {
        // 获取事件类型
        Class<?> eventType = event.getClass();

        // 分发事件给订阅者
        List<Object> eventSubscribers = subscribers.get(eventType);
        if (eventSubscribers != null) {
            for (Object subscriber : eventSubscribers) {
                try {
                    Method method = subscriber.getClass().getDeclaredMethod("onEvent", eventType);
                    method.invoke(subscriber, event);
                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

在这个简化版的 EventBus 中,我们使用了一个 HashMap(subscribers)来保存每个事件类型的订阅者列表。在订阅者注册时,我们会检查订阅者是否有一个名为 onEvent 的方法,该方法接受当前事件类型作为参数。如果有这样的方法,订阅者将被添加到相应的订阅者列表中。在发布事件时,我们会找到相应的订阅者列表,并使用反射调用它们的 onEvent 方法,将事件对象传递给它们。

需要注意的是,这个简化版的 EventBus 实现没有考虑线程模型、订阅者方法的注解和订阅者方法的缓存等细节。在实际的 EventBus 库中,这些功能都得到了实现,以提供更高效和灵活的事件分发机制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值