Observer pattern
Il pattern Observer, è un design pattern utilizzato per tenere sotto controllo lo stato di diversi oggetti. E' strettamente legato al principio di invocazione implicita (Implicit invocation).
E' un patter molto comune, in quanto è la base di molti sistemi di gestione di eventi, a titolo di esempio è usato nella programmazione classica win32 sotto forma di "windproc", o in altri framework ad esempio quelli di microsoft directx, che hanno quale elemento centrale funzioni tipo "OnMsgProc", per la gestione dei messaggi . E' molto comune perchè lo si utilizzava ancor prima che la programmazione ad Oggetti fosse ben diffusa e specificata.
Sostanzialmente il pattern si basa su uno o più oggetti, chiamati osservatori o listeners, che vengono registrati per gestire un evento che potrebbe essere generato dall'oggetto "osservato".
Oltre all'observer esiste il concrete Observer che si differenzia dal primo perchè implementa direttamente le azioni da compiere in risposta ad un messaggio, riepilogando il primo è una classe astratta il secondo no...
Uno degli aspetti fondamentali è che tutto il funzionamento dell'observer si basa su meccanismi di callback, implementabili in diversi modi, o tramite funzioni virtuali o tramite puntatori a funzioni passati quali argomenti nel momento della registrazione dell'observer, e spesso a questa funzione vengono passati dei parametri in fase di generazione dell'evento. In generale il pattern impiega le seguenti classi
Soggetto Una classe che fornisce interfacce per registrare o rimuovere observers. e che implementa le seguenti funzioni: Attach Detach Notify
Soggetto Concreto Classe che fornisce lo stato dell'oggetto agli observers e che si occupa di effettuare le notifiche chiamando la funzione notify nella classe padre (Soggetto). Contiene la funzione: GetState - che restituisce lo stato del soggetto.
Observer Questa classe definisce un interfaccia per tutti gli observers, per ricevere le notifiche dal soggetto. E' utilizzata come classe astratta per implementare i veri Observer, ossia i ConcreteObserver.
Funzioni: Update - una funzione astratta che deve essere implementata dagli observer.
ConcreteObserver
Questa classe mantiene un riferimento al Subject (Concreto), per ricevere lo stato quando avviene una notifica.
La funzione non astratta è Update, quando questa viene chiamata dal Soggetto, il ConcreteObserver chiama la getstate sul soggetto per aggiornare l'informazione su di esso.
in C# tipicamente, il pattern observer è implementato tramite Classe Object (classe base che implementa la gestione degli Eventi) Classe da controllare (Concrete Subject) derivata da Object dichiarazione di Evento (Observer o listener) delegato (puntatore a funzione) che definisce il prototipo della funzione che sarà registrata quale Concrete Observer.