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 — pot apărea tipuri noi de ascultători fără să se schimbe nici măcar o linie în publicator.
Exemplu: o alertă, toți abonații
Monitorul păstrează o listă de abonați. Când se întâmplă ceva, notifică toată lista — o alertă pe email și un panou de control, astăzi; un mesaj de chat mâine, doar abonându-l.
Publici o dată, se livrează tuturor
Un singur apel Alert(), două livrări. Monitorul habar nu are ce este un email sau un panou de control — știe doar despre lucruri care pot fi notificate.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
type Subscriber interface {
Notify(event string)
}
type EmailAlert struct {
addr string
}
func (e EmailAlert) Notify(event string) {
fmt.Println("email către", e.addr+":", event)
}
type Dashboard struct{}
func (Dashboard) Notify(event string) {
fmt.Println("panoul afișează:", event)
}
// Publicatorul păstrează o listă și notifică pe toți cei aflați pe ea.
type Monitor struct {
subscribers []Subscriber
}
func (m *Monitor) Subscribe(s Subscriber) {
m.subscribers = append(m.subscribers, s)
}
func (m *Monitor) Alert(event string) {
for _, s := range m.subscribers {
s.Notify(event)
}
}
func main() {
m := &Monitor{}
m.Subscribe(EmailAlert{addr: "[email protected]"})
m.Subscribe(Dashboard{})
m.Alert("discul este 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, invalidarea cache-ului, fluxuri de activitate.
Renunță la el când există exact un singur receptor, fix — apelează-l direct. În programele Go concurente, ia în calcul mai întâi canalele: ele transportă evenimente, având backpressure și select incluse.
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 — la întrebarea „cine reacționează la asta?” trebuie să cauți răspunsul; un abonat lent sau care eșuează poate bloca bucla de notificare; dezabonările uitate produc scurgeri de memorie.