Software-Entwurfsmuster

Observer

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 Programm­beispiel aus [FF 04] spielt eine Wetter­station die Rolle des Modells. Zwei verschiedene Displays melden sich bei der Wetter­station als Observer an. Wenn die Wetter­station eine neue Temperatur misst, benachrichtigt sie die Observer, und diese zeigen die neue Temperatur an.

Im Haupt­programm werden die entsprechenden Objekte angelegt; anschließend werden drei Temperatur­messungen simuliert.

public class WeatherOffice
{
    public static void main(String[] args)
    {
        // Model
        WeatherStation weatherstation=new WeatherStation();

        // Views
        new CurrentDisplay(weatherstation);
        new StatisticsDisplay(weatherstation);
  
        // Controller
        // Temperaturmessungen simulieren
        weatherstation.setMeasurement(22);
        weatherstation.setMeasurement(25);
        weatherstation.setMeasurement(19);
    }
}

 

Die Wetter­station stellt das Modell dar. Sie wird von der abstrakten Klasse Observable abgeleitet. Mithilfe der Methode setMeasurement wird eine Temperatur­messung simuliert. Durch Aufruf der Methode notifyObservers wird den Observern die neue Temperatur mitgeteilt.

import java.util.Observable;

// Model
public class WeatherStation extends Observable

    public void setMeasurement(double temperature)
    {
        setChanged();
        notifyObservers(temperature);
    }
}

 

Die Klasse CurrentDisplay soll die aktuelle Temperatur anzeigen. Hierzu meldet sie sich im Konstruktor als Observer bei der Wetter­station an. Ein Aufruf von notifyObservers der Wetter­station bewirkt bei allen Observern einen Aufruf der Methode update. In der Klasse CurrentDisplay gibt die Methode update die aktuelle Temperatur aus.

import java.util.Observable;
import java.util.Observer;

// View
public class CurrentDisplay implements Observer
{  
    public CurrentDisplay(Observable weatherstation)
    {
        // bei der Wetterstation als Observer anmelden
        weatherstation.addObserver(this);
    }

    // wird von notifyObservers aufgerufen
    public void update(Observable o, Object t)
    {
        System.out.println("Current temperature: "+t);
    }
}

 

Die Klasse StatisticsDisplay soll die Durchschnitts­temperatur anzeigen. Sie meldet sich ebenfalls als Observer an. In der Klasse StatisticsDisplay gibt die Methode update die Durchschnitts­temperatur aus.

import java.util.Observable;
import java.util.Observer;

// View
public class StatisticsDisplay implements Observer
{
    private int measurecount=0;
    private double temperaturesum=0;
 
    public StatisticsDisplay(Observable weatherstation)
    {
        // bei der Wetterstation als Observer anmelden
        weatherstation.addObserver(this);
    }

    // wird von notifyObservers aufgerufen
    public void update(Observable o, Object t)
    {
        // neue Durchschnittstemperatur berechnen und ausgeben
        measurecount++;
        temperaturesum+=(Double) t;
        System.out.println("Average temperature: "+temperaturesum/measurecount);
    }
}

Literatur

[FF 04]   E. Freeman, E. Freeman: Head First Design Patterns. O'Reilly (2004)

 

Weiter mit:   [up]

 


H.W. Lang   mail@hwlang.de   Impressum   Datenschutz
Created: 06.06.2010   Updated: 18.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden