EMZETT.
Login

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 Grad
const 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