Zum Inhalt springen

Glossar · O

Observer

Entwurfsmuster, bei dem Objekte sich auf Events anderer Objekte registrieren. Der Beobachtete kennt seine Beobachter nicht.

Definition

Der Begriff Observer bezeichnet ein Entwurfsmuster in der Softwareentwicklung, bei dem ein Objekt, der Beobachter (Observer), sich bei einem anderen Objekt, dem Subjekt oder Beobachteten, registriert, um über dessen Zustandsänderungen informiert zu werden. Dieses Muster ermöglicht eine lose Kopplung zwischen den beteiligten Objekten, da der Beobachtete keine Kenntnis über die konkreten Beobachter besitzt. Stattdessen verwaltet das Subjekt eine Liste seiner Beobachter und benachrichtigt diese automatisch bei relevanten Ereignissen oder Zustandsänderungen.

Das Observer-Muster wird häufig eingesetzt, um die Kommunikation zwischen Objekten zu organisieren, ohne dass eine direkte Abhängigkeit entsteht. Es gehört zu den sogenannten Verhaltensmustern (Behavioral Patterns) und ist in der klassischen Literatur der Softwareentwicklung, beispielsweise im Buch „Design Patterns“ von Gamma, Helm, Johnson und Vlissides aus dem Jahr 1994, ausführlich beschrieben.

Hintergrund und Geschichte

Das Observer-Muster wurde im Rahmen der Arbeiten an Design Patterns in den frühen 1990er Jahren formalisiert, insbesondere durch das Buch „Design Patterns: Elements of Reusable Object-Oriented Software“ von Erich Gamma und Kollegen. Es entstand aus der Notwendigkeit, flexible und erweiterbare Architekturen zu schaffen, bei denen Objekte auf Ereignisse anderer Objekte reagieren können, ohne diese direkt zu kennen.

Vor der Etablierung des Observer-Musters wurden oft enge Kopplungen zwischen Objekten verwendet, was die Wartbarkeit und Erweiterbarkeit von Software erschwerte. Das Muster ermöglicht es, neue Beobachter hinzuzufügen oder bestehende zu entfernen, ohne das Subjekt zu verändern, was die Modularität und Wiederverwendbarkeit von Komponenten verbessert.

Funktionsweise

Das Observer-Muster basiert auf zwei Hauptrollen: dem Subjekt, das einen Zustand verwaltet, und den Beobachtern, die sich beim Subjekt registrieren, um Benachrichtigungen zu erhalten. Das Subjekt hält eine Liste der registrierten Beobachter und ruft deren Update-Methoden auf, sobald sich sein Zustand ändert.

Die Benachrichtigung erfolgt in der Regel synchron, das heißt, das Subjekt informiert die Beobachter unmittelbar nach der Zustandsänderung. Die Beobachter können daraufhin eigene Aktionen ausführen, beispielsweise eine Benutzeroberfläche aktualisieren oder weitere Berechnungen anstoßen. Die Entkopplung entsteht dadurch, dass das Subjekt nur die Schnittstelle der Beobachter kennt, nicht aber deren konkrete Implementierung.

Einsatzgebiete

Das Observer-Muster findet breite Anwendung in der Entwicklung von grafischen Benutzeroberflächen (GUIs), wo Änderungen im Modell automatisch an die Ansicht weitergegeben werden müssen. Beispiele sind Frameworks wie Java Swing oder das Model-View-Controller (MVC)-Architekturmuster, in denen das Observer-Muster eine zentrale Rolle spielt.

Darüber hinaus wird das Muster in ereignisgesteuerten Systemen, Publish-Subscribe-Architekturen und in der asynchronen Programmierung verwendet. Es eignet sich besonders für Szenarien, in denen mehrere Komponenten auf Änderungen eines gemeinsamen Zustands reagieren sollen, ohne dass eine direkte Kopplung besteht.

Abgrenzung zu verwandten Mustern

Das Observer-Muster wird häufig mit dem Publish-Subscribe-Muster verglichen, das ebenfalls der Entkopplung von Sendern und Empfängern dient. Während beim Observer-Muster die Beobachter direkt beim Subjekt registriert sind, erfolgt die Kommunikation im Publish-Subscribe-Modell über einen Vermittler (Broker), der Nachrichten verteilt.

Ein weiterer verwandter Begriff ist das Event-Listener-Pattern, das in vielen Programmiersprachen und Frameworks implementiert ist. Es basiert auf denselben Prinzipien wie das Observer-Muster, ist jedoch oft stärker auf die Verarbeitung von Ereignissen spezialisiert und bietet zusätzliche Mechanismen zur Event-Verwaltung.