我们将主要关注以下几个方面:
管理订阅者
发布事件
分发事件
我们将主要关注以下几个方面:
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 库中,这些功能都得到了实现,以提供更高效和灵活的事件分发机制。