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.
  | 
  |  |