Intento:
Definire una dipendenza di tipo uno a molti fra oggetti così che quando uno dei molti oggetti cambia stato anche tutti quelli riferiti allo stesso vengono aggiornati di conseguenza.
Applicabilità:
Il pattern Observer è da utilizzare quando:
- una astrazione ha due aspetti diversi l’uno che dipende dall’altro. Incapsulare questi due aspetti in oggetti separati permette di variare e riutilizzare questi in modo indipendente.
- Il cambiamento di un oggetto richiede l’aggiornamento anche di altri oggetti, dei quali non si conosce il numero
- un oggetto deve essere in grado di aggiornare altri oggetti senza sapere chi sono questi oggetti
Partecipanti:
- Subject → conosce i suoi osservatori. Un numero variabile di Observer può osservare un soggetto; fornisce inoltre una interfaccia per agganciare e sganciare oggetti di tipo Observer
- Observer → definisce una interfaccia di aggiornamento per notificare tutti gli oggetti dell’avvenuto cambiamento nel soggetto
- ConcreteSubject → mantiene gli stati di interesse degli oggetti ConcreteObserver. Invia una notifica ai suoi osservatori quando cambia stato
- ConcreteObserver → mantiene un riferimento rispetto all’oggetto ConcerteSubject; immagazzina gli stato che potrebbero essere consistenti con quello dei soggetti ed infine implementa Observer aggiornando l’interfaccia per mantenerla al passo con quella del soggetto
Conseguenze:
- Viene astratto l’accoppiamento fra Soggetto e Osservatore.
- Viene supportata la comunicazione di tipo broadcast
- Possono esserci però degli aggiornamento non aspettati che compromettono l’intera struttura, dato che un solo aggiornamento comporta il cambio anche ti tutti gli oggetti correlati









