Design Pattern Observer ingegneria del software



Scaricare 167 Kb.
12.11.2018
Dimensione del file167 Kb.


Design Pattern Observer

  • INGEGNERIA DEL SOFTWARE

  • Nicola Ferrari


Carta d’identità

  • Nome

    • Observer
  • Alias

    • Dependents
    • Publish-Subscribe
  • Classificazione

    • Comportamentale, basato su oggetti
  • Scopo

    • Definisce una relazione uno a molti tra oggetti, in modo tale che quando un oggetto cambia stato tutti gli oggetti da lui dipendenti vengono automaticamente notificati


Motivazioni

  • Un esempio noto a tutti

    • Il foglio elettronico e le sue opportunità.
      • I dati in forma tabellare possono essere rappresentati nei diversi tipi di grafici.
      • Observer si preoccupa della sincronizzazione automatica fra tutte queste parti. Cioè l’aggiornamento dei valori di certe celle provoca il ridisegno dei grafici.


Applicabilità

  • Quando un’astrazione presenta due aspetti, di cui uno dipende dall’altro.

  • Quando una modifica ad un oggetto richiede modifiche ad altri oggetti che dipendono da questo.

  • Quando si vuole mantenere un alto livello di disaccoppiamento fra gli oggetti.



I partecipanti

  • Gli attori (visione globale)

    • Subject (abstract)
    • Observer (interface)
    • ConcreteSubject
    • ConcreteObserver


I partecipanti

  • Subject

    • Classe astratta da cui eredita ConcreteSubject
    • Tiene i riferimenti ai vari observers
      • metodi add e remove
      • attributo observers
    • Informa gli observers di un avvenuto cambiamento di stato
      • metodo notify


I partecipanti

  • Subject (il codice)

    • notify() delega ad Observer l’aggiornamento dello stato
    • Mancano le astrazioni di setState e getState


I partecipanti

  • Observer

    • interfaccia implementata da ConcreteObserver
  • ConcreteObserver

    • Tiene riferimento a Subject per leggere lo stato


Implementazione

  • ConcreteObserver (il codice)



Ricapitolando

  • Il metodo notify chiama il metodo update da tutti gli Observer registrati.

  • Il metodo update a sua volta richiama getState di ConcreteSubject per ottenere il nuovo stato



Conseguenze

  • Accoppiamento astratto fra Subject e Observer

  • Supporto per comunicazioni broadcast

  • Aggiornamenti inattesi



Implementazione

  • Mantenere le associazioni fra soggetti ed osservatori

    • Usando una tabella di hash
      • Un soggetto senza osservatori non occupa spazio
      • Sarà più oneroso accedere agli osservatori


Implementazione

  • Chi fa partire la notifica?

    • I metodi di Subject quando modificano il proprio stato automaticamente chiamano Notify dopo aver cambiato lo stato del soggetto
      • Inefficienza nel caso di aggiornamenti multipli
    • I client devono invocare Notify sull’oggetto al momento opportuno.
      • Si corre il rischio di dimenticarsene.


Implementazione

  • Riferimenti a soggetti cancellati

    • La cancellazione di un soggetto non dovrebbe produrre riferimenti non validi negli osservatori
      • Il soggetto notifica ai suoi osservatori la propria cancellazione in modo che questi possano eliminare il riferimento al soggetto


Implementazione

  • Evitare protocolli di notifica specifici per l’osservatore

    • Le implementazioni prevedono che il soggetto alleghi nella notifica informazioni addizionali sul cambiamento avvenuto nell’osservatore
      • Modello push: si allegano informazione dettagliate
        • Problema di riusabilità.
      • Modello pull: non si allega nulla
        • Gli Observer devono capire cosa è cambiato


Implementazione

  • Incapsulare semantiche complesse di aggiornamento

    • Quando la dipendenza fra soggetti e osservatori è particolarmente complessa, potrebbe essere richiesto un oggetto che mantenga queste associazioni
      • Maggior sincronizzazione fra osservatori e soggetto


Utilizzi noti



Pattern correlati

  • Mediator

    • svolge il ruolo di mediatore fra soggetto e osservatori
      • Vedi lucido 16
  • Singleton





Condividi con i tuoi amici:


©astratto.info 2019
invia messaggio

    Pagina principale