Observer-Muster (Beobachter)
Kurz: Beim Observer-Muster melden sich Beobachter bei einem Subjekt an und werden automatisch benachrichtigt, wenn sich dessen Zustand ändert – ohne dass das Subjekt sie genau kennen muss.
Genauer: Es entkoppelt Sender und Empfänger: Viele Objekte können auf dasselbe Ereignis reagieren. Man findet es in grafischen Oberflächen (Klick-Ereignisse), in Event-Systemen, in der reaktiven Programmierung (RxJS, Streams) und in Frameworks wie Vue oder React, die die Oberfläche bei Datenänderungen aktualisieren.
Im Detail
class Subjekt:
def __init__(self):
self._beobachter = []
def anmelden(self, funktion):
self._beobachter.append(funktion)
def melde(self, ereignis):
for b in self._beobachter:
b(ereignis)
wetter = Subjekt()
wetter.anmelden(lambda t: print("Display 1:", t))
wetter.anmelden(lambda t: print("Display 2:", t))
wetter.melde("22 Grad")
# Display 1: 22 Grad
# Display 2: 22 Gradconst emitter = new EventTarget();
emitter.addEventListener("temperatur", (e) => console.log("Wert:", e.detail));
emitter.dispatchEvent(new CustomEvent("temperatur", { detail: 22 }));Hinweise
- Beobachter sollten sich auch abmelden können, sonst entstehen Speicherlecks (Speicherleck).
- Reihenfolge und Fehler in einzelnen Beobachtern müssen bedacht werden.
- Beim Publish/Subscribe-Muster sitzt zwischen Sender und Empfängern ein Vermittler (Message Broker), sodass sie sich gar nicht mehr kennen.
Technisch sind Beobachter meist Callbacks. Das Muster ist ein Verhaltensmuster.
Siehe auch: Callback, Event Loop, Strategy-Muster, Schnittstelle