Frage

ich vor kurzem lief über mehrere Objekte umgesetzt Griff Ereignisse mit einer harten codierten Abbildung dieses Muster mit:

public void handleEvent(Event event)
{
    if(event.getCode() == SOME_STATIC_EVENT)
        doSomething(event);
    if(event.getCode() == ANOTHER_STATIC_EVENT)
        doSomethingElse(event);
}

Dabei gilt doSomething Funktionen als Methoden der gleichen Klasse umgesetzt werden.

In der Hoffnung für loseren Kopplung Streben, wie würden Sie empfehlen, abstrahiert dieses Muster aus? Auch was ist der beste Ansatz für die Zuordnung 0..N Funktionen ein Ereignis ausgelöst?

War es hilfreich?

Lösung

Ja, im Grunde, was Sie tun möchten, ist eine Datenstruktur zu erstellen, ordnet einen Ereignistyp auf eine Schnittstelle. Hier ist ein einfacher als eine Karte implementiert.

EventHandlerInterface h;
// eventMap contains a mapping of event codes to
// implementations of EventHandlerInterface
h = eventMap.get(event.getCode());
if(h != null)
{
    h.handle(event);
}

Dies gibt Ihnen die Fähigkeit, effizient eine große Anzahl von Ereignissen verarbeiten und dynamisch hinzufügen, entfernen und neu zuordnen Ereignisse an verschiedenen Handler.

Andere Tipps

Es gab vor kurzem einer SOF-Post, die ähnlich war und nahe genug, dass meine Antwort hier kann Ihre Frage ganz gut beantworten.

Eher als ein lauffähiges, würden Sie Ihre eigene Schnittstelle machen:

public abstract interface EventHandler
{
    public void run(Event event);
}

Du kannst den Code ein wenig sauberen, indem. Verwenden Sie eine lokale Variable, die wiederholt event.getCode() herauszunehmen. Wechseln Sie in den Aufzählungen so können Sie switch verwenden.

Wenn es ein wiederholtes Muster, das Sie auf eine mehr Methode Callback-Schnittstelle dekodieren kann, wie AWT des Fall ist.

Ich würde vorschlagen, dass die Eintragung der noch spezielleren wird. Registrieren Sie einen anderen Rückruf für jeden Ereignistyp. Auch soweit den Ereigniscode aus dem Turnier gestartet werden, und vielleicht das Ereignis zu entfernen. Unter den Blättern können Sie den Ereigniscode für eine Zuordnung zu Handler halten, aber diese undurchsichtig sein sollte. Der Nachteil dieses Ansatzes ist, dass anonyme innere Klassen sind zur Zeit (JDK6) sehr ausführlich und Klassenbehandlung ist ineffizient (Ladezeiten und zul gen Fußabdruck).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top