目录
- 需求描述:
- 项目依赖:
- 代码实现:
- 定义通用的事件对象
- 定义事件监听器接口
- 定义事件监听器适配器对象
- 定义事件管理器接口
- 定义默认的事件管理器对象
- 创建三个不同的监听器对象
- 运行效果:
需求描述:
创建一个事件管理器,然后向其注册事件监听器,事件监听器上有各种处理不同事件的方法,当有事件被触发的时候,要求监听器能自动处理。
测试代码如下:
public class DefaultEventManagerTest {
public static void main(String[] args) {
EventManager eventManager = new DefaultEventManager();
CustomAppListener1 customAppListener1 = new CustomAppListener1();
CustomAppListener2 customAppListener2 = new CustomAppListener2();
CustomAppListener3 customAppListener3 = new CustomAppListener3();
eventManager.register(customAppListener1);
eventManager.register(customAppListener2);
eventManager.register(customAppListener3);
System.out.println("==========查看现有监听器==========");
for (EventListener registeredListener : eventManager.getRegisteredListeners()) {
System.out.println(registeredListener.getClass().getSimpleName());
}
System.out.println("==========处理指定的事件==========");
eventManager.handle(new MessageCreateEvent());
eventManager.handle(new MessageDeleteEvent());
eventManager.handle(new MessageReceivedEvent());
eventManager.handle(new MessageUpdateEvent());
eventManager.handle(new GenericEvent());
eventManager.unregister(customAppListener1);
eventManager.unregister(customAppListener2);
eventManager.unregister(customAppListener3);
System.out.println("==========查看现有监听器==========");
System.out.println(eventManager.getRegisteredListeners().size());
}
}
运行效果如下:
==========查看现有监听器==========
CustomAppListener1
CustomAppListener2
CustomAppListener3
==========处理指定的事件==========
main ==> CustomAppListener1 onMessageCreate handle
main ==> CustomAppListener2 onMessageCreate handle
main ==> CustomAppListener3 onMessageCreate handle
main ==> CustomAppListener1 onMessageDelete handle
main ==> CustomAppListener2 onMessageDelete handle
main ==> CustomAppListener3 onMessageDelete handle
main ==> CustomAppListener1 onMessageReceived handle
main ==> CustomAppListener2 onMessageReceived handle
main ==> CustomAppListener3 onMessageReceived handle
main ==> CustomAppListener1 onMessageUpdate handle
main ==> CustomAppListener2 onMessageUpdate handle
main ==> CustomAppListener3 onMessageUpdate handle
==========查看现有监听器==========
0
项目依赖:
无需第三方依赖,完全由自己实现。
最终实现的结构:
代码实现:
定义通用的事件对象
我们先要定义一个通用事件对象(GenericEvent),这是一个父类,然后我们根据不同的类型创建不同的子类,比如可以分为:user类型、message类型等等。
user类型我们可以定义如下子类:(举例说明,请根据实际情况自行拓展)
用户创建事件(UserCreateEvent)
用户销毁事件(UserDestroyEvent)
message类型我们可以定义如下子类:(举例说明,请根据实际情况自行拓展)
消息创建事件(MessageCreateEvent)
消息删除事件(MessageDeleteEvent)
消息接收事件(MessageReceivedEvent)
消息更新事件(MessageUpdateEvent)
父类代码:
cn.caochenlei.event.GenericEvent
public class GenericEvent {
}
子类代码:
cn.caochenlei.event.message.MessageCreateEvent(消息创建事件对象)
package cn.caochenlei.event.message;
import cn.caochenlei.event.GenericEvent;
public class MessageCreateEvent extends GenericEvent {
}
cn.caochenlei.event.message.MessageDeleteEvent(消息删除事件对象)
package cn.caochenlei.event.message;
import cn.caochenlei.event.GenericEvent;
public class MessageDeleteEvent extends GenericEvent {
}
cn.caochenlei.event.message.MessageReceivedEvent(消息接收事件对象)
package cn.caochenlei.event.message;
import cn.caochenlei.event.GenericEvent;
public class MessageReceivedEvent extends GenericEvent {
}
cn.caochenlei.event.message.MessageUpdateEvent(消息更新事件对象)
package cn.caochenlei.event.message;
import cn.caochenlei.event.GenericEvent;
public class MessageUpdateEvent extends GenericEvent {
}
定义事件监听器接口
cn.caochenlei.event.EventListener
package cn.caochenlei.event;
@FunctionalInterface
public interface EventListener {
void onEvent(GenericEvent event);
}
定义事件监听器适配器对象
监听器适配器对象的核心思想:通过onEvent中的事件对象实际类型在EventListenerAdapter中找到对应的方法,然后执行即可。
cn.caochenlei.event.EventListenerAdapter
package cn.caochenlei.event;
import cn.caochenlei.event.message.MessageCreateEvent;
import cn.caochenlei.event.message.MessageDeleteEvent;
import cn.caochenlei.event.message.MessageReceivedEvent;
import cn.caochenlei.event.message.MessageUpdateEvent;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public abstract class EventListenerAdapter implements EventListener {
public void onGenericEvent(GenericEvent event) {}
public void onMessageCreate(MessageCreateEvent event) {}
public void onMessageDelete(MessageDeleteEvent event) {}
public void onMessageReceived(MessageReceivedEvent event) {}
public void onMessageUpdate(MessageUpdateEvent event) {}
private static final MethodHandles.Lookup lookup = MethodHandles.lookup();
private static final ConcurrentMap<Class<?>, MethodHandle> methods = new ConcurrentHashMap<>();
private static final Set<Class<?>> unresolved;
static {
unresolved = ConcurrentHashMap.newKeySet();
Collections.addAll(unresolved,
Object.class,
GenericEvent.class
);
}
@Override
public final void onEvent(GenericEvent event) {
onGenericEvent(event);
for (Class<?> clazz : ClassWalker.range(event.getClass(), GenericEvent.class)) {
if (unresolved.contains(clazz))
continue;
MethodHandle mh = methods.computeIfAbsent(clazz, EventListenerAdapter::findMethod);
if (mh == null) {
unresolved.add(clazz);
continue;
}
try {
mh.invoke(this, event);
} catch (Throwable throwable) {
if (throwable instanceof RuntimeException)
throw (RuntimeException) throwable;
if (throwable instanceof Error)
throw (Error) throwable;
throw new IllegalStateException(throwable);
}
}
}
private static MethodHandle findMethod(Class<?> clazz) {
String name = clazz.getSimpleName();
MethodType type = MethodType.methodType(Void.TYPE, clazz);
try {
name = "on" + name.substring(0, name.length() - "Event".length());
return lookup.findVirtual(EventListenerAdapter.class, name, type);
} catch (NoSuchMethodException | IllegalAccessException ignored) {
}
return null;
}
}
cn.caochenlei.event.ClassWalker
package cn.caochenlei.event;
import java.util.*;
public class ClassWalker implements Iterable<Class<?>> {
private final Class<?> clazz;
private final Class<?> end;
private ClassWalker(Class<?> clazz) {
this(clazz, Object.class);
}
private ClassWalker(Class<?> clazz, Class<?> end) {
this.clazz = clazz;
this.end = end;
}
public static ClassWalker range(Class<?> start, Class<?> end) {
return new ClassWalker(start, end);
}
public static ClassWalker walk(Class<?> start) {
return new ClassWalker(start);
}
@Override
public Iterator<Class<?>> iterator() {
return new Iterator<Class<?>>() {
private final Set<Class<?>> done = new HashSet<>();
private final Deque<Class<?>> work = new LinkedList<>();
{
work.addLast(clazz);
done.add(end);
}
@Override
public boolean hasNext() {
return !work.isEmpty();
}
@Override
public Class<?> next() {
Class<?> current = work.removeFirst();
done.add(current);
for (Class<?> parent : current.getInterfaces()) {
if (!done.contains(parent))
work.addLast(parent);
}
Class<?> parent = current.getSuperclass();
if (parent != null && !done.contains(parent))
work.addLast(parent);
return current;
}
};
}
}
定义事件管理器接口
cn.caochenlei.event.EventManager
package cn.caochenlei.event;
import java.util.List;
public interface EventManager {
void register(EventListener listener);
void unregister(EventListener listener);
void handle(GenericEvent event);
List<EventListener> getRegisteredListeners();
}
定义默认的事件管理器对象
默认事件管理器实现的核心思想:通过调用handle方法,然后将listeners中所有的监听器都执行一次onEvent方法,在上边我们介绍了,onEvent方法实际上去找EventListenerAdapter中定义的方法,然后执行,这里的EventListenerAdapter定义的方法,一般是我们自己重写之后的方法,马上就会介绍到。
cn.caochenlei.event.DefaultEventManager
package cn.caochenlei.event;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class DefaultEventManager implements EventManager {
private final List<EventListener> listeners = new CopyOnWriteArrayList<>();
public DefaultEventManager() {}
@Override
public void register(EventListener listener) {
if (!(listener instanceof EventListener)) {
throw new IllegalArgumentException("Listener must implement EventListener");
}
listeners.add(listener);
}
@Override
public void unregister(EventListener listener) {
if (!(listener instanceof EventListener)) {
throw new IllegalArgumentException("Listener must implement EventListener");
}
listeners.remove(listener);
}
@Override
public List<EventListener> getRegisteredListeners() {
return Collections.unmodifiableList(new ArrayList<>(listeners));
}
@Override
public void handle(GenericEvent event) {
for (EventListener listener : listeners) {
try {
listener.onEvent(event);
} catch (Throwable throwable) {
System.err.println("One of the EventListeners had an uncaught exception");
if (throwable instanceof Error)
throw (Error) throwable;
}
}
}
}
创建三个不同的监听器对象
cn.caochenlei.event.listener.CustomAppListener1
package cn.caochenlei.event.listener;
import cn.caochenlei.event.EventListenerAdapter;
import cn.caochenlei.event.message.MessageCreateEvent;
import cn.caochenlei.event.message.MessageDeleteEvent;
import cn.caochenlei.event.message.MessageReceivedEvent;
import cn.caochenlei.event.message.MessageUpdateEvent;
public class CustomAppListener1 extends EventListenerAdapter {
@Override
public void onMessageCreate(MessageCreateEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener1 onMessageCreate handle");
}
@Override
public void onMessageDelete(MessageDeleteEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener1 onMessageDelete handle");
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener1 onMessageReceived handle");
}
@Override
public void onMessageUpdate(MessageUpdateEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener1 onMessageUpdate handle");
}
}
cn.caochenlei.event.listener.CustomAppListener2
package cn.caochenlei.event.listener;
import cn.caochenlei.event.EventListenerAdapter;
import cn.caochenlei.event.message.MessageCreateEvent;
import cn.caochenlei.event.message.MessageDeleteEvent;
import cn.caochenlei.event.message.MessageReceivedEvent;
import cn.caochenlei.event.message.MessageUpdateEvent;
public class CustomAppListener2 extends EventListenerAdapter {
@Override
public void onMessageCreate(MessageCreateEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener2 onMessageCreate handle");
}
@Override
public void onMessageDelete(MessageDeleteEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener2 onMessageDelete handle");
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener2 onMessageReceived handle");
}
@Override
public void onMessageUpdate(MessageUpdateEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener2 onMessageUpdate handle");
}
}
cn.caochenlei.event.listener.CustomAppListener3
package cn.caochenlei.event.listener;
import cn.caochenlei.event.EventListenerAdapter;
import cn.caochenlei.event.message.MessageCreateEvent;
import cn.caochenlei.event.message.MessageDeleteEvent;
import cn.caochenlei.event.message.MessageReceivedEvent;
import cn.caochenlei.event.message.MessageUpdateEvent;
public class CustomAppListener3 extends EventListenerAdapter {
@Override
public void onMessageCreate(MessageCreateEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener3 onMessageCreate handle");
}
@Override
public void onMessageDelete(MessageDeleteEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener3 onMessageDelete handle");
}
@Override
public void onMessageReceived(MessageReceivedEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener3 onMessageReceived handle");
}
@Override
public void onMessageUpdate(MessageUpdateEvent event) {
System.out.println(Thread.currentThread().getName() + "\t==>\tCustomAppListener3 onMessageUpdate handle");
}
}
运行效果:
cn.caochenlei.event.DefaultEventManagerTest
package cn.caochenlei.event;
import cn.caochenlei.event.listener.CustomAppListener1;
import cn.caochenlei.event.listener.CustomAppListener2;
import cn.caochenlei.event.listener.CustomAppListener3;
import cn.caochenlei.event.message.MessageCreateEvent;
import cn.caochenlei.event.message.MessageDeleteEvent;
import cn.caochenlei.event.message.MessageReceivedEvent;
import cn.caochenlei.event.message.MessageUpdateEvent;
public class DefaultEventManagerTest {
public static void main(String[] args) {
EventManager eventManager = new DefaultEventManager();
CustomAppListener1 customAppListener1 = new CustomAppListener1();
CustomAppListener2 customAppListener2 = new CustomAppListener2();
CustomAppListener3 customAppListener3 = new CustomAppListener3();
eventManager.register(customAppListener1);
eventManager.register(customAppListener2);
eventManager.register(customAppListener3);
System.out.println("==========查看现有监听器==========");
for (EventListener registeredListener : eventManager.getRegisteredListeners()) {
System.out.println(registeredListener.getClass().getSimpleName());
}
System.out.println("==========处理指定的事件==========");
eventManager.handle(new MessageCreateEvent());
eventManager.handle(new MessageDeleteEvent());
eventManager.handle(new MessageReceivedEvent());
eventManager.handle(new MessageUpdateEvent());
eventManager.handle(new GenericEvent());
eventManager.unregister(customAppListener1);
eventManager.unregister(customAppListener2);
eventManager.unregister(customAppListener3);
System.out.println("==========查看现有监听器==========");
System.out.println(eventManager.getRegisteredListeners().size());
}
}
==========查看现有监听器==========
CustomAppListener1
CustomAppListener2
CustomAppListener3
==========处理指定的事件==========
main ==> CustomAppListener1 onMessageCreate handle
main ==> CustomAppListener2 onMessageCreate handle
main ==> CustomAppListener3 onMessageCreate handle
main ==> CustomAppListener1 onMessageDelete handle
main ==> CustomAppListener2 onMessageDelete handle
main ==> CustomAppListener3 onMessageDelete handle
main ==> CustomAppListener1 onMessageReceived handle
main ==> CustomAppListener2 onMessageReceived handle
main ==> CustomAppListener3 onMessageReceived handle
main ==> CustomAppListener1 onMessageUpdate handle
main ==> CustomAppListener2 onMessageUpdate handle
main ==> CustomAppListener3 onMessageUpdate handle
==========查看现有监听器==========
0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)