Beobachter-Muster (Observer)
Einführung
Du nutzt eine Wetter-App.
In dem Moment, in dem sich die Wetterdaten ändern, aktualisieren sich sofort die Anzeige in der App, das Widget auf deinem Startbildschirm und eine Push-Nachricht warnt dich vor einem Unwetter. Du musst nichts manuell neu laden – alles passiert automatisch.

Genau dieses Problem – mehrere voneinander abhängige Darstellungen aktuell zu halten, sobald sich Daten ändern – löst das Observer-Pattern. Du lernst jetzt, wie es funktioniert, welche Vorteile es bietet und wie du es in Java umsetzen kannst.
Lernziele
Nach der Bearbeitung der Einheit zum Observer-Pattern kannst du:
- Das Observer-Pattern erklären – Du verstehst die Rollen von Subject und Observer, den Ablauf der Benachrichtigung und den Nutzen der losen Kopplung.
- Ein Java-Beispiel nachvollziehen – Du kannst die Implementierung eines Observer-Systems (Interface, Subject, Observer-Implementierungen, Anwendung) Schritt für Schritt erklären.
- Vor- und Nachteile beurteilen – Du kannst Stärken wie Konsistenz und Flexibilität sowie Schwächen wie Performanceprobleme oder Memory Leaks analysieren.
- Typische Fehler vermeiden – Du erkennst Risiken wie vergessene Abmeldungen, Endlosschleifen oder NullPointer-Probleme und weißt, wie du sie sicher umgehst.
Überleitung
Das Observer-Pattern (Beobachter-Muster) löst die synchrone Aktualisierung mehrerer abhängiger Komponenten, sobald sich der Zustand eines Objekts ändert.

