Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoItalian and spanish name derived from th Modificato 11 anni fa
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
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.