Observer pattern: differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
Riga 30: Riga 30:
* ''SetState()'' - che setta lo stato del soggetto.
* ''SetState()'' - che setta lo stato del soggetto.


N.B. Entrambe le funzioni vengono chiamate da ogni ConcreteObserver.
N.B. Entrambe le funzioni vengono chiamate da ogni ConcreteObserver dopo aver ricevuto un ''Update()''





Versione delle 11:31, 29 lug 2015

L'Observer pattern è un design pattern utilizzato per tenere sotto controllo lo stato di diversi oggetti.

È un pattern intuitivamente utilizzato come base architetturale di molti sistemi di gestione di eventi. Molti paradigmi di programmazione legati agli eventi, utilizzati anche quando ancora non era diffusa la programmazione ad oggetti, sono riconducibili a questo pattern. È possibile individuarlo in maniera rudimentale nella programmazione di sistema Windows, o in altri framework di sviluppo che richiedono la gestione di eventi provenienti da diversi oggetti, come ad esempio la funzione "OnMsgProc" per la gestione delle code di messaggi windows.

Sostanzialmente il pattern si basa su uno o più oggetti, chiamati osservatori o listener, 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 gli observer e che implementa le seguenti funzioni:

  • Attach(observer)
  • Detach(observer)
  • Notify()

N.B. La funzione Notify() è un loop attraverso tutti i ConcreteObserver con un call alla funzione Update() per ciascuno di essi. (vedi sotto)

Soggetto Concreto

Classe che contiene l'attributo

  • subjectState

il quale descrive lo stato del soggetto.

Inoltre, essa contiene le funzioni:

  • GetState() - che restituisce lo stato del soggetto.
  • SetState() - che setta lo stato del soggetto.

N.B. Entrambe le funzioni vengono chiamate da ogni ConcreteObserver dopo aver ricevuto un Update()


Questa classe:

  • fornisce lo stato del Soggetto agli observer
  • si occupa di notificare gli observers chiamando la funzione Notify() definita nella classe padre (Soggetto).

Observer

Questa classe definisce un'interfaccia per tutti gli observers, per ricevere le notifiche dal soggetto. È utilizzata come classe astratta per implementare i veri Observer, ossia i ConcreteObserver.

Funzioni:

  • Update() - una funzione astratta che deve essere implementata dai ConcreteObserver .

ConcreteObserver

Questa classe mantiene un riferimento al Soggetto (Concreto), per ricevere lo stato quando avviene una notifica.

Il ConcreteObserver implementa la funzione astratta Update(): quando questa viene chiamata dal Soggetto Concreto, il ConcreteObserver chiama prima la funzione Getstate() sul soggetto concreto per conoscere il suo nuovo stato, e poi eventualmente la funzione SetState() per aggiornare la copia dello stato.

L'Observer pattern in C#

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.

Bibliografia

  • (EN) Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, 1995, pp. 293-303, ISBN 0-201-63361-2.

Altri progetti

Template:Design Patterns Patterns