La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Design Pattern Observer INGEGNERIA DEL SOFTWARE Nicola Ferrari.

Presentazioni simili


Presentazione sul tema: "Design Pattern Observer INGEGNERIA DEL SOFTWARE Nicola Ferrari."— Transcript della presentazione:

1 Design Pattern Observer INGEGNERIA DEL SOFTWARE Nicola Ferrari

2 2 Carta didentità 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

3 3 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è laggiornamento dei valori di certe celle provoca il ridisegno dei grafici.

4 4 Applicabilità Quando unastrazione presenta due aspetti, di cui uno dipende dallaltro. 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.

5 5 I partecipanti Gli attori (visione globale) Subject (abstract) Observer (interface) ConcreteSubject ConcreteObserver

6 6 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

7 7 I partecipanti Subject (il codice) notify() delega ad Observer laggiornamento dello stato Mancano le astrazioni di setState e getState public abstract Subject { protected int state; protected ArrayList observers; public void add(Observer o) { observers.add(o); } public void remove(Observer o) { int i = observers.indexOf(o); if (i>=0) observers.remove(o); } public void notify() { for (int i=0; i<=observers.size();i++) { Observer o = (Observer) observers.get(i); o.update(); } …. }

8 8 I partecipanti Observer interfaccia implementata da ConcreteObserver ConcreteObserver Tiene riferimento a Subject per leggere lo stato

9 9 Implementazione ConcreteObserver (il codice) public class ConcreteObserver implements Observer { private String id; private int state; private Subject subject; public ConcreteObserver(String Id, Subject subject) { this.id = Id; this.subject = subject; stato = id.length(); } public void update() { state = state+subject.getState(); } update richiede lo stato tramite getState dal soggetto concreto

10 10 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

11 11 Conseguenze 1. Accoppiamento astratto fra Subject e Observer 2. Supporto per comunicazioni broadcast 3. Aggiornamenti inattesi

12 12 Implementazione 1. 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

13 13 Implementazione 2. 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 sulloggetto al momento opportuno. Si corre il rischio di dimenticarsene.

14 14 Implementazione 3. 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

15 15 Implementazione 4. Evitare protocolli di notifica specifici per losservatore Le implementazioni prevedono che il soggetto alleghi nella notifica informazioni addizionali sul cambiamento avvenuto nellosservatore Modello push: si allegano informazione dettagliate Problema di riusabilità. Modello pull: non si allega nulla Gli Observer devono capire cosa è cambiato

16 16 Implementazione 5. 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

17 17 Utilizzi noti Gestione degli eventi degli widget di una GUI Gestione degli eventi di un alarm clock Model View Control

18 18 Pattern correlati Mediator svolge il ruolo di mediatore fra soggetto e osservatori Vedi lucido 16 Singleton


Scaricare ppt "Design Pattern Observer INGEGNERIA DEL SOFTWARE Nicola Ferrari."

Presentazioni simili


Annunci Google