Ce este
Șablonul Observer permite unui obiect să anunțe evenimente către mai mulți abonați fără să știe cine sunt aceștia. Abonații se înregistrează o singură dată; de atunci, fiecare eveniment ajunge automat la toți.
Publicatorul depinde doar de o interfață mică de abonat — apar tipuri noi de ascultători fără să se schimbe o linie în publicator. PHP oferă chiar interfețele gata făcute SplSubject și SplObserver pentru acest șablon; o interfață mică proprie, ca cea de mai jos, se citește la fel de bine.
Exemplu: o singură alertă, toți abonații
Monitorul păstrează o listă de abonați. Când se întâmplă ceva, notifică toată lista — astăzi o alertă pe email și un tablou de bord; mâine un mesaj de chat, doar abonându-l.
Publică o dată, livrează tuturor
Un singur apel alert(), două livrări. Monitorul nu are nicio idee ce este un email sau un tablou de bord — știe doar lucruri care pot fi notificate.
Ieșire: script PHP
<?php
interface Subscriber {
public function notify(string $event): void;
}
class EmailAlert implements Subscriber {
public function __construct(private string $addr) {}
public function notify(string $event): void {
echo "email către ", $this->addr, ": ", $event, "\n";
}
}
class Dashboard implements Subscriber {
public function notify(string $event): void {
echo "tabloul de bord afișează: ", $event, "\n";
}
}
// Publicatorul păstrează o listă și notifică pe toți cei din ea.
class Monitor {
/** @var Subscriber[] */
private array $subscribers = [];
public function subscribe(Subscriber $s): void {
$this->subscribers[] = $s;
}
public function alert(string $event): void {
foreach ($this->subscribers as $s) {
$s->notify($event);
}
}
}
$monitor = new Monitor();
$monitor->subscribe(new EmailAlert("ops@example.com"));
$monitor->subscribe(new Dashboard());
$monitor->alert("disk almost full");
Când să-l folosești
Folosește-l când mai multe părți trebuie să reacționeze la aceleași evenimente și lista celor care reacționează se schimbă — actualizări de interfață, alertare, invalidare de cache, fluxuri de activitate.
Renunță la el când există exact un singur destinatar, fix — apelează-l direct. Un dispecer de evenimente într-o aplicație PHP mai mare este exact acest șablon, crescut: evenimente cu nume, mulți ascultători, un singur punct de expediere.
Avantaje și dezavantaje
Avantaje: publicatorul și abonații rămân decuplați; abonații apar și dispar în timpul execuției; reacțiile noi nu cer modificări în publicator.
Dezavantaje: fluxul devine invizibil — „cine reacționează la asta?” cere căutare; un abonat lent sau care eșuează poate bloca bucla de notificare; dezabonările uitate produc scurgeri.