目前有一个项目有点麻烦。我正在实现一个游戏,我希望它是事件驱动的。
到目前为止,我有一个 EventHandler 类,它有一个重载方法,具体取决于生成的事件类型(PlayerMove、Contact、Attack 等)
我将让游戏驱动程序或类生成事件。我的问题是如何在不将事件生成类与事件处理程序紧密耦合并使 EDA 的使用变得多余的情况下有效地处理事件?
我想设计自己的简单处理程序,而不是为此使用内置的 Java
目前有一个项目有点麻烦。我正在实现一个游戏,我希望它是事件驱动的。
到目前为止,我有一个 EventHandler 类,它有一个重载方法,具体取决于生成的事件类型(PlayerMove、Contact、Attack 等)
我将让游戏驱动程序或类生成事件。我的问题是如何在不将事件生成类与事件处理程序紧密耦合并使 EDA 的使用变得多余的情况下有效地处理事件?
我想设计自己的简单处理程序,而不是为此使用内置的 Java
如果您想要一个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
为不同的事件设置单独的 s,以下会更好。
public interface EventHandler<T extends Event> {
void handle (T event);
}
public class PlayerMoveEventHandler implements EventHandler<PlayerMove> {
@Override
public void handle (final PlayerMove event) {
//... handle
}
}
public class EventRouter {
private final Map<Class, EventHandler> eventHandlerMap = new HashMap<Class, EventHandler> ();
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);
}
}