2010-06-01 13 views
6

Ich habe gerade angefangen zu spielen mit Observable, Observer und es ist update() Methode und ich kann nicht verstehen, was ich tun soll, wenn verschiedene Aktionen notifyObservers() aufrufen.Wie führe ich verschiedene Operationen innerhalb von Observer's update() in Java durch?

Ich meine, meine Observable Klasse hat ein paar verschiedene Methoden, die am Ende setChanged() und notifyObservers() aufrufen. Abhängig von der aufgerufenen Methode muss ein Teil der Benutzeroberfläche (Swing) aktualisiert werden. Es gibt jedoch nur eine update() Methode in der Observer Klasse implementiert.

Ich habe zwar etwas an die notifyObservers() Methode übergeben und dann kann ich das Argument auf update() überprüfen, aber es fühlt sich nicht wie eine gute Möglichkeit, es zu tun. Selbst wenn, was sollte ich bestehen? Eine Zeichenfolge mit einer kurzen Beschreibung der Aktion/Methode? Ein int, wie ein Action/Methode-Code? Etwas anderes?

Was ist der beste Weg, um mit dieser Situation umzugehen?

Antwort

7

im Allgemeinen sollten Sie alles von der Observable aktualisieren, wenn Sie einen Anruf zu update() erhalten. Wenn das nicht praktikabel ist, können Sie einen Hinweis an notifyObservers() übergeben.

die Bande-of-Buch sagt, dass eine der Folgen des Betrachters Muster.

„Unexpected Updates Da Beobachter keine Kenntnis von jeder Anwesenheit des anderen haben, sie zu ändern, um die endgültigen Kosten blind sein können Das Thema Eine scheinbar harmlose Operation auf dem Thema kann eine Kaskade von Updates für Beobachter und ihre abhängigen Objekte verursachen Darüber hinaus führen Abhängigkeitskriterien, die nicht gut definiert oder beibehalten werden, normalerweise zu falschen Aktualisierungen, die schwer aufzuspüren sind.

Dieses Problem wird durch die Tatsache erschwert, dass das einfache Update-Protokoll keine Details darüber, was in dem Thema geändert hat, ohne zusätzliche Protokoll t o Um Beobachtern zu helfen, herauszufinden, was sich geändert hat, können sie gezwungen sein, hart daran zu arbeiten, die Veränderungen abzuleiten. " auch in der Umsetzung, sie sagen:

" Vermeidung von beobachterspezifischen Update-Protokolle: die Push-und Pull-Modelle. Implementierungen des Observer-Patterns lassen den Betreffenden häufig zusätzliche Informationen über die Änderung senden. Das Subjekt gibt diese Information als Argument an Update weiter. Die Menge der Informationen kann sehr unterschiedlich sein.

In einem Extrem, das wir das Push-Modell nennen, sendet das Subjekt den Beobachtern detaillierte Informationen über die Änderung, ob sie es wollen oder nicht. Das andere Extrem ist das Pull-Modell; das Subjekt sendet nichts als die minimalste Benachrichtigung, und Beobachter fragen danach explizit danach.

Das Pull-Modell betont die Ignoranz des Subjekts gegenüber seinen Beobachtern, während das Push-Modell annimmt, dass die Probanden etwas über die Bedürfnisse ihrer Beobachter wissen. Das Push-Modell könnte Beobachter weniger wiederverwendbar machen, weil Subject-Klassen Annahmen über Observer-Klassen treffen, die nicht immer wahr sind. Auf der anderen Seite kann das Pull-Modell ineffizient sein, weil Observer-Klassen feststellen müssen, was sich ohne Hilfe des Subjekts geändert hat. "

3

Der zweite Parameter zu update() ist vom Typ Object, so dass Sie alles geeignete übergeben können. Wie Sie bemerken, ist der Ansatz eher allgemein gehalten. Im Gegensatz dazu kann eine Klasse, die eine EventListenerList verwaltet, eine gewisse Laufzeittypsicherheit erhalten, wenn sie wie angegeben verwendet wird.