EMZETT.
Login

Chain-of-Responsibility-Muster

Kurz: Eine Anfrage wandert durch eine Kette von Bearbeitern. Jeder entscheidet: selbst erledigen, ablehnen oder an den nächsten weitergeben. Sender und Empfänger kennen sich nicht.

Beispiel: Prüfungen bei einer Bestellung

class Pruefer:
    def __init__(self, naechster=None):
        self.naechster = naechster
    def pruefen(self, bestellung):
        fehler = self.eigene_pruefung(bestellung)
        if fehler:
            return fehler
        return self.naechster.pruefen(bestellung) if self.naechster else None
 
class Lager(Pruefer):
    def eigene_pruefung(self, b):
        return None if b["menge"] <= 5 else "nicht genug im Lager"
 
class Zahlung(Pruefer):
    def eigene_pruefung(self, b):
        return None if b["bezahlt"] else "nicht bezahlt"
 
kette = Lager(Zahlung())
print(kette.pruefen({"menge": 2, "bezahlt": False}))   # nicht bezahlt

Wo man es täglich sieht

  • Middleware in Webframeworks: Eine Anfrage läuft durch Anmeldung → Protokollierung → Ratenbegrenzung → eigentliche Funktion. Jede Stufe kann abbrechen.
  • Ereignisweitergabe in Oberflächen: Ein Klick wird an das Elternelement durchgereicht.
  • Support-Stufen: Level 1, 2, 3.

Vor- und Nachteile

  • Stufen sind klein, einzeln testbar und frei kombinierbar (SRP, OCP). − Wenn niemand zuständig ist, geht die Anfrage verloren. Und die Fehlersuche durch die Kette kann mühsam sein.

Siehe auch: Observer-Muster, Decorator-Muster