Das Observer-Muster ist Teil des Model-View-Controller-Musters. Immer wenn das Modell (Model) sich ändert, muss die Darstellung des Modells, die Ansicht (View), aktualisiert werden. Es kann auch mehrere unterschiedliche Ansichten des Modells geben.
Mithilfe des Observer-Musters wird dies in folgender Weise realisiert. Die Ansichten (Views) melden sich beim Modell als Observer (Beobachter) an. Immer dann, wenn das Modell sich ändert, benachrichtigt es alle Observer, die sich angemeldet haben.
Hierzu wird das Modell von der abstrakten Klasse Observable aus dem Package java.util abgeleitet. Damit steht eine Methode addObserver zur Verfügung, mithilfe derer sich Observer anmelden können. Ein Objekt wird zum Observer, wenn es das Interface Observer des Packages java.util implementiert. Bei einer Änderung des Modells werden die Methoden setChanged und notifyObservers aufgerufen. Die Methode notifyObservers ruft bei allen Observern die Methode update auf, welche die Aktualisierung der Ansicht veranlasst.
In folgendem Programmbeispiel aus [FF 04] spielt eine Wetterstation die Rolle des Modells. Zwei verschiedene Displays melden sich bei der Wetterstation als Observer an. Wenn die Wetterstation eine neue Temperatur misst, benachrichtigt sie die Observer, und diese zeigen die neue Temperatur an.
Im Hauptprogramm werden die entsprechenden Objekte angelegt; anschließend werden drei Temperaturmessungen simuliert.
Die Wetterstation stellt das Modell dar. Sie wird von der abstrakten Klasse Observable abgeleitet. Mithilfe der Methode setMeasurement wird eine Temperaturmessung simuliert. Durch Aufruf der Methode notifyObservers wird den Observern die neue Temperatur mitgeteilt.
Die Klasse CurrentDisplay soll die aktuelle Temperatur anzeigen. Hierzu meldet sie sich im Konstruktor als Observer bei der Wetterstation an. Ein Aufruf von notifyObservers der Wetterstation bewirkt bei allen Observern einen Aufruf der Methode update. In der Klasse CurrentDisplay gibt die Methode update die aktuelle Temperatur aus.
Die Klasse StatisticsDisplay soll die Durchschnittstemperatur anzeigen. Sie meldet sich ebenfalls als Observer an. In der Klasse StatisticsDisplay gibt die Methode update die Durchschnittstemperatur aus.
[FF 04] E. Freeman, E. Freeman: Head First Design Patterns. O'Reilly (2004)
Weiter mit: [up]