6

現在、プロジェクトで少し問題が発生しています。ゲームを実装していますが、イベント駆動型にしたいと考えています。

これまでのところ、生成されるイベントのタイプ (PlayerMove、Contact、Attack など) に応じてオーバーロードされたメソッドを持つ EventHandler クラスがあります。

ゲーム ドライバーまたはクラスのいずれかでイベントを生成します。私の質問は、イベント生成クラスをイベント ハンドラーに密結合させたり、EDA を冗長に使用したりすることなく、イベントを効率的に処理するにはどうすればよいかということです。

組み込みの Java ハンドラーを使用せずに、独自の単純なハンドラーを設計したい

4

1 に答える 1

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);
    }
}
于 2012-11-20T22:28:45.153 に答える