Ce este
Șablonul Lanț de responsabilitate (Chain of Responsibility) transmite o cerere de-a lungul unui lanț de handleri. Fiecare handler fie se ocupă de cerere, fie o predă următorului. Expeditorul cunoaște doar prima verigă — niciodată pe cel care o va rezolva de fapt.
Exemplu: o linie de suport
O problemă intră la botul de chat. Ce nu poate rezolva botul ajunge la suportul tehnic; ce nu poate rezolva suportul tehnic ajunge la manager, care se ocupă de tot ce primește.
Transmite mai departe până când cineva poate
„no internet” parcurge un singur pas și se oprește la suportul tehnic; cererea „refund request” parcurge tot lanțul până la manager. Apelantul a scris de ambele ori aceeași linie.
Ieșire: program Python complet
from dataclasses import dataclass
from typing import Callable
@dataclass
class Handler:
name: str
can_fix: Callable[[str], bool]
next_handler: "Handler | None" = None
def handle(self, problem: str) -> None:
if self.can_fix(problem):
print(self.name, "a rezolvat:", problem)
return
print(self.name, "transmite mai departe")
if self.next_handler is not None:
self.next_handler.handle(problem)
manager = Handler("managerul", lambda problem: True)
tech = Handler("suportul tehnic", lambda problem: problem == "no internet", manager)
bot = Handler("botul de chat", lambda problem: problem == "forgot password", tech)
bot.handle("no internet")
print("---")
bot.handle("refund request")
Când să-l folosești
Folosește-l când mai mulți participanți ar putea trata o cerere și nu se știe dinainte care este cel potrivit — escaladarea în suport, middleware, tratarea evenimentelor, fluxuri de aprobare.
Renunță la el când handlerul este mereu cunoscut — apelează-l direct. Un lanț cu o singură verigă, sau unul care se termină mereu la aceeași verigă, este doar un apel de funcție obișnuit deghizat.
Avantaje și dezavantaje
Avantaje: expeditorul și destinatarii sunt decuplați; verigile pot fi adăugate, eliminate și reordonate liber; fiecare handler rămâne mic.
Dezavantaje: nu există nicio garanție că cineva tratează cererea — un lanț întrerupt o înghite în tăcere; urmărirea unei cereri prin multe verigi face depanarea mai lentă.