Benjamin Dietz
 
  Home
  Lebenslauf
  Studium
  Zeugnisse
  Qualifikationen
  Publikationen
  Projekte
  PHP Stuff
  Kontakt
  Impressum
   

Design Pattern: Observer

Entwurfsmuster sind bewährte Lösungsansätze zu immer wiederkehrende Entwurfsprobleme. Diese Muster lassen sich in drei unterschiedliche Haupttypen unterteilen: Erzeugungsmuster, Strukturmuster und Verhaltensmuster.

Das Beobachter Muster gehört zum Type der Verhaltensmuster und definiert eine 1-zu-n Abhängigkeit zwischen Objekten.

Es kann immer dann angewendet werden, wenn mehrere Objekte auf ein konkretes Subjekt zugreifen und bei Veränderungen an diesem Subjekt benachrichtigt werden sollen.
Für das Muster lassen sich zwei Hauptelemente identifizieren, ein Subjekt und seine jeweiligen Observer.
Das Subjekt stellt eine Schnittstelle zur Verfügung, über die sich Beobachter An- und Abmelden können. Die angemeldeten Beobachter werden innerhalb des Subjektes gespeichert und bei Veränderungen informiert. Die Beobachter können nach einer Benachrichtigung den aktuellen Zustand des Subjektes erfragen und diesen für sich selbst aktualisieren.

Die Aktualisierungskommunikation kann entweder Push- oder Pullbasiert erfolgen. Bei der Pull basierten Variante erhält der Observer die Möglichkeit die benötigten Informationen selbst vom Subjekt zu erfragen.
Die Push Variante übergibt bei der Aktualisierung alle vorhandenen Informationen, egal ob diese vom Beobachter benötigt werden. Für den Fall dass ein Beobachter eine Veränderung an einem Subjekt anstößt, wartet dieser mit dem Setzen seines internen Zustands, bis er vom Subjekt benachrichtigt wird.

Für die Implementierung des Musters bietet Java standardmäßig Funktionalität, die eine einfache Umsetzung ermöglicht. Für komplexe Anforderungen ist jedoch eine eigene Implementierung vorzuziehen. Komplexe Änderungen an einem Subjekt können unerwartete Veränderungen verursachen. Somit können Beobachter unnötig benachrichtigt werden, über Veränderungen, an denen sie überhaupt nicht interessiert sind. Ein Änderungsmanager, der als Vermittler zwischen Subjekt und Beobachter dient und als Singleton implementiert werden könnte, kann hierbei Abhilfe schaffen.

Eine Implementierung mit Hilfe der aspektorientierten Erweiterung "AspectJ" ermöglicht jedoch ebenfalls eine sehr flexible und modulare Umsetzung des Beobachtermusters. Ein konkreter Beobachter Aspekt erweitert die normalen Klassen, die nur ihre Kernfunktionalität implementieren, um die zusätzliche Funktionalität des Entwurfsmusters. Der Quellcode bleibt so übersichtlich und es kann innerhalb des Beobachter Aspektes sehr flexibel auf Veränderungen des Subjektes reagiert werden.

Downloads:
  • Seminararbeit zum Observer Pattern
  • Präsentation zur Seminararbeit
  • Code Beispiele in (Java und AspectJ)
 
Valid HTML 4.01!