PATTERN DECORATOR Corso di Laurea Specialistica in Ingegneria Informatica Insegnamento di “Ingegneria del Software B” Ex presentazione realizzata dallo.

Slides:



Advertisements
Presentazioni simili
Il paradigma Object Oriented
Advertisements

Programmazione ad oggetti
Progettazione dei Sistemi Interattivi (A.A. 2004/05) - Lezione 2 1 Progettazione e Sviluppo di Software ad Oggetti 4 OBJECT-ORIENTED ANALYSIS Processo.
TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unit à B2 Gli oggetti: concetti avanzati.
Unified Modeling Language
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Massa Laura Mela Enrica
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Le gerarchie di tipi.
Frontespizio Economia Monetaria Anno Accademico
1 Tavolo del Patto per la crescita intelligente, sostenibile e inclusiva Il ricorso agli ammortizzatori sociali nei territori colpiti dagli eventi sismici.
DISEGNO TECNICO INDUSTRIALE
Dipartimento di Ricerca Sociale - Università del Piemonte Orientale 1 Castelli Aperti giugno 2005 Castello di Camino (AL) IL PUBBLICO DI CASTELLI.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Introduzione al linguaggio C++ 5 lezioni
1 Corso di Informatica (Programmazione) Lezione 4 (24 ottobre 2008) Architettura del calcolatore: la macchina di Von Neumann.
Corso di Informatica (Programmazione)
Introduzione al linguaggio Java
eliana minicozzi linguaggi1a.a lezione2
L.Lista Design P atterns Luca Lista. L.Lista Design Patterns Elementi di software OO riutilizzabile Piccoli insiemi di classi che collaborano implementando.
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 1 La relazione di ereditarietà Punto di vista insiemistico: la relazione di ereditarietà
Oggetti e dati primitivi Programmazione Corso di laurea in Informatica.
Approfondimento delle classi
DHTML: Modello degli Eventi 1. 2 Sommario Introduzione Evento onclick Evento onload Gestione errori con onerror Gestione mouse con levento onmousemove.
Sistemi Operativi GESTIONE DEI PROCESSI.
Strutture di controllo in C -- Flow Chart --
OGGETTI COMPOSTI Una classe può contenere riferimenti a altre classi (o anche a se stessa): public class Orologio { Counter ore, minuti; } Loggetto Orologio.
Introduzione alla modellazione di sistemi interattivi
19 Lezione 21/5/04 Composizione dell'immagine 1 COMPOSIZIONE DELLIMMAGINE.
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
2 3 4 RISERVATEZZA INTEGRITA DISPONIBILITA 5 6.
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
TECNOLOGIE DELLINFORMAZIONE E DELLA COMUNICAZIONE PER LE AZIENDE Materiale di supporto alla didattica.
1 Guida per linsegnamento nei corsi per il conseguimento del CERTIFICATO DI IDONEITÀ ALLA GUIDA DEL CICLOMOTORE.
Introduzione alla programmazione Object Oriented
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
1 Questionario di soddisfazione ATA - a. sc. 2008/09 Il questionario è stato somministrato nel mese di aprile Sono stati restituiti 29 questionari.
LE SAI LE TABELLINE? Mettiti alla prova!.
1 Questionario di soddisfazione Studenti - a. sc. 2008/09 Il questionario è stato somministrato dal mese di aprile al mese di maggio Sono stati restituiti.
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.
1Ingegneria Del Software L-A Progetto realizzato da: Luca Iannario, Enrico Baioni, Sara Sabioni. A.A. 2008/2009.
ANALYSIS & DESIGN I DESIGN PATTERNS GoF 1. I Design Patterns GoF …un momento importante durante il corso del design!
Bando di Residenza Cap Scheda ENTE 3ROL - Richieste On Line.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
1 Guida per linsegnamento nei corsi per il conseguimento del CERTIFICATO DI IDONEITÀ ALLA GUIDA DEL CICLOMOTORE.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill,
1 cin>>c8 s.r.l A.A Generalità Uno dei concetti largamente adottati negli ultimi anni dai professionisti del software in fase di sviluppo.
Esercizi Design pattern
Astrazione procedurale ed eccezioni
Programmazione ad oggetti
Lezione 1 Panoramica sui paradigmi di programmazione
Programmazione ad oggetti
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
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 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
PATTERN DECORATOR Corso di Laurea Specialistica in Ingegneria Informatica Corso Ingegneria del Software B A.A. 2008/2009 Alberto Feriotti Mat:
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
La Programmazione ad Oggetti
Corso di Algoritmi e Strutture Dati con Laboratorio Richiami di Java – parte II.
La programmazione ad oggetti
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Introduzione alle Classi e agli Oggetti in Java 1.
Transcript della presentazione:

PATTERN DECORATOR Corso di Laurea Specialistica in Ingegneria Informatica Insegnamento di “Ingegneria del Software B” Ex presentazione realizzata dallo studente Alberto Feriotti nell’a.a. 2008/2009

CLASSIFICAZIONE

SCOPO Necessità di aggiungere dinamicamente responsabilità a singoli oggetti e non all’intera classe.

MOTIVAZIONE Esempio: durante l’uso di un’interfaccia grafica, dovrebbe essere possibile aggiungere (e togliere) ai componenti grafici proprietà quali bordi o barre di scorrimento. Per ottenere l’effetto desiderato si può procedere seguendo due vie:

METODO 1 Usando l’ereditarietà. Ereditare una proprietà da una classe permette di utilizzare tale proprietà in ognuna delle sue sottoclassi.

METODO 1: Considerazioni L’ereditarietà non è un approccio flessibile in quanto la proprietà viene aggiunta staticamente a tutte le sottoclassi; il client NON può controllare come e quando “decorare” un componente.

METODO 2 Racchiudendo il componente da decorare in un altro responsabile dell’aggiunta della proprietà. L’oggetto “contenitore” si chiama DECORATOR. Approccio più flessibile.

DECORATOR: CARATTERISTICHE Interfaccia TRASPARENTE e CONFORME a quella dell’oggetto da decorare per non rivelare la sua presenza ai client. Il Decorator delega le richieste al componente decorato, svolgendo anche azioni aggiuntive.

DECORATOR: TRASPARENZA Grazie alla trasparenza è possibile annidare i decoratori in maniera ricorsiva, con conseguente possibilità di aggiungere un numero illimitato di responsabilità ad un oggetto.

STRUTTURA: Diagramma OMT

STRUTTURA: Diagramma UML ()

ESEMPIO STARBUZZ CAFFÈ (1)

ESEMPIO STARBUZZ CAFFÈ (2)

ESEMPIO STARBUZZ CAFFÈ (3) PANNA MONTATA Cost () Detto anche: Wrapper CIOCCOLATO Cost () TOP-ARABICA Cost ()

APPLICABILITÀ Quando usare Decorator: Si vuole aggiungere responsabilità a singoli oggetti. Si vuole togliere responsabilità agli oggetti L’estensione attraverso la definizione di classi specifiche non è praticabile in quanto porterebbe ad un’esplosione del numero di sottoclassi.

APPLICAZIONE DECORATOR return bevanda.cost() cost() return super.cost() + getCharge()

STRUTTURA: Diagramma OMT

STRUTTURA: Diagramma UML

PARTECIPANTI Component: definisce l’interfaccia comune degli oggetti decorati e non ConcreteComponent: definisce l’oggetto da decorare Decorator: mantiene un riferimento all’oggetto Component e definisce un’interfaccia conforme ad esso ConcreteDecorator: aggiunge responsabilità

PRO e CONTRO PRO CONTRO Maggiore flessibilità rispetto all’utilizzo dell’ereditarietà statica: Decorator permette di aggiungere responsabilità in modo dinamico (cioè in esecuzione) semplicemente collegando o scollegando i decoratori. Consente di “combinare” le responsabilità in maniera desiderata (si può anche applicare la stessa proprietà 2 volte. Es: doppio bordo). Evita di definire classi troppo complesse nella gerarchia: Decorator adotta un approccio di tipo “pagamento a consumo”; invece di supportare tutte le possibili caratteristiche in una classe complessa, le funzionalità vengono aggiunte partendo da elementi semplici e aggiungendo in maniera incrementale gli oggetti decoratori desiderati. In questo modo un’applicazione “paga solamente per le caratteristiche effettivamente utilizzate. Inoltre diventa più semplice aggiungere e togliere funzionalità ad un oggetto decorato. Un decoratore e il suo componente NON sono IDENTICI: Un Decorator si comporta come un allegato trasparente, ma dal punto di vista dell’identità componente e decoratore non sono uguali. Non si dovrebbero avere dipendenze dall’identità di un oggetto. Moltitudine di piccoli oggetti: L’utilizzo di pattern Decorator porta spesso alla creazione di sistemi composti da molti piccoli oggetti. Questi oggetti si differenziano gli uni dagli altri solo per le reciproche interconnessioni. Il sistema risultante è pertanto semplice da personalizzare da parte di chi lo ha progettato ma risulta difficile da studiare e correggere da parte di esterni.

IMPLEMENTAZIONE: ASPETTI DA CONSIDERARE DURANTE LA PROGETTAZIONE Conformità delle interfacce: l’interfaccia del decoratore deve essere conforme a quella dell’oggetto decorato; le classi ConcreteDecorator devono quindi ereditare da una superclasse comune. Omissione classe astratta Decorator: se esiste un solo tipo di decorazione o se stiamo lavorando su una gerarchia di classi preesistente è possibile omettere la classe astratta Decorator e semplificare il pattern; in questo caso le responsabilità di trasferimento delle richieste da Decorator a Component viene spostato nella classe ConcreteDecorator.

IMPLEMENTAZIONE: ASPETTI DA CONSIDERARE DURANTE LA PROGETTAZIONE Classi Component leggere: per semplificare la conformità ConcreteComponent-Decorator si fanno discendere entrambe le classi da una classe comune Component. È importante mantenere il più possibile leggera questa classe, focalizzandosi sulla definizione dell’interfaccia e rinviando la memorizzazione dei dati alle sottoclassi; in questo modo si evita di appesantire i componenti Decorator con funzionalità non necessarie. Cambiamento di “pelle” vs Cambiamento di “organi interni”: un decoratore può essere visto come un “rivestimento” che viene applicato su un oggetto in grado di modificarne il comportamento. Un ‘alternativa è fornita dal pattern Strategy: in questo caso il cambiamento avviene modificando gli “organi interni” (funzionalità interne dell’oggetto).

ESEMPIO PATTERN STRATEGY Nel Pattern Strategy il componente trasferisce parte del suo comportamento ad un oggetto Strategy separato. L'obiettivo di questa architettura è isolare un algoritmo all'interno di un oggetto. Il pattern Strategy è utile in quelle situazioni dove è necessario modificare dinamicamente gli algoritmi utilizzati da un'applicazione.

ESEMPIO PATTERN STRATEGY Il pattern Strategy permette di alterare o estendere le funzionalità di un oggetto modificando l’oggetto Strategy associato. Borderstyle è un oggetto Strategy che incapsula una strategia per il disegno del bordo. Incrementando il numero di strategie implementate con oggetti esterni è possibile ottenere un effetto simile all’annidamento ricorsivo degli oggetti Decorator.

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE Definizione dell’interfaccia comune abstract class VisualComponent { … void Draw(); }  

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE Creare il secondo livello di classi “Core”(TextView) e Decorator, entrambe in relazione IS-A con l’interfaccia VisualComponent. Decorator presenta una relazione HAS-A con VisualComponent. class TextField extends VisualComponent {             private typeAtt attribute1,attribute2;   public TextField(typeAtt a1, typeAtt a2) { attribute1=a1; attribute2=a2 }   public void Draw() {…}  } abstract class Decorator extends VisualComponent {       private VisualComponent component;                             public Decorator( VisualComponent c ) { component = c; }   public void Draw() { component.Draw(); } }

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE Creazione dei ConcreteDecorator (BorderDecorator, ScrollDecorator) sottoclassi di Decorator. class BorderDecorator extends Decorator {             private int borderwidth; public BorderDecorator( VisualComponent c, int w ) { super( c ); borderwidth = w; } public void Draw() {   super.Draw(); DrawBorder();  } private void DrawBorder( ) {…} } class ScrollDecorator extends Decorator {             private Point scrollPosition; public ScrollDecorator( VisualComponent c, Point p ) {   super( c ); scrollPosition = p;} public void Draw() {super.Draw(); DrawScrollBar();} private DrawScrollBar(){…} private void ScrollTo(Point p) {…} }

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE DrawScrollBar()

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE Il client può ora realizzare le composizioni desiderate. public class DecoratorDemo {   public static void main( String[] args ) { …      VisualComponent componenteProva = new BorderDecorator(                             new ScrollDecorator(new TextField( att1, att2 ), PointProva) , widthProva);      componenteProva.Draw(); }   }

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE Risultato:

UTILIZZI NOTI: STREAM Gli stream sono astrazioni fondamentali per capire correttamente i processi di I/O; uno stream fornisce un’interfaccia in grado di convertire un oggetto in una sequenza di bit o caratteri, rendendo così possibile il salvataggio/caricamento degli oggetti in/da file. Una semplice implementazione di ciò potrebbe essere la seguente:

UTILIZZI NOTI: STREAM Ma supponiamo di voler poter gestire anche: Compressione dello stream di dati con diversi algoritmi Convertire lo stream dei dati utilizzando una codifica a 7-bit ASCII, in modo da poter inviare il flusso attraverso canali di comunicazione ASCII. Il pattern Decorator fornisce una soluzione veloce:

UTILIZZI NOTI: STREAM La classe astratta Stream mantiene un Buffer interno e fornisce le operazioni di immissione dei dati nello stream ( PutInt(), PutString() ) e la funzione astratta per la gestione del buffer pieno HandleBufferFull(). La versione della funzione presente in FileStream sovrascrive la funzione astratta e trasferisce il buffer all’interno di un file. La classe StreamDecorator mantiene riferimento ad un oggetto Stream e inoltra le richieste ad esso. Le sottoclassi di StreamDecorator sovrascrivono il metodo HandleBufferFull e svolgono altre operazioni prima di chiamare HandleBufferFull della classe genitrice.

UTILIZZI NOTI: STREAM Creare un FileStream che comprime i suoi dati e converte i dati binari compressi in codifica 7-bit ASCII: Stream prova1 = new CompressingStream( new ASCII7Stream( new FileStream(“FileName”) ) ); prova1.PutInt(12); prova1.PutString(“stringa”);

Bibliografia E. Gamma, R. Helm, R. Johnson, J. Vlissides. Design patterns - Elements of reusable object oriented software, Addison-Wesley, 1995 http://sourcemaking.com/design_patterns/decorator/java/3 Steven John Metsker, Design Patterns Java Workbook, Addison Wesley, 2002 Elaborato C. Tosoni A.A. 2007/2008