Если вы хотите иметь один класс обработчика с несколькими методами :
Вы можете просто использовать огромный if-else
или использовать Reflection
if-else:
public void handle(Event event){
if(event instanceOf(EventA)){
handleEventA();
}
else if(event instanceOf(EventB)){
handleEventA();
}
//...
else{
handleDefaultEvent();
}
}
Отражение:
package com.stackoverflow.q56754275.single_class;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class HandlerController {
private Handler handler;
public HandlerController(Handler handler) {
this.handler=handler;
}
@SuppressWarnings("unchecked")
public void handle(Event event) {
Class<? extends Event> eventClass=event.getClass();
Class<?> handlerClass=handler.getClass();
Method handlerMethod=null;
while(eventClass!=null&&!eventClass.equals(Object.class)) {
try {
handlerMethod = handlerClass.getMethod("handle", eventClass);
handlerMethod.invoke(handler, event);
break;
} catch (NoSuchMethodException | IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
}
Class<?> superCl=eventClass.getSuperclass();
if (superCl!=null) {
eventClass=(Class<? extends Event>) superCl;
}
}
}
}
package com.stackoverflow.q56754275.single_class;
public interface Handler {
void handle(Event event);
}
package com.stackoverflow.q56754275.single_class;
public class Event {
}
package com.stackoverflow.q56754275.single_class;
public class SampleEventHandler implements Handler{
@Override
public void handle(Event event) {//default Handler
}
public void handle(EventA event) {//Handler for EventA
}
private static class EventA extends Event{
}
}
Если вы хотите hava класс для каждого обработчика :
Вы можете создать Map<Class<? extends Event>,Handler>
в порядкенайти обработчики событий.
package com.stackoverflow.q56754275.multiple_classes;
import java.util.HashMap;
import java.util.Map;
public class EventController {
private Map<Class<? extends Event>, Handler> handlers=new HashMap<>();
@SuppressWarnings("unchecked")
public void handle(Event event) {
Class<? extends Event> cl=event.getClass();
while(cl!=null&&!handlers.containsKey(cl)) {
Class<?> superCl=cl.getSuperclass();
if (superCl==null||superCl.equals(Object.class)) {
cl=null;
}
else {
cl=(Class<? extends Event>) superCl;
}
}
if (cl != null) {
handlers.get(cl).handle(event);
}
}
public void addHandler(Class<? extends Event> eventToHandle, Handler handler) {
handlers.put(eventToHandle, handler);
}
package com.stackoverflow.q56754275.multiple_classes;
public class Event {
}
package com.stackoverflow.q56754275.multiple_classes;
public interface Handler {
void handle(Event event);
}
Как создать обработчик?
package com.stackoverflow.q56754275.multiple_classes;
public class SampleEventHandler implements Handler{
@Override
public void handle(Event event) {
SampleEvent se=(SampleEvent) event;//if this is only for Events of type SampleEvent
System.out.println(se);
}
}
Как создать событие?
package com.stackoverflow.q56754275.multiple_classes;
public class SampleEvent extends Event {
@Override
public String toString() {
return "SampleEvent";
}
}
Как добавитьобработчик контроллера (например, SampleEventHandler
для SampleEvent
с?
controller.addHandler(SampleEvent.class, new SampleEventHandler());
[ПРИМЕЧАНИЕ]
Возможно выполнение нескольких обработчиков, если вы используете Collection
s для обработчиков и перебирать их.