Ce este
Șablonul Chain of Responsibility (lanț de responsabilitate) trece o cerere pe un lanț de handlere. Fiecare handler fie se ocupă de cerere, fie o dă 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 chat bot. Ce nu poate rezolva botul ajunge la suportul tehnic; ce nu poate rezolva suportul tehnic ajunge la manager, care se ocupă de tot ce îi vine.
Pasează mai departe până poate cineva
Problema „no internet” face un singur pas și se oprește la suportul tehnic; cererea de rambursare parcurge tot lanțul până la manager. Apelantul a scris aceeași singură linie în ambele cazuri. Apelul nullsafe $this->next?->handle() pur și simplu se oprește la capătul lanțului.
Ieșire: script PHP
<?php
class Handler {
public function __construct(
private string $name,
private \Closure $canFix,
private ?Handler $next = null,
) {}
public function handle(string $problem): void {
if (($this->canFix)($problem)) {
echo $this->name, " a rezolvat: ", $problem, "\n";
return;
}
echo $this->name, " pasează mai departe\n";
$this->next?->handle($problem);
}
}
$manager = new Handler("manager", fn(string $p) => true);
$tech = new Handler("tech support", fn(string $p) => $p === "no internet", $manager);
$bot = new Handler("chat bot", fn(string $p) => $p === "forgot password", $tech);
$bot->handle("no internet");
echo "---\n";
$bot->handle("refund request");
Când să îl folosești
Folosește-l atunci când mai multe părți ar putea trata o cerere și nu se știe din timp care este cea potrivită — escaladarea la suport, middleware, tratarea evenimentelor, fluxuri de aprobare.
Renunță atunci când handlerul este întotdeauna cunoscut — apelează-l direct. Un lanț cu o singură verigă, sau unul care se termină mereu la aceeași verigă, este un simplu apel de funcție costumat.
Avantaje și dezavantaje
Avantaje: expeditorul și receptorii sunt decuplați; verigile pot fi adăugate, eliminate și reordonate liber; fiecare handler rămâne mic.
Dezavantaje: nu există garanția că cineva tratează cererea — un lanț rupt o înghite în silențiu; urmărirea unei cereri prin multe verigi face depanarea mai lentă.