java - 创建简单的事件驱动架构

标签 java events architecture event-driven

目前项目遇到一些麻烦。我正在实现一个游戏,我希望它是事件驱动的。

到目前为止,我有一个 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,则以下内容会更好。

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);
    }
}

关于java - 创建简单的事件驱动架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13483048/

相关文章:

c# - 无关类之间的事件

c# - MVVM体系结构: one model - several view models + place for data access

asp.net - ASP.NET网站+ Windows窗体应用程序+ WCF服务:客户端凭据

java - 如何在 Java 中创建 "event-driven"后台线程?

java - 如何在 Java 中获取正则表达式中的第二个匹配器?

jQuery JQGrid 分页事件

javascript - jQuery UI 选项卡 - 如果选项卡离开并切换回,则不会添加事件处理程序

Java无法扩展ByteBuffer类

java - BiFunction 引用可以传递给需要功能接口(interface)的方法吗?

rest - 在后端提供动态文件的最佳实践