如果你想拥有一个带有重载方法的单个EventHandler类,并且你的事件类型没有任何子类,那么这个使用反射的简单代码应该可以工作:
public class EventHandler {
public void handle (final PlayerMove move) {
//... handle
}
public void handle (final Contact contact) {
//... handle
}
public void handle (final Attack attack) {
//... handle
}
}
public void sendEvent (final EventHandler handler, final Object event) {
final Method method = EventHandler.class.getDeclaredMethod ("handle", new Class[] {event.getClass ()});
method.invoke (handler, event);
}
但是,如果您希望为不同的事件分配EventHandler,则以下情况会更好.
public interface EventHandler {
void handle (T event);
}
public class PlayerMoveEventHandler implements EventHandler {
@Override
public void handle (final PlayerMove event) {
//... handle
}
}
public class EventRouter {
private final Map eventHandlerMap = new HashMap ();
public void sendEvent (final Event event) {
eventHandlerMap.get (event.getClass ()).handle (event);
}
public void registerHandler (final Class eventClass, final EventHandler handler) {
eventHandlerMap.put (eventClass, handler);
}
}