Ce este
Șablonul Observer permite unui obiect să anunțe evenimente către mulți abonați fără să știe cine sunt aceștia. Abonații se înregistrează o singură dată; de atunci înainte, fiecare eveniment ajunge automat la toți.
Publicatorul depinde doar de o interfață mică de abonat — tipuri noi de ascultători apar fără să se schimbe o linie în publicator.
Exemplu: o singură alertă, toți abonații
Monitorul păstrează un tablou de abonați. Când se întâmplă ceva, notifică întregul tablou — astăzi o alertă prin email și un tablou de bord; mâine un mesaj de chat, doar abonându-l.
Publici o dată, livrezi tuturor
Un singur apel alert(), două livrări: email către [email protected]: disc aproape plin și tabloul de bord arată: disc aproape plin. Monitorul nu are idee ce este un email sau un tablou de bord — știe doar lucruri care pot fi notificate.
Ieșire: program TypeScript și rezultatul capturat
interface Subscriber {
notify(event: string): void
}
class EmailAlert implements Subscriber {
private address: string
constructor(address: string) {
this.address = address
}
notify(event: string): void {
console.log("email către", this.address + ":", event)
}
}
class Dashboard implements Subscriber {
notify(event: string): void {
console.log("tabloul de bord arată:", event)
}
}
// Publicatorul păstrează o listă și notifică pe toți cei din ea.
class Monitor {
private subscribers: Subscriber[] = []
subscribe(subscriber: Subscriber): void {
this.subscribers.push(subscriber)
}
alert(event: string): void {
for (const subscriber of this.subscribers) {
subscriber.notify(event)
}
}
}
const monitor = new Monitor()
monitor.subscribe(new EmailAlert("[email protected]"))
monitor.subscribe(new Dashboard())
monitor.alert("disc aproape plin")
Când să îl folosești
Folosește-l când mai multe părți trebuie să reacționeze la aceleași evenimente, iar 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. Și, înainte să scrii singur lista, uită-te la ce îți oferă deja platforma: Node.js vine cu EventEmitter, iar browserele au EventTarget — ambele sunt acest șablon, deja scris și testat.
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 de memorie.