Beobachtung mehrerer Observablen unter Vermeidung von instanceof-Operator in Java?

7

Wenn ich ein Objekt habe, das mehrere andere beobachtbare Objekte beobachten kann, 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.

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

    
startoftext 03.12.2010, 22:38
quelle

4 Antworten

7

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

ändern %Vor%

Auf diese Weise können Sie eine Methode hinzufügen

%Vor%

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

    
Peter Lawrey 03.12.2010, 23:24
quelle
12

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

%Vor%

Damit können Sie BObserver / CObserver Instanzen zu beliebig vielen B s und C s hinzufügen. Es hat den zusätzlichen Vorteil, dass die öffentliche Schnittstelle von A weniger überladen ist und Sie leicht neue innere Klassen hinzufügen können, um die Klassen D , E und F zu behandeln.

    
Cameron Skinner 03.12.2010 23:44
quelle
0

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

    
user268396 03.12.2010 22:43
quelle
0

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

    
Grzegorz Oledzki 03.12.2010 23:10
quelle

Tags und Links