Einsatz

Das Observer Pattern wird angewendet, wenn ein oder mehrere Objekte über eine Veränderung eines anderen Objektes informiert werden sollen, ohne das diese direkt gekoppelt sind.

Beispiele

  • Ein prominentes Beispiel ist die GUI-Ereignisbehandlung in Java. Der Programmteil, der die Logik auf ein Ereignis (z.B. Button wurde gedrückt) ausführt, wird von der grafischen Komponente losgelöst.

  • Einhalten des MVC-Konzeptes: Ein Anwender ändert die Daten eines Models durch Eingabe von Daten in einem Dialog. Die Daten des Models werden in einer Tabelle und in einer Grafik dargestellt. Hier können die einzelnen Bestandteile mit Hilfe des Observer Patterns getrennt werden.

Merkmale / Elemente

  • Schnitstellendefinition für beobachtbare Objekte (Interface, abstrakte Objekte)

  • Konkret beobachtbare Objekte.

  • Schnittstellendefinition der Beobachter.

  • Konkrete Beobachter.

Klassendiagramm

Das Observer-Pattern kann auf unterschiedliche Weise umgesetzt werden. Nachfolgend folgt ein Klassendiagramm des Observer-Patterns, wie es z.B. auch in der Java Swing/AWT Programmierung zum Einsatz kommt.

Klassendiagramm Observer Pattern

Beispielhafte Anwendung des Observer-Patterns

Nachfolgend soll das Observer-Pattern an einem Beispiel verdeutlicht werden. In diesem Beispiel kommen keine, für das Observer-Pattern, vorgefertigte Bestandteile des SDKs zum Einsatz. Als Basisklasse für den konkreten Beobachter kommt eine nicht abstrakte Basisklasse zum Einsatz, was im Gegensatz obigen Klassendiagramm steht und im nachfolgenden Klassendiagramm dargestellt wird.

Klassendiagramm Observer Pattern

Zunächst der Quelltext des Interfaces Bobachtend. Klassen, die dieses Interface implementieren, können sich bei Klassen, die vom Typ Beobachtbar sind, als beobachtend registrieren.

public interface Beobachtend {
  public void benachrichtigung();
}
itmapa.de - X2H V 0.20

Als nächstes folgt der Quelltext der Klasse Beobachtbar. Klassen, die diese Klasse erweitern, schaffen die Möglichkeit, das Klassen des Typs Beobachtend an- und abgemeldet werden können und bei entsprechenden Änderungen in der abgeleiteten Klassen darüber informiert werden.

import java.util.*;

public class Beobachtbar {
  private HashSet<Beobachtend> beobachtendSet;
  
  public Beobachtbar(){
    beobachtendSet = new HashSet<Beobachtend>();
  }
  
  public void anmelden(Beobachtend beobachtend){
    beobachtendSet.add(beobachtend);
  }
  
  public void abmelden(Beobachtend beobachtend){
    beobachtendSet.remove(beobachtend);
  }
  
  protected void benachrichtigen(){
    for (Beobachtend beobachtend : beobachtendSet){ 
      beobachtend.benachrichtigung();
    }
  }
}
itmapa.de - X2H V 0.20

Objekte der nachfolgenden Klasse KonkretBeobachtbar benachrichtigen alle registrierten Objekte des Typs Beobachtend bei entsprechender Veränderung. Benachrichtigt werden die registrierten Objekte, über die Methode benachrichtingung() der Vaterklasse Beobachtbar.

public class KonkretBeobachtbar extends Beobachtbar{
  public void doSomething(){
    // some internal action
  }  
  
  public void foo(){
    // some internal action
    benachrichtigen();
  }
}
itmapa.de - X2H V 0.20

Die nachfolgende Klasse KonkretBeobachtend implementiert das Interface Beobachtend und kann so sich bei einem Objekt des Typs Beobachtbar als beobachtend registrieren.

public class KonkretBeobachtend implements Beobachtend{

  public void benachrichtigung(){
    // some internal action
  }
  
  public void foo(){
    // some internal action
  }
}
itmapa.de - X2H V 0.20

Pattern Links @ itmapa.de

de.wikipedia.org
Observer (Beobachter)
http://de.wikipedia.org/wiki/Beobachter_(Entwurfsmuster)

Stefan Bünnig
http://wwwswt.informatik.uni-rostock.de
Beobachter
http://wwwswt.informatik.uni-rostock.de/deutsch/Infothek/Entwurfsmuster/patterns/Observer/index.html

theserverside.de
Singleton Pattern in Java
http://www.theserverside.de/singleton-pattern-in-java/

IT-ACADEMY.CC
Entwurfsmuster: Observer
http://www.it-academy.cc/article/1517/Entwurfsmuster:+Observer.html