2012-11-20 46 views
3

目前在项目中遇到了一些麻烦。我正在实施一个游戏,我希望它能够事件驱动。创建简单的事件驱动体系结构

到目前为止,我有取决于什么类型的事件发生(的PlayerMove,联系方式,攻击等),它有一个重载方法的EventHandler类

我将可以进行游戏驱动程序或类生成的事件。我的问题是,如何在不将事件生成类紧密耦合到事件处理程序并使EDA冗余的情况下高效处理事件?

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

+0

您的应用程序是多线程的,还是您希望使用相同的线程来生成/处理事件? – ShyJ

+0

好吧,与AWT所做的一样:它使用事件处理程序的接口(在AWT中称为侦听器)。 –

+0

谢谢你们,它是单线程的。我正在寻找一个很好的简化代码,并解释如何实现AWT所做的事情,你会链接到这样的东西吗? – SMC

回答

7

如果你想有一个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); 
    } 
} 
+0

非常感谢您的帮助 – SMC

+0

The第二个例子不起作用。你不能将'Event'传递给期望'PlayerMove'的方法。如果处理程序需要子类型,则仍然需要使用反射来使用路由器将不同的类型传递给不同的处理程序。此外,不应将'Class'和'EventHandler'用作'EventRouter'中输入的原始数据。 – sethro