Ingegneria del Software B. Il pattern Observer. Ex presentazione realizzata dallo studente Davide Ferrari nell a.a. 2009/2010

Documenti analoghi
Il problema è trovare un modo nel quale gli eventi dell oggetto di riferimento, siano comunicati a tutti gli altri interessati.

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

Model-View- Controller

Ingegneria del Software Model View Controller

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I {

NON ABBIAMO ANCORA CORRETTO LE PROVETTE!!!

Corso sul linguaggio Java

Lab 4: Design Patterns

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

Configurazione di una vs. Laboratorio di sistemi interattivi. Dal modello formale all implementazione

Meccanismo del pattern Observer

Programmazione Java Avanzata Programmazione Object- Oriented in Java

La classe java.lang.object

oggetti, permettono di ridurre i costi di sviluppo, poiché cercano di riusare insiemi di classi e di produrre sistemi più facili da evolvere.

Poiché è necessario che le selezioni si aggiornino automaticamente, occorre che queste siano notificate di ogni cambiamento pattern observer! Altro?

Model View Controller

Design Pattern Comportamentali

Diagramma delle classi

DIAGRAMMI DEI PACKAGE

OLTRE LE CLASSI OLTRE LE CLASSI

Object Oriented Design Patterns: Decorator

Il paradigma di programmazione OO

OLTRE LE CLASSI OLTRE LE CLASSI OLTRE LE CLASSI OLTRE LE CLASSI. Alcune domande. Nella sua parte non statica, una classe

Modello a oggetti. Il modello MVC. Laboratorio di Sistemi Interattivi. Lezione 3: Ancora su MVC e altro

Ingegneria del software - Esame del 10 febbraio 2004 Soluzione. Esercizio 1 (media 6,93 decimi)

Esercitazione sui Design Pattern. lunedì 29 aprile 13

Design Principle. immagini da SOLID Motivational Posters, by Derick Bailey

Classi Anonime In Java. Java. Espressioni Lambda. Implementazione Interfaccia

Esercitazioni di PROGETTAZIONE DEL SOFTWARE A.A

Il Linguaggio Java. Le interfacce

Sistemi Operativi. Processi e thread

ereditarietà e polimorfismo

Programmazione Java Avanzata PATTERN

Programmazione orientata agli oggetti Classi astratte e interfacce

Design Pattern in Java

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

Progettazione Object-Oriented

Sul pattern Strategy

Compito di Fondamenti della Programmazione: Metodi Evoluti - A.A Prova di esame del 24 settembre 2015

Sul pattern Iterator

Programmazione orientata agli oggetti Classi astratte e interfacce. Classi astratte - Interfacce

Lezione 4. Massimiliano Palese IEEE Student Member

SOMMARIO DESIGN PATTERN

Un approccio possibile sarebbe creare un oggetto con un metodo adeguato per scandire collezioni o stampare i dati dell oggetto:

Model View Controller (MVC)

Marco Faella Elementi di programmazione di interfacce Grafiche. Il pattern OBSERVER.

Classi astratte Interfacce

OO design pattern. Design pattern: motivazioni

Calcolatrice in Java: esempi di DP

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

Lezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

Anno Scolastico

Design Patterns. Introduzione 2. Introduzione 3

Riuso di classi. Ereditarietà. Ereditarietà. Spesso si ha bisogno di classi simili

Autovalutazione. OO in Java: classi astratte, interfacce, classi interne. Riassunto: cos è la OOP?

Catia Trubiani. Laboratorio di Ingegneria del Software a.a

Concorrenza e sincronizzazione

Ingegneria del Software

Compito di Fondamenti della Programmazione: Metodi Evoluti - A.A Prova di esame del 19 luglio 2014

Prova d Esame Compito A

Alcune info sulle prossime lezioni

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Il pattern FACTORY è un pattern di tipo Creazionale secondo la classificazione della GoF I pattern di tipo creazionali si occupano della costruzione

Introduzione alla programmazione Object Oriented. Luca Lista

Java. Classi Anonime In Java Da Java 1.1 si possono usare classi anonime per implementare interfacce. Espressioni Lambda. Implementazione Interfaccia

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercizio Sincronizzazione Thread

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

L Abstract Windowing Toolkit. Le GUI in Java. Il Frame. Cenni sull ereditarietà. Gianpaolo Cugola - Sistemi Informativi in Rete

Ingegneria del Software

LE TABELLE. Le liste permettono di avere una sequenza di righe In alcune applicazioni è però necessario visualizzare le informazioni anche in colonne

OOP Ereditarietà A. FERRARI

SOMMARIO DESIGN PATTERN INTRODUZIONE AI DESIGN PATTERN INGEGNERIA DEL SOFTWARE. Introduzione. Cos è un design pattern. Cos è un design pattern

Obiettivi. Comprendere i vantaggi offerti dal meccanismo dell ereditarietà Attivare processi di astrazione e specializzazione.

Programmazione Orientata agli Oggetti

Paradigma a oggetti. Programmazione orientata agli oggetti. Programmazione orientata agli oggetti Paradigma a oggetti 1 / 30

Programmazione ad oggetti. Paradigma a oggetti. Esempio. Esempio L estensione del tipo di dato comporta la ridefinizione del codice

Fondamenti di Informatica

Esercizio 1: listino prezzi

SOMMARIO STACK. STACK: specifica STACK

SOMMARIO Tipo di dato astratto (ADT) : Interfacce: interface. TIPI DI DATI ASTRATTI. Polimorfismo: Tipo class. Tipo interface. Tipi run-time: is e as.

Esempi in Java di program.ne O-O

Corso di Reti di Calcolatori L-A

INFORMATICA OOP Relazioni tra classi Roberta Gerboni

Corso di Progettazione del Software

JAVA GENERICS. Angelo Di Iorio Università di Bologna

Roberta Gori, Laura Semini Ingegneria del Software Dipartimento di Informatica Università di Pisa

Uguaglianza e copia di oggetti

Thread in Java. Thread = flusso di esecuzione indipendente nel codice del programma

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Eventi e listener per i componenti grafici

Programmazione a oggetti

MVC: esempio in java. views e controllers in javax.swing

Analisi e comparazione dei Framework OpenSwing e Google Web Toolkit per lo sviluppo di interfacce utente con paradigma MVC.

Programmazione orientata agli oggetti Ereditarietà

Transcript:

Ingegneria del Software B Il pattern Observer Ex presentazione realizzata dallo studente Davide Ferrari nell a.a. 2009/2010

Observer Noto anche come Publish(er)-Subscribe(r), Dependents, Delegation Event Model (in Java) Classificazione Scopo Object behavioural Definisce una relazione uno a molti fra oggetti, in modo tale che, quando un oggetto cambia stato, tutti gli oggetti che dipendono da esso ne ricevano notifica (e si aggiornino) automaticamente Il pattern Observer 2

Observer: Motivazione Esempio Realizzare una classe che rappresenti una stazione meteorologica, in grado di misurare temperatura, umidità e pressione atmosferica; realizzare, in seguito, una classe che rappresenti un display, in grado di mostrare le condizioni atmosferiche misurate dalla stazione. Il pattern Observer 3

Observer: Motivazione Implementazione la classe WeatherStation ha un attributo di tipo Display ogni volta che cambiano le condizioni atmosferiche si invoca (ad es. come ultima istruzione di setparam) measurementchange(), che aggiorna l attributo disp Il pattern Observer 4

Observer: Motivazione Estensione Aggiungere una classe in grado di eseguire (e visualizzare) previsioni meteorologiche sulla base delle condizioni atmosferiche correnti (N.B. ogni volta che le condizioni cambiano, la previsione potrebbe cambiare). fdisp.update(); È stato necessario modificare la classe WeatherStation Il pattern Observer 5

Observer: Motivazione Altra estensione Aggiungere una classe che rappresenti un gestore di irrigatori, in grado di attivare (o disattivare) degli irrigatori, in base alle condizioni atmosferiche attuali. fdisp.update(); spman.update(); Ancora modifiche alla classe WeatherStation Da notare il metodo update() in tutte le classi dipendenti da WeatherStation Il pattern Observer 6

Observer: Motivazione Problemi: per ciascun nuovo oggetto interessato alle condizioni atmosferiche, è necessario modificare la classe WeatherStation; non è possibile aggiungere dinamicamente oggetti dipendenti dalle condizioni atmosferiche. Vorremmo potere aggiungere, dinamicamente, osservatori delle condizioni atmosferiche, senza modificare le classi già esistenti Il pattern Observer 7

Observer: Motivazione Implementazione con pattern Observer for all o in observers do o.update() Observer: interface implementata dai vari osservatori (metodo update()) WeatherStation ha attributi e metodi (ereditati) per gestire l aggiornamento degli osservatori Possibilità di modificare, dinamicamente, il numero di osservatori Il pattern Observer 8

Observer: Motivazione Altri esempi (più informatici) Gestione di interfacce grafiche Oggetti che dipendono dagli eventi di interazione con l interfaccia grafica Dati nel foglio di calcolo Dipendenza dal valore e dai cambiamenti di valore di una cella (grafici, funzioni, altre celle) Il pattern Observer 9

Observer: Applicabilità quando alcuni oggetti dipendono dai dati di un altro oggetto e hanno necessità di essere informati quando questi dati cambiano; quando una classe presenta molti attributi, buona parte dei quali sono riferimenti a oggetti che dipendono dal suo stato. Il pattern Observer 10

Observer: Struttura e Partecipanti for all o in observers do o.update() - subject state = subject.getstate Subject classe astratta contiene i metodi per la gestione degli osservatori ConcreteSubject implementazione vera e propria dell oggetto da realizzare eredita attributi e metodi per la gestione di osservatori Observer Interfaccia comune a tutti gli osservatori (metodo update()) ConcreteObserver Implementa il metodo update() nel modo più opportuno Il pattern Observer 11

Observer: Collaborazioni ConcreteSubject contiene un attributo, observers, che rappresenta l insieme degli oggetti interessati al suo stato; mette a disposizione, degli oggetti interessati, i metodi add(o:observer) e remove(o:observer) che permettono di aggiungere o togliere un riferimento a loro stessi all attributo observers; a ogni cambiamento, invoca notify() per informare tutti gli oggetti il cui riferimento appartiene a observers. ConcreteObserver si registra a uno specifico ConcreteSubject, qualora sia interessato ai cambiamenti di stato di quest ultimo; implementa in modo specifico il metodo update() (interfaccia nota a ConcreteSubject). Il pattern Observer 12

NOTA: Significato dei nomi del pattern Observer Ci sono oggetti interessati a osservare i cambiamenti dell oggetto ConcreteSubject Publisher-Subscriber Editore-Abbonato Gli oggetti ConcreteObserver si abbonano ai cambiamenti pubblicati dall oggetto ConcreteSubject (cfr. metodi add(o:observer) e remove(o:observer) ereditati da Subject) Delegation Event Model (Java) Il publisher delega la gestione degli eventi ai vari subscriber (detti Listener) Il pattern Observer 13

Observer: Conseguenze Vantaggi Accoppiamento lasco fra un ConcreteSubject e i suoi ConcreteObserver» Il subject sa solo che gli observer implementano una certa interfaccia» Si possono aggiungere dinamicamente nuovi observer» Nessuna modifica statica alla classe ConcreteSubject (almeno per quanto riguarda gli observer)» Un subject di basso livello può essere osservato da un osservatore di alto livello (struttura a layer)» Le modifiche (alle classi osservatrici) non devono essere propagate» Ciascun observer può abbonarsi a molti subject diversi Possibilità di costruire dinamicamente le collaborazioni Il pattern Observer 14

Observer: Conseguenze Svantaggi Prestazioni peggiori (in particolare per alcune implementazioni) Difficoltà nella comprensione delle dipendenze fra oggetti (in fase di testing e debugging)» quanti osservatori dipenderanno dal soggetto» a quali soggetti un osservatore potrà riferirsi Il pattern Observer 15

Observer: Implementazione Un observer può essere abbonato a più subject Come capisce a quale subject una notifica ricevuta si riferisce? Il subject passa un riferimento a se stesso come parametro (notify(this)) Come mantenere le associazioni fra soggetti e osservatori? Strutture associative» Permettono di usare meno spazio (ad es. soggetto senza osservatori)» Comportano svantaggi nel tempo (ricerca dell oggetto specifico) Il pattern Observer 16

Observer: Implementazione Invio delle notifiche Al verificarsi di un cambiamento nello stato del subject, chi deve inviare la notifica agli observer? Il client del subject invoca notify() ogni volta che ne modifica lo stato» Troppa responsabilità al client» Conseguenze pesanti nel caso di dimenticanze Il subject invoca notify() come ultima istruzione dei metodi di modifica» Possibili stati inconsistenti nel caso di metodi innestati public A(){ //do sth B(); //do sth else notify();} public B(){ //do sth notify();} Il pattern Observer 17

Observer: Implementazione Come propagare le informazioni Come è possibile fare conoscere lo stato del subject all observer? Modello PUSH: il subject invia agli observer tutti i dati, riguardanti il suo stato, di cui essi necessitano» il subject deve fare assunzioni sulle informazioni utili ai vari observer (deve conoscerli dipendenza) Modello PULL: dopo avere ricevuto una notifica, gli observer richiedono al subject le informazioni di cui necessitano (metodi get())» più flessibile Il pattern Observer 18

Observer: Implementazione Come propagare le informazioni Il pattern Observer 19

Observer: Implementazione Come gestire cambiamenti ravvicinati Quando propagare i cambiamenti? Troppo presto lo stato può essere ancora modificato (inefficienze) Troppo tardi si rischia di avere inconsistenze (fra subject e observer) è necessario un opportuno change management Il pattern Observer 20

Observer: Implementazione Quali cambiamenti significativi Quale dev essere la sensibilità del meccanismo di notifica? (notifico ogni minima variazione o solo variazioni significative cfr stazione meteo) Si utilizza un flag changed (posto a true quando si ha un cambiamento significativo rispetto all ultima modifica) setchanged(){changed = true;} notify(){ if(changed){ for(int i=0;i<observers.size();i++) (observers.elementat(i)).update(); } changed = false;} Il pattern Observer 21

Observer: Codice d esempio Implementazione della stazione meteorologica public abstract class Subject{ private Vector observers; public void add(observer o){ observers.add(o); } public void remove(observer o){ observers.remove(indexof(o)); } } public void notify(){ for(int i=0;i<observers.size();i++) (observers.elementat(i)).update(this); } Il pattern Observer 22

Observer: Codice d esempio public class WeatherStation extends Subject{ private double temperature; private double humidity; private double pressure; } public WeatherStation(){ observers = new Vector(); //acquisizione delle prime misurazioni } public void setparam(double t, double h, double p){ temperature = t; humidity = h; pressure = p; notify(); } public double gettemperature(){return temperature;} public double gethumidity(){return humidity;} public double getpressure(){return pressure;} Il pattern Observer 23

Observer: Codice d esempio public interface Observer{public void update(subject s);} public class Display implements Observer{ private double measuredtemp; private double measuredhum; private double measuredpress; public Display(...){ //acquisizione delle misure} public void update(subject s){ measuredtemp = s.gettemperature(); measuredhum = s.gethumidity(); measuredpress = s.getpressure(); showcond();} } public void showcond(){ //visualizzazione delle condizioni meteo } Il pattern Observer 24

Observer: Codice d esempio public class ForecastDisplay implements Observer{ private double measuredtemp; private double measuredhum; private double measuredpress; public ForecastDisplay(...){ //acquisizione delle misure e previsione} public void update(subject s){ measuredtemp = s.gettemperature(); measuredhum = s.gethumidity(); measuredpress = s.getpressure(); predict();showprediction();} public void predict(){ //si effettuano previsioni //sulla base delle condizioni attuali} public void showprediction(){ //visualizzazione delle previsioni meteo}} Il pattern Observer 25

Observer: Codice d esempio public class SprinklerManager implements Observer{ private double measuredtemp; private double measuredhum; private double measuredpress; //riferimenti agli irrigatori public Display(...){ //acquisizione delle misure //inizializzazione riferimenti agli irrigatori} public void update(subject s){ measuredtemp = s.gettemperature(); measuredhum = s.gethumidity(); measuredpress = s.getpressure(); managesprinkler();} } public void managesprinkler(){ //decide cosa fare sulla base delle condizioni} Il pattern Observer 26

Observer: Implementazione Linguaggi con ereditarietà semplice Come implementare il pattern Observer, anche se il ConcreteSubject deve necessariamente ereditare da altre classi? ConcreteSubject è già sottoclasse di Subject Il pattern Observer 27

Observer: Implementazione Linguaggi con ereditarietà semplice Prima soluzione:» Subject è un interface implementato da ConcreteSubject» ConcreteSubject delega a SubjectHelper l implementazione dei metodi di Subject Svantaggio: il codice per la gestione degli observer va ripetuto in ogni classe ConcreteSubject Il pattern Observer 28

Observer: Implementazione Linguaggi con ereditarietà semplice Seconda soluzione:» Subject è un interface implementato da ConcreteSubject» L oggetto del dominio è rappresentato dalla classe DomainObject, che ha, fra i suoi attributi, un oggetto di tipo ConcreteSubject (si occupa della gestione degli observer) Solo ConcreteSubject implementa i metodi di Subject DomainObject può avere più attributi di tipo ConcreteSubject (può differenziare gli observer in base agli eventi cui sono interessati) Il pattern Observer 29

Observer: Utilizzi noti Gestori di interfacce grafiche Librerie Java AWT e Swing (N.B. esistono Observable e Observer) java.awt Framework Microsoft.NET Altro Gestione di eventi di alarm clock Altri pattern.net Il pattern Observer 30

Observer: Pattern correlati Model-View-Controller La relazione fra model e view può essere espressa mediante una relazione tipo pattern observer Il pattern Observer 31