2010-12-03 3 views
7

Wenn ich ein Objekt habe, möchte ich mehrere andere beobachtbare Objekte beobachten können, nicht alle vom gleichen Typ. Zum Beispiel möchte ich, dass A in der Lage ist, B und C zu beobachten. B und C sind völlig unzusammenhängend, abgesehen von der Tatsache, dass beide Observable implementieren.Beobachtung mehrerer Observablen unter Vermeidung von instanceof-Operator in Java?

Die offensichtliche Lösung ist nur zu verwenden "if instanceof" innerhalb der Update-Methode, aber das kann schnell chaotisch werden und als solche frage ich mich, ob es einen anderen Weg gibt?

Antwort

7

Ähnlich wie bei früheren Vorschlägen könnten Sie Ihr Update auf ändern.

public void update(Observable o, Object arg) { 
    try{ 
    Method update = getClass().getMethod(o.getClass(), Object.class); 
    update.invoke(this, o, arg); 
    } catch(Exception e) { 
    // log exception 
    } 
} 

diese Weise können Sie eine Methode

public void update(A a, Object arg); 
public void update(B b, Object arg); 
public void update(C c, Object arg); 

für jede Art beobachten Sie hinzufügen können. Leider müssen Sie den genauen konkreten Typ des Observable kennen. Sie könnten jedoch die Reflexionen ändern, um Schnittstellen usw. zu ermöglichen.

0

Unter der Annahme, dass die Operationen auf Objekt B/C identisch wären und Sie lediglich zwischen den beiden Objekten für den Statusjuggling unterscheiden möchten, könnten Sie auch ein Delegatobjekt erstellen, das die tatsächliche Beobachtungslogik/den Status implementiert und eine Suche verwendet Mechanismus in Ihrem Hauptobjekt, um den richtigen Delegaten für das bestimmte Observable-Objekt abzurufen. Dann leiten Sie die Anrufe weiter.

0

Sie können immer eine Map<Class<? extends Event>, EventHandler> in Ihrem Listener haben. Ähnlich, aber kein expliziter 'instanceof'-Operator. Es wird mit containsKey() in einer Karte ersetzt.

12

Eine saubere Lösung wäre die Verwendung von (anonymen) inneren Klassen in A als Observer s zu fungieren. Zum Beispiel:

class A { 
    public A(B b, C c) { 
     b.addObserver(new BObserver()); 
     c.addObserver(new CObserver()); 
    } 

    private class BObserver implements Observer { 
     // Logic for updates on B in update method 
    } 

    private class CObserver implements Observer { 
     // Logic for updates on C in update method 
    } 
} 

Dies ermöglicht es Ihnen, aber viele B s und C s Sie tatsächlich sehen wollen BObserver/CObserver Instanzen hinzuzufügen. Es hat den zusätzlichen Vorteil, dass die öffentliche Schnittstelle A ist weniger überladen und Sie können leicht neue innere Klassen hinzufügen, um Klassen , E und F zu behandeln.

+3

Fast sicher möchten Sie Ihre inneren Klassen anonym machen. –

+0

Im Allgemeinen, ja, aber für dieses Beispiel benannte Klassen machen es ein bisschen lesbarer. –

Verwandte Themen