Aber warum brauchen wir einen Observer?
Warum ein Observer?
Stell dir eine Wetterstations-App vor. Wetterdaten werden auf verschiedene Arten dargestellt:
- Aktuelle Werte als Zahlen in einer Tabelle
- Darstellung als grafisches Diagramm
- Warnungen als Push-Nachricht auf dem Smartphone
Sobald sich Wetterdaten ändern, müssen alle Anzeigen zeitgleich aktualisiert werden. Ohne Observer-Pattern müssten die Anzeigen ständig aktiv nachfragen (Polling):
“Hat sich etwas geändert?”
Das ist ineffizient und verschwendet Rechenleistung.
Ziel: Automatische, einheitliche Benachrichtigung aller betroffenen Anzeigen, sobald neue Daten vorliegen.
Das Observer-Pattern
Das Observer-Pattern organisiert eine lose Kopplung zwischen Datenquelle und abhängigen Darstellungen. Die Datenquelle informiert Abonnenten über Änderungen, ohne deren interne Logik zu kennen.
Newsletter-Analogie:
- Die Wetterstation ist der Herausgeber (Subject).
- Die verschiedenen Anzeigen sind die Abonnenten (Observer).
- Sobald neue Daten vorliegen, informiert die Wetterstation alle Abonnenten automatisch.
- Das Subject weiß nicht, wie jeder Observer die Information nutzt – es meldet nur die Änderung.
Funktionsweise und Bausteine
Hauptkomponenten
Subject (Beobachtetes Objekt):
- Verwaltet eine Liste aller Observer.
- Bietet Methoden zum Anmelden und Abmelden.
- Benachrichtigt alle Observer bei Zustandsänderungen.
Observer (Beobachter):
- Implementieren eine einheitliche Schnittstelle (Interface).
- Besitzen eine
update()-Methode, die bei Änderungen aufgerufen wird. - Reagieren eigenständig auf die Benachrichtigung (z. B. Anzeige aktualisieren, Push senden).
Ablauf in vier Schritten
- Registrierung: Observer melden sich beim Subject an.
- Zustandsänderung: Das Subject ändert seinen Zustand.
- Benachrichtigung: Das Subject informiert alle registrierten Observer.
- Reaktion: Jeder Observer verarbeitet das Update entsprechend seiner Aufgabe.
Praktisches Beispiel: Newsletter-System in Java
Im Beispiel repräsentiert der Newsletter das Subject; Smartphone-App und E-Mail-Client sind Observer.
Observer-Interface
// Das Observer-Interface definiert eine einheitliche Methode,
// die alle Beobachter implementieren müssen.
public interface Observer {
void update(String nachricht);
}Erklärung des Codes
Dieser Code definiert ein interface (eine Schnittstelle) namens Observer (Beobachter).
public interface Observer: Dies ist ein Vertrag, kein konkretes Objekt. Er legt fest, was eine Klasse können muss, um alsObserverzu gelten.void update(String nachricht);: Dies ist die einzige Methode im Vertrag. Sie ist abstrakt (hat keinen Code-Körper).- Zweck: Jede Klasse, die diesen Vertrag “unterschreibt” (mittels
implements Observer), wird von Java gezwungen, eineupdate-Methode zu implementieren. Das stellt sicher, dass ein “Subjekt” (ein Sender) jeden seiner Beobachter benachrichtigen kann, indem es einfach bei allen dieupdate-Methode aufruft.
Praktisches Beispiel: Newsletter-System in Java
Subject (Newsletter-Herausgeber)
import java.util.ArrayList;
import java.util.List;
public class Newsletter {
// Liste der angemeldeten Observer
private List<Observer> abonnenten = new ArrayList<>();
private String aktuelleNachricht;
// Observer anmelden
public void abonnentenHinzufuegen(Observer observer) {
abonnenten.add(observer);
}
// Observer abmelden
public void abonnentenEntfernen(Observer observer) {
abonnenten.remove(observer);
}
// Alle Observer benachrichtigen
public void benachrichtigen() {
for (Observer observer : abonnenten) {
observer.update(aktuelleNachricht);
}
}
// Neue Nachricht veröffentlichen
public void nachrichtVeroeffentlichen(String nachricht) {
this.aktuelleNachricht = nachricht;
benachrichtigen();
}
}Erklärung des Codes
Dieser Code zeigt die “Subjekt”-Seite (auch “Publisher” oder “Sender” genannt) des Observer-Musters. Die Newsletter-Klasse ist das Subjekt, das von anderen Objekten (“Observern”) beobachtet wird.
-
private List<Observer> abonnenten: Dies ist die Liste der Beobachter. DieNewsletter-Klasse speichert hier alle Objekte (Observer), die benachrichtigt werden wollen. Sie ist alsList<Observer>typisiert, was bedeutet, dass sie jedes Objekt aufnehmen kann, das denObserver-Vertrag (das Interface) erfüllt. -
abonnentenHinzufuegen/abonnentenEntfernen: Diese Methoden erlauben es Objekten, sich an- und abzumelden. Sie fügen den Beobachter zur Liste hinzu oder entfernen ihn daraus. -
nachrichtVeroeffentlichen(String nachricht): Dies ist die Aktion, die das Ereignis auslöst.- Zuerst wird die
aktuelleNachrichtgespeichert. - Dann ruft sie
benachrichtigen()auf.
- Zuerst wird die
-
benachrichtigen(): Dies ist das Kernstück des Musters.- Die Methode geht die gesamte Liste der
abonnentendurch (mit einerfor-Schleife). - Für jeden einzelnen Abonnenten in der Liste ruft sie dessen
update(aktuelleNachricht)-Methode auf. - Der
Newsletter(Subjekt) weiß nicht, was die Abonnenten tun; er weiß nur, dass er ihreupdate-Methode aufrufen kann (dank desObserver-Vertrags).
- Die Methode geht die gesamte Liste der
Praktisches Beispiel: Newsletter-System in Java
Observer-Implementierungen
// Smartphone-App als Observer
public class SmartphoneApp implements Observer {
private String name;
public SmartphoneApp(String name) {
this.name = name;
}
@Override
public void update(String nachricht) {
System.out.println(name + " erhält Push-Nachricht: " + nachricht);
}
}
// E-Mail-Client als Observer
public class EmailClient implements Observer {
private String emailAdresse;
public EmailClient(String emailAdresse) {
this.emailAdresse = emailAdresse;
}
@Override
public void update(String nachricht) {
System.out.println("E-Mail an " + emailAdresse + ": " + nachricht);
}
}Erklärung des Codes
Dieser Code zeigt die konkreten Beobachter-Klassen (“Observer”). Dies sind die Objekte, die sich beim Newsletter (dem “Subjekt”) anmelden, um Benachrichtigungen zu erhalten.
implements Observer: SowohlSmartphoneAppals auchEmailClient“unterschreiben” denObserver-Vertrag (das Interface).@Override public void update(String nachricht): Weil sie den Vertrag unterschrieben haben, müssen sie dieupdate-Methode implementieren.- Spezifisches Verhalten: Hier zeigt sich die Stärke des Musters:
- Die
SmartphoneAppreagiert auf dasupdate, indem sie eine Push-Nachricht simuliert (System.out.println(...)). - Der
EmailClientreagiert, indem er eine E-Mail simuliert.
- Die
Beide Klassen erfüllen denselben Vertrag (sie haben eine update-Methode), reagieren aber auf ihre eigene, spezifische Weise auf dieselbe Benachrichtigung. Dem Newsletter (dem Sender) ist dieser Unterschied egal; er ruft bei beiden nur update() auf.
Praktisches Beispiel: Newsletter-System in Java
Anwendung (Demo)
public class NewsletterBeispiel {
public static void main(String[] args) {
// Newsletter erstellen (Subject)
Newsletter techNews = new Newsletter();
// Observer-Objekte erstellen
SmartphoneApp handy1 = new SmartphoneApp("Max' iPhone");
SmartphoneApp handy2 = new SmartphoneApp("Annas Android");
EmailClient email = new EmailClient("kunde@example.com");
// Observer anmelden
techNews.abonnentenHinzufuegen(handy1);
techNews.abonnentenHinzufuegen(handy2);
techNews.abonnentenHinzufuegen(email);
// Nachricht veröffentlichen → alle Observer werden benachrichtigt
techNews.nachrichtVeroeffentlichen("Neues Smartphone ist verfügbar!");
// Einen Observer abmelden
techNews.abonnentenEntfernen(handy2);
// Neue Nachricht veröffentlichen → nur noch die verbleibenden Observer reagieren
techNews.nachrichtVeroeffentlichen("50% Rabatt nur heute!");
}
}Erklärung des Codes
Dieser Code (NewsletterBeispiel) ist das Hauptprogramm, das das Observer-Muster in Aktion zeigt (unter Verwendung der zuvor definierten Klassen).
-
Erstellung (Setup):
- Es wird ein
Newsletter(techNews) erstellt. Dies ist das Subjekt (der Sender). - Es werden drei Observer (Empfänger) erstellt: zwei
SmartphoneApp-Objekte (handy1,handy2) und einEmailClient(email).
- Es wird ein
-
Anmeldung (Subscription):
- Alle drei Observer werden beim
techNews-Subjekt angemeldet, indem sie derabonnenten-Liste hinzugefügt werden (abonnentenHinzufuegen).
- Alle drei Observer werden beim
-
Erste Benachrichtigung:
- Das Subjekt veröffentlicht eine Nachricht (
nachrichtVeroeffentlichen). - Intern ruft
techNewsseinebenachrichtigen()-Methode auf, geht seine Liste durch und ruftupdate()beihandy1,handy2undemailauf.
- Das Subjekt veröffentlicht eine Nachricht (
-
Abmeldung (Unsubscription):
handy2wird aus der Liste der Abonnenten entfernt (abonnentenEntfernen).
-
Zweite Benachrichtigung:
- Das Subjekt veröffentlicht eine zweite Nachricht.
techNewsruftbenachrichtigen()auf, geht seine Liste durch und ruftupdate()auf. Dahandy2nicht mehr in der Liste ist, werden nur nochhandy1undemailbenachrichtigt.
Erwartete Ausgabe
Max' iPhone erhält Push-Nachricht: Neues Smartphone ist verfügbar!
Annas Android erhält Push-Nachricht: Neues Smartphone ist verfügbar!
E-Mail an kunde@example.com: Neues Smartphone ist verfügbar!
Max' iPhone erhält Push-Nachricht: 50% Rabatt nur heute!
Warum ist das Observer-Pattern nützlich?
Das Observer-Pattern ist in der Softwareentwicklung weit verbreitet, weil es Abhängigkeiten zwischen Objekten strukturiert und flexibel macht.
Änderungen werden automatisch an alle interessierten Stellen weitergegeben, ohne dass Objekte stark miteinander gekoppelt sind.
Vorteile im Alltag der Softwareentwicklung
1. Lose Kopplung
Das Observer-Pattern sorgt dafür, dass ein Subject seine Observer nur über ein Interface kennt. Dadurch entsteht eine lose Kopplung, die Änderungen vereinfacht.
- Neue Observer können zur Laufzeit hinzugefügt oder entfernt werden, ohne dass das Subject verändert werden muss.
- Änderungen an einem Observer beeinflussen keine anderen Observer.
2. Flexibilität
Durch seine Struktur bietet das Pattern hohe Flexibilität. Es erlaubt es, Abhängigkeiten während der Laufzeit anzupassen.
- Ein Subject kann beliebig viele Observer verwalten.
- Ein Observer kann mehrere Subjects gleichzeitig beobachten.
- Observer lassen sich dynamisch an- und abmelden.
3. Wiederverwendbarkeit
Ein weiterer Vorteil ist die Wiederverwendbarkeit von Observern und Subjects.
- Observer können für unterschiedliche Subjects genutzt werden.
- Dasselbe Subject kann in verschiedenen Anwendungskontexten eingesetzt werden.
Reale Anwendungsbeispiele
Um die Vorteile greifbar zu machen, betrachten wir typische Szenarien, in denen das Observer-Pattern genutzt wird.
Grafische Benutzeroberflächen (GUI)
// Beispiel: Button-Click
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Button wurde geklickt!");
}
});Erklärung des Codes
Dieser Java-Code ist ein klassisches Beispiel für das Observer-Muster in der Praxis (Event-Handling) und verwendet eine anonyme innere Klasse.
button.addActionListener(...): Dies ist die Methode, mit der dasbutton-Objekt (das “Subjekt” oder der “Publisher”) angewiesen wird, einen neuen “Beobachter” (Listener) zu seiner Liste hinzuzufügen.new ActionListener() { ... }: Dies ist der Beobachter (Observer). Anstatt eine separate, benannte Klasse zu erstellen (z.B.class MeinKlickListener implements ActionListener), wird die Klasse direkt hier “inline” und ohne Namen definiert. Dies nennt man eine anonyme innere Klasse.public void actionPerformed(ActionEvent e): Dies ist die Implementierung derupdate()-Methode aus dem Observer-Muster (hier heißt sieactionPerformed, wie vomActionListener-Interface/Vertrag vorgeschrieben).- Ablauf: Wenn der
buttongeklickt wird (das Ereignis eintritt), geht er seine Liste aller registriertenActionListenerdurch und ruft bei jedem dieactionPerformed-Methode auf. Der Code in dieser Methode wird dann ausgeführt.
Reale Anwendungsbeispiele
Model-View-Controller (MVC)
Das Observer-Pattern ist ein Kernbestandteil von MVC-Architekturen.
- Model (Daten) = Subject
- Views (Anzeigen) = Observer
Wenn sich Daten im Model ändern, aktualisieren sich alle Views automatisch.
Reale Anwendungsbeispiele
Event-Systeme
Auch Event-Systeme setzen stark auf Observer.
- Benutzerinteraktionen (Mausklicks, Tastatureingaben)
- Systemereignisse (Datei gespeichert, Netzwerk getrennt)
Push vs. Pull – Zwei Benachrichtigungsarten
Observer können auf zwei verschiedene Arten informiert werden: Push oder Pull. Beide Ansätze haben eigene Vor- und Nachteile.
Push-Methode
public interface Observer {
void update(String nachricht, int prioritaet, Date zeitstempel);
}Erklärung des Codes
Dieser Code definiert ein interface (eine Schnittstelle) namens Observer.
- Was ist ein Interface? Ein
interfaceist ein Vertrag. Es legt fest, welche Methoden (Funktionen) eine Klasse implementieren (bereitstellen) muss, wenn sie diesen Vertrag “unterschreibt” (implements Observer). - Die
update-Methode: Im Vergleich zum vorherigenObserver-Beispiel ist dieser Vertrag spezifischer. Jede Klasse, dieObserversein will, muss eineupdate-Methode haben, die drei Argumente in genau dieser Reihenfolge entgegennimmt:String nachricht: Die eigentliche Nachricht.int prioritaet: Eine Zahl zur Angabe der Wichtigkeit.Date zeitstempel: Ein Objekt, das angibt, wann das Ereignis eingetreten ist.
- Vorteil: Observer erhalten sofort alle nötigen Informationen.
- Nachteil: Observer können mit unnötigen Daten überlastet werden.
Push vs. Pull – Zwei Benachrichtigungsarten
Pull-Methode
public interface Observer {
void update(Newsletter newsletter);
}
// Im Observer:
public void update(Newsletter newsletter) {
String nachricht = newsletter.getAktuelleNachricht();
// Verarbeitung...
}Erklärung des Codes
Dieser Code zeigt eine alternative Implementierung des Observer-Musters, die als “Pull-Methode” (Ziehen) bezeichnet wird.
-
Das Interface (
Observer):void update(Newsletter newsletter): Dies ist der entscheidende Unterschied zu den vorherigen Beispielen. Dieupdate-Methode erhält nicht die spezifischen Daten (wie die Nachricht), sondern eine Referenz auf das Subjekt (denNewsletter) selbst, das die Änderung ausgelöst hat.
-
Die Implementierung (Im Observer):
String nachricht = newsletter.getAktuelleNachricht();: Wenn der Observer benachrichtigt wird, “zieht” (pullt) er sich aktiv die Daten, die er benötigt (hiergetAktuelleNachricht()), direkt von demNewsletter-Objekt, das ihm übergeben wurde.
Vorteil: Der Observer kann sich genau die Daten holen, die er braucht.
Gegenstück (Push-Modell): Das “Push-Modell” (z.B. update(String nachricht)) “drückt” dem Observer die Daten auf, egal ob er sie alle benötigt.
- Vorteil: Observer entscheiden selbst, welche Informationen sie abrufen.
- Nachteil: Zusätzliche Methodenaufrufe sind nötig.
Nachteile
Trotz der zahlreichen Vorteile gibt es auch Herausforderungen:
- Performance: Viele Observer können Benachrichtigungen verlangsamen.
- Komplexität: In großen Systemen kann die Observer-Kette schwer nachzuvollziehen sein.
- Memory Leaks: Wenn Observer nicht korrekt abgemeldet werden, bleiben Referenzen bestehen.
- Fehleranfälligkeit: Endlosschleifen durch gegenseitige Benachrichtigungen sind möglich.
Häufige Fehler und wie man sie vermeidet
In der Praxis treten bei der Verwendung des Observer-Patterns häufig wiederkehrende Fehler auf.
Fehler 1: Observer vergessen abzumelden
// Falsch
Observer observer = new EmailClient("test@example.com");
newsletter.abonnentenHinzufuegen(observer);
// observer wird nie abgemeldet → Memory Leak!
// Richtig
Observer observer = new EmailClient("test@example.com");
newsletter.abonnentenHinzufuegen(observer);
// ... Verwendung ...
newsletter.abonnentenEntfernen(observer); // Wichtig!Erklärung des Codes
Dieser Code demonstriert ein häufiges Problem bei der Verwendung des Observer-Musters: Memory Leaks (Speicherlecks).
-
Das Problem (Falsch):
- Wenn ein
Observer(hierEmailClient) bei einem Subjekt (newsletter) angemeldet wird, speichert das Subjekt eine Referenz (einen Verweis) auf den Observer in seiner internenabonnenten-Liste. - Wenn der Observer nie abgemeldet wird (
abonnentenEntfernen), hält dernewsletterdiese Referenz für immer. - Selbst wenn der
Observerim Rest des Programms nicht mehr benötigt wird, kann der Garbage Collector (Javas automatische Speicherbereinigung) ihn nicht löschen, da dernewsletterja noch auf ihn verweist. - Das Objekt “lebt” als “Zombie” im Speicher weiter und verbraucht unnötig Ressourcen. Das ist ein Memory Leak.
- Wenn ein
-
Die Lösung (Richtig):
- Es ist entscheidend, dass ein Observer, der nicht mehr benötigt wird (z. B. weil das Fenster geschlossen wird oder das Objekt zerstört wird), aktiv vom Subjekt abgemeldet wird.
- Der Aufruf
newsletter.abonnentenEntfernen(observer)löscht die Referenz aus der Liste desnewsletter. - Sobald keine Referenzen mehr auf das
observer-Objekt zeigen, kann der Garbage Collector es entfernen und den Speicher freigeben.
Häufige Fehler und wie man sie vermeidet
Fehler 2: Endlose Benachrichtigungsschleifen
// Gefährlich: Observer ändert das Subject im update()
public void update(String nachricht) {
subject.setWert(neuerWert); // Kann Endlosschleife verursachen!
}Erklärung des Codes
Dieser Code zeigt eine sehr gefährliche Implementierung eines Observers, die zu einer Endlosschleife (oder einem StackOverflowError) führen kann.
Das Problem (der Kreislauf):
- Das Subjekt (
subject) ändert seinen Wert (z.B. durchsetWert(...)). - Das Subjekt startet daraufhin den Benachrichtigungs-Prozess und ruft die
update()-Methode bei all seinen Observern auf. - Einer dieser Observer empfängt das
update()(diese Funktion hier wird ausgeführt). - Problemzeile: Innerhalb der
update()-Funktion ändert der Observer nun erneut den Wert des Subjekts (subject.setWert(neuerWert)). - Dieser Aufruf löst Schritt 1 erneut aus: Das Subjekt stellt eine neue Änderung fest.
- Das Subjekt startet den Benachrichtigungs-Prozess (Schritt 2).
- Es ruft
update()auf (Schritt 3)… und so weiter.
Der Observer löst die Benachrichtigung aus, die ihn selbst aufruft, was wiederum die Benachrichtigung auslöst.
Häufige Fehler und wie man sie vermeidet
Fehler 3: NullPointer beim Benachrichtigen
// Sicher programmieren
public void benachrichtigen() {
for (Observer observer : abonnenten) {
if (observer != null) { // Null-Check wichtig!
observer.update(aktuelleNachricht);
}
}
}Erklärung des Codes
Dieser Code zeigt eine robuste (sichere) Implementierung der benachrichtigen-Methode aus dem Observer-Muster.
for (Observer observer : abonnenten): Die Schleife iteriert wie gewohnt durch alle angemeldeten Beobachter (abonnenten).if (observer != null): Dies ist der entscheidende Punkt. Es ist eine Sicherheitsüberprüfung.- Das Problem (Warum?): Es ist theoretisch möglich, dass die
abonnenten-Liste einennull-Wert (einen “leeren” Eintrag) enthält. Dies kann z.B. passieren, wenn ein Observer an anderer Stelle im Code unsachgemäß abgemeldet oder hinzugefügt wurde. - Die Konsequenz: Ohne diesen Check würde der Versuch,
observer.update(...)aufzurufen, wennobservernullist, zu einerNullPointerExceptionführen und das Programm abstürzen lassen. - Die Lösung: Der
if-Block stellt sicher, dass dieupdate-Methode nur aufgerufen wird, wenn derobserverauch wirklich ein existierendes Objekt ist. Das verhindert einen Absturz.
Zusammenfassung
Zusammenfassung:
Grundidee und Funktionsweise
Das Observer-Pattern stellt eine lose Kopplung zwischen einem Subject (Beobachteten Objekt) und mehreren Observern (Beobachtern) her. Änderungen im Subject werden automatisch an alle registrierten Observer weitergeleitet.
- Vermeidet ineffizientes Polling, da Observer aktiv informiert werden.
- Standardisierter Ablauf: Registrierung → Zustandsänderung → Benachrichtigung → Reaktion.
- Hauptkomponenten: Subject verwaltet Observer-Liste, Observer implementieren
update().
Praktisches Beispiel (Newsletter-System in Java)
Ein Newsletter ist das Subject, Smartphone-Apps und E-Mail-Clients sind Observer.
- Observer melden sich an, um Nachrichten zu empfangen.
- Bei neuen Nachrichten benachrichtigt das Subject alle registrierten Observer.
- Observer reagieren jeweils auf ihre eigene Weise (z. B. Push-Nachricht, E-Mail-Ausgabe).
- Java-Implementierung zeigt die einzelnen Schritte: Interface, Subject, Observer-Klassen und eine Demo-Anwendung.
Vorteile in der Softwareentwicklung
Das Pattern bietet klare Mehrwerte für den Alltag in der Programmierung.
- Lose Kopplung: Subject kennt Observer nur über ein Interface.
- Flexibilität: Observer können zur Laufzeit hinzugefügt oder entfernt werden.
- Wiederverwendbarkeit: Observer können mit verschiedenen Subjects arbeiten.
- Reale Einsatzgebiete: GUIs (Event-Listener), MVC-Architekturen, Event-Systeme.
Push- vs. Pull-Varianten
Es gibt zwei Benachrichtigungsarten, die sich in ihrer Datenweitergabe unterscheiden.
- Push: Subject sendet alle relevanten Daten direkt mit der Benachrichtigung.
- Pull: Subject informiert nur über eine Änderung, Observer holen sich die Daten selbst.
- Beide Ansätze haben Vor- und Nachteile (Push = effizient, aber ggf. unnötige Daten; Pull = flexibel, aber mehr Methodenaufrufe nötig).
Vor- und Nachteile des Observer-Patterns
- Vorteile: Synchronität aller Observer, hohe Flexibilität, einfache Erweiterung, lose Kopplung.
- Nachteile: Performanceprobleme bei vielen Observern, komplexere Nachvollziehbarkeit, Gefahr von Memory Leaks und Endlosschleifen.
Häufige Fehler und ihre Vermeidung
- Observer nicht abgemeldet → Memory Leak.
- Observer ändern Subject im
update()→ Endlosschleife. - Fehlende Null-Checks → mögliche NullPointerExceptions.
- Lösung: sauberes Abmelden, klare Trennung von Zuständigkeiten, sichere Programmierung mit Checks.