创建一个简单的事件驱动架构

时间:2012-11-20 22:08:24

标签: java events architecture event-driven

目前在项目上遇到一些麻烦。我正在实施一个游戏,我想让它以事件为主导。

到目前为止,我有一个EventHandler类,它具有重载方法,具体取决于生成的事件类型(PlayerMove,Contact,Attack等)

我会让游戏驱动程序或类生成事件。我的问题是如何在不将事件生成类紧密耦合到事件处理程序并使EDA冗余使用的情况下如何有效地处理事件?

我想设计自己的简单处理程序,而不是使用内置的Java处理程序

1 个答案:

答案 0 :(得分:9)

如果你想要一个带有重载方法的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<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);
    }
}