Ing. del software B Il Pattern Observer Simone Magnolini.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Costruttori e Distruttori
Recupero debito quarto anno Primo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Progetto realizzato da: Francesco Seccia Matr Marco Spinelli Matr
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Introduzione al linguaggio Java
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
L.Lista Design P atterns Luca Lista. L.Lista Design Patterns Elementi di software OO riutilizzabile Piccoli insiemi di classi che collaborano implementando.
Overriding.
Soluzione Esercizio - Classe Vettore
Progettazione dei Sistemi Interattivi (a.a. 2004/05) - Lezione 6 1 Programmi concorrenti: quanto è lungo un millisecondo? In un normale personal computer.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 3 1 JAVA e Internet: il World Wide Web Internet: milioni di computer collegati fra di loro attraverso.
Oggetti e dati primitivi Programmazione Corso di laurea in Informatica.
AA2003/04 © M.A. Alberti Programmazione Interfacce 1 Programmazione Corso di laurea in Informatica.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
Programmazione con Interfacce
Design Pattern Observer INGEGNERIA DEL SOFTWARE Nicola Ferrari.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
Sistemi Operativi GESTIONE DEI PROCESSI.
Java base IV: Java e la programmazione O.O.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Introduzione alla modellazione di sistemi interattivi
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
I Metodi in Java Il termine "metodo" è sinonimo di "azione". Quindi, affinché un programma esegua qualche istruzione, deve contenere metodi.
Introduzione alla programmazione Object Oriented
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Programmazione concorrente
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
1 Incapsolamento (intro) Sandro Pedrazzini Approfondimento Incapsolamento (introduzione)
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
Corso JAVA Lezione n° 12 Istituto Statale di Istruzione Superiore “F. Enriques”
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
1 Applet ed HTML Fondamenti di Informatica Corso D.
Java gestione eventi introduzione. La gestione degli eventi Ci sono 3 oggetti interessati alla g. d. e.: L’oggetto interessato (event source) ad esempio.
Una "vera" classe.. ..un esempio pratico: la calcolatrice
Programmazione ad oggetti
30/11/2004Laboratorio di Programmazione - Luca Tesei1 Interfacce e Polimorfismo.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Gestione dei thread in Java
Ingegneria del software Modulo 1 - Introduzione al processo software Unità didattica 4 - Progettazione del software Ernesto Damiani Università degli Studi.
La gestione degli eventi
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
La Programmazione ad Oggetti
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
La programmazione ad oggetti
28/12/2001package 1 Package Pacchetti e interfacce.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

Ing. del software B Il Pattern Observer Simone Magnolini

Definire una dipendenza uno a molti fra oggetti, in modo tale che se un oggetto cambia il suo stato, tutti gli oggetti dipendenti da questo ricevano una notifica e si aggiornino automaticamente. Scopo

Un esempio concreto Prendiamo ad esempio questa stessa presentazione: L'uno: la presentazione, ha uno stato (il numero della slide ad esempio) che pubblica, per questo in generale si identifica come publisher o subject. La relazione non è unidirezionale, chiunque può intervenire per cambiare lo stato della presentazione I molti: le persone presenti in aula, sono interessate allo stato del soggetto che hanno sottoscritto di osservare (tramite il loro ingresso in aula) per questo si identificano come subscriber o observer

Doveri e responsabilità Presentazione Mantenere uno stato, cambiarlo, restituirlo Inoltre in un qualche modo quando cambia stato deve comunicare la modifica avvenuta, come ad esempio... Pubblico Reagire al cambio di stato nel modo opportuno Modificare lo stato di ciò che sta osservando

Struttura observer Presentazione getState() setState() statoPresentazione Alunno 1 reagisci() statoAlunno Alunno N reagisci() statoAlunno Alunno 2 reagisci() statoAlunno

Struttura observer Presentazione getState() setState() statoPresentazione Alunno 1 reagisci() statoAlunno Alunno N reagisci() statoAlunno Alunno 2 reagisci() statoAlunno Ascoltatore reagisci()

Struttura observer Presentazione getState() setState() statoPresentazione Alunno 1 reagisci() statoAlunno Alunno N reagisci() statoAlunno Alunno 2 reagisci() statoAlunno Ascoltatore reagisci() Lezione aggiungi(Ascoltatore) rimuovi(Ascoltatore) notifica()

Struttura observer Presentazione getState() setState() statoPresentazione Alunno 1 reagisci() statoAlunno Alunno N reagisci() statoAlunno Alunno 2 reagisci() statoAlunno Ascoltatore reagisci() Lezione aggiungi(Ascoltatore) rimuovi(Ascoltatore) notifica()

Struttura observer ConcreteSubject getState() setState() subjectstate ConcreteObserver update() observerState Observer update() Subject attach(Observer) detach(Observer) notify()

Anche conosciuto come Publish-Subscribe Dependents Java Delegation Event Model Intuitivamente correlato a tutti i paradigmi di programmazione a eventi Classificazione Comportamentale Focalizzato sulle relazioni run-time tra oggetti Il Pattern Observer

Viste multiple dello stato pubblicato Più di un formato di visualizzazione Devono essere coerenti Viste multiple interattive, che permettono la modifica dello stato Occorre aggiornare anche le altre viste Devono essere coerenti Paradigma a eventi (non centra per forza una GUI) Es. il meccanismo dei trigger in una base di dati relazionale Motivazione

Esempio classico

Se unastrazione presenta due aspetti in cui uno è dipendente dallaltro. Separandoli è possibile riutilizzarli Se cambiamenti ad un oggetto hanno ripercussioni su altri oggetti il cui numero è variabile, o comunque non è noto a priori Se un oggetto deve inviare messaggi ad altri oggetti senza sapere esattamente di che tipo sono legami di dipendenza deboli (disaccoppiamento) Applicabilità

Partecipanti: Subject Conosce tutti gli observer Chiunque implementi linterfaccia observer può osservare il soggetto Offre metodi per: Laggiunta di un osservatore (attach) La rimozione di un osservatore (detach) In java potrebbe essere implementata come abstract Senza istanze, ma con dei metodi implementati

Partecipanti: Observer Fornisce uninterfaccia Tutti gli osservatori devono ereditarla per ottenere gli aggiornamenti del soggetto In java potrebbe essere implementata come interface Senza istanze né metodi implementati

Partecipanti: ConcreteSubject Memorizza lo stato che interessa ai ConcreteObserver Lo ritorna, in generale, con il metodo getState() nel caso Java NOTA: Bisogna chiamare notify() allinterno di setState() Al termine della modifica di stato il cambiamento viene notificato a tutti gli osservatori, anche a chi lha prodotto

Partecipanti: ConcreteObserver Mantiene un riferimento ad un oggetto ConcreteSubject di interesse In realtà un singolo osservatore può guardare più soggetti Memorizza lo stato Quello che dovrebbe essere sincronizzato/aggiornato Implementa linterfaccia Observer Implementa il metodo update(), questultimo aggiorna lo stato memorizzato per mantenere la sincronia

Collaborazioni: iscrizione aConcreteSubject aConcreteObserver attach(this) notify () update() anotherConcrete Observer getState()

Collaborazioni: aggiornamento aConcreteSubject aConcreteObserver setSate() notify () update() anotherConcrete Observer getState()

Conseguenze Disaccoppiamento tra le classi Il Subject conosce solo linterfaccia Observer (non chi losserva) Per ricevere le notifiche un oggetto qualunque deve solo implementare linterfaccia Observer Broadcast I messaggi possono essere notificati a tutti gli Observer chiamando notify() Si possono rimuovere e aggiungere Observer a piacere Il problema degli update non attesi Gli Observer non si conoscono Non possono sapere i reali effetti di operazioni compiute sul Subject Possono esserci effetti a cascata di aggiornamenti e sincronizzazioni,anche incompleti

Problemi implementativi

1) Tracciare le dipendenze Mantenere le associazioni Il Subject tiene traccia di tutti i propri Observer Necessario per sapere a chi mandare le notifiche Efficiente nel caso ideale (pochi Subject, molti Observer) Il sovraccarico delle strutture dati può diventare significativo se la situazione è invertita (pochi Observer e molti Subject) Strutture associative per mappare Subject e Observer (es. Hash Table) Risparmio dello spazio, ma penalità nel tempo

2) Tanti Subject Tante cose da osservare Un Observer può essere interessato alle notifiche di più Subject Un oggetto che necessità di più strutture dati per funzionare Es. Un grafico che rappresenta le relazioni tra due entità In questo caso potrebbe essere utile passare loggetto come parametro della notifica per rendere evidente chi è stato modificato

3) Responsabilità Chi è il responsabile di iniziare linvio di notifiche? Il Subject Le operazioni che modificano lo stato delloggetto chiamano notify() LObserver può ignorare il problema Più operazioni di questo tipo causano molti update consecutivi Possibile inefficienza Sicuri problemi con il multithreading! Gli Observer Chiamano notify() quando hanno finito di modificare lo stato Più efficiente, più facile gestire il multithreading Più responsabilità per gli Observer, che a questo punto diventano dei client non più passivi del Subject Meno sicuro

4) Distruttori Distruzione del Subject In generale, la soluzione migliore è notificare la situazione agli Observer Non è detto che gli Observer debbano essere distrutti per forza Se osservano più soggetti? Modifica opportuna al distruttore della classe Subject E IN JAVA?????

Altri problemi Auto-consistenza del Subject Prima del notify() tutti gli aggiornamenti devono essere completi Non utilizzare protocolli specifici di aggiornamento Modello push, il Subject inoltra informazioni sulla modifica Più efficiente, ma meno riusabile Modello pull, il Subject delega laggiornamento agli osservatori Meno efficiente, ma più riusabile Osservatori interessati Per migliorare lefficienza gli Observer potrebbero fornire al momento delliscrizione a cosa sono interessati del Subject

Quando ci sono troppi problemi ChangeManager è unistanza del pattern Mediator ed essendo unico nellapplicazione potrebbe essere un Singleton

Implementazione ESEMPIO: Un count down java import java.util.Observable; import java.util.Observer; public class Esempio{ public static void main(String[] args){ // istanzio l'oggetto osservatore e l'oggetto da osservare Osservatore osservatore = new Osservatore(); Osservato osservato = new Osservato(); // aggiungo all'oggetto da osservare l'osservatore osservato.addObserver(osservatore); // faccio partire il conto alla rovescia osservato.contoAllaRovescia(10); }

Implementazione class Osservato extends Observable { public void contoAllaRovescia(int n) { for ( ; n >= 0; n--) { // l'oggetto e' cambiato setChanged(); // notifico il cambiamento all'osservatore notifyObservers(new Integer(n)); }

Implementazione class Osservatore implements Observer { public void update(Observable oggettoOsservato, Object obj) { // ottengo il valore di n passato da notifyObservers ad update int n = ((Integer)obj).intValue(); System.out.println("" + n); }

Ultime note In Java esistono le interfacce Observer e Observable Sono deprecated dalla versione 1.1 Compatibilità retroattiva Casi molto semplici, usi in cui il meccanismo a eventi è probabilmente eccessivo Java Delegation Event Model Si definiscono listeners, event handlers