Domanda

Recentemente ho imbattuto in diversi oggetti implementati per gestire gli eventi con una mappatura hard coded che utilizzano questo schema:

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

dove funzioni DoSomething vengono implementati come metodi della stessa classe.

Nella speranza di lotta per l'accoppiamento più libera, come ti suggerisco di astrazione questo modello? Inoltre, qual è l'approccio migliore per le funzioni di mappatura 0..n ad un evento sparato?

È stato utile?

Soluzione

sì, in pratica ciò che si vuole fare è creare una struttura di dati che mappa un tipo di evento a un'interfaccia. Ecco un semplice implementato come una mappa.

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

Questo ti dà la possibilità di gestire in modo efficiente un gran numero di eventi e dinamicamente aggiungere, rimuovere e rimappare eventi a diversi gestori.

Altri suggerimenti

C'è poco tempo fa era un post SOF che era simile e abbastanza vicino che la mia risposta qui può rispondere alla tua domanda abbastanza bene.

Invece di un eseguibile, si dovrebbe fare la propria interfaccia:

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

Si può iniziare facendo il codice di un po 'più pulito. Utilizzare una variabile locale per eliminare il event.getCode() ripetuto. Passare a enumerazioni in modo da poter utilizzare switch.

Se c'è un modello ripetuto è possibile decodificare ad un multiplo di interfaccia metodo di callback, come AWT fa.

Vorrei suggerire che la registrazione della ancor diventa più specifica. Registra un callback diverso per ogni tipo di evento. Anche per quanto riguarda prendendo il codice evento fuori della manifestazione, e forse rimuovendo l'evento. Sotto le lenzuola si potrebbe mantenere il codice evento per una mappatura per i gestori, ma questo dovrebbe essere opaco. Lo svantaggio di questo approccio è che le classi interne anonime sono attualmente (JDK6) altamente dettagliato e la gestione della classe è inefficiente (tempi di caricamento e perm gen impronta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top