Klassifizierung |
objektbasiertes Verhaltensmuster
|
| |
Zweck |
Definiere 1-zu-n Abhängigkeit zwischen Objekten
und benachrichtige alle Objekte, wenn sich der Zustand
ändert.
Kommunikation zwischen lose gekoppelten Objekten.
Koppelung kann dynamisch hergestellt und aufgelöst werden.
|
| |
Alias |
Observer
|
| |
Motivation |
|
|
Trennung der zu verarbeitenden Daten von der
externen Darstellung.
|
|
In einer MVC-Architektur werden das Modell und die Präsentation (view)
getrennt
|
|
Konsequenzen:
|
|
das Modell bleibt frei von Ausgabe-Anweisungen
|
|
die Präsentation kann dynamisch ausgetauscht werden
Mit unterschiedlichen Standardbausteinen können die
internen Daten auch mehrfach und unterschiedlich angezeigt werden.
|
| |
Beispiel |
eine Uhr besitzt einen internen Zustand
kann aber auf viele Arten angezeigt werden: Text, analog, ...
|
| |
Anwendbarkeit |
|
|
wenn die Änderung eines Objekts die
Änderung beliebig vieler anderer Objekte verlangt
|
|
wenn der Sender nicht wissen soll, wer die Empfänger
sein sollen
|
|
typisch:
Erzeugung der internen und der Präsentationsobjekte
und die Verkettung dieser Objekte
bei der Programminitialisierung
|
|
|
| |
Struktur |
Strukturdiagramm
|
| |
Teilnehmer |
|
Subjekt |
kennt Beobachter
kann Beobachter registrieren und löschen
|
Beobachter |
kennt beobachtetes Objekt,
definiert Kommando(s) zum Aktualisieren
|
KonkretesSubjekt |
besitzt Zustand und lesende Zugriffsfunktionen
|
KonkreterBeobachter |
besitzt eine (teilweise) Kopie des Zustands
muss diese Kopie konsistent halten
|
| |
Konsequenzen |
|
|
Subjekte und Beobachter können unabhängig
voneinander variiert werden
|
|
beide Klassenhierarchien über Subjekte und Beobachter
können unabhängig erweitert werden
|
|
broadcast-Funktion:
einer benachrichtigt viele Beobachter,
diese entscheiden selbständig über die Reaktion
|
|
es wird im Protokoll aktualisiere()
nicht festgelegt, was sich geändert hat
dies muss der Beobachter erfragen.
|
|
Vorsicht bei Beobachtern, die gleichzeitig als controller
arbeiten:
Gefahr von Endlosschleifen
textwidget --> scrollbar --> textwidget --> ...
|
| |
Implementierung |
|
|
Parametrisierung der aktualisiere()-Operation
erleichtert die Erkennung, was sich geändert hat
macht die Schnittstelle aber nicht mehr so universell einsetzbar
|
| |
Beispiele |
|
| |
Bekannte Verwendungen |
|
|
in vielen Grafik-Bibliotheken zusammen mit dem
Befehlsmuster zur Trennung von Verarbeitung und Ausgabe
eingesetzt
|
|
in Tcl/Tk: das bind-Kommando
|
|
im JDK: Befehlsmuster anstatt Beobachter
|
| |
verwandte Muster |
|
|
speichert für jedes beobachtende Objekt
eine Methode zu Benachrichtigung.
|
|
Unterschied zu Beobachter:
die Verkettung ist nur unidirektional
alle Information über Zustandsänderungen werden über
Parameter versendet.
|
| |