PATTERN DECORATOR. Corso di Laurea Specialistica in Ingegneria Informatica Insegnamento di Ingegneria del Software B

Documenti analoghi
Il pattern decorator. L21_DecoratorPattern 1

Object-Oriented Design Pattern: Decorator

Algoritmi per suddividere il testo in righe in un editor di testo

Design Patterns. Introduzione 2. Introduzione 3

Modulo 16. Introduzione ai Design Patterns. Tutte le case assolvono alla medesima funzione: offrire uno spazio abitativo

Design Pattern Comportamentali

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

A. Ferrari Object Oriented Design

Progettazione Object-Oriented

LEZIONE 10 - Design Patterns

Design Patterns. fonti: [Gamma95] e [Pianciamore03] Autori: Giacomo Gabrielli, Manuel Comparetti

Ingegneria del Software L-A

INTRODUZIONE DESIGN PATTERN STRUTTURALI ADAPTER. INGEGNERIA DEL SOFTWARE Università degli Studi di Padova. Scopo dei design pattern strutturali

INSEGNAMENTO DI INGEGNERIA DEL SOFTWARE B (5 CFU) CORSO DI LAUREA SPECIALISTICA IN INGEGNERIA INFORMATICA a.a

UML UNIFIED MODELING LANGUAGE

La paninoteca. Mi resta da scrivere solo costo()

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

Programmazione orientata agli oggetti Classi astratte e interfacce

INTRODUZIONE DESIGN PATTERN STRUTTURALI ADAPTER. INGEGNERIA DEL SOFTWARE Università degli Studi di Padova. Scopo dei design pattern strutturali

Catia Trubiani. Laboratorio di Ingegneria del Software a.a

Gerarchia di classi Java 1

La classe java.lang.object

ereditarietà e polimorfismo

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

Il PROCESSO UNIFICATO

11. Riuso del software e CBSE

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

Proprietà delle Classi e degli Oggetti in Java

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

Java Classi wrapper e classi di servizio. Classi di servizio

Proprietà delle Classi e degli Oggetti in Java

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

Fondamenti di Informatica

Ereditarietà. Linguaggi di Programmazione: Paradigmi di Programmazione. Ereditarietà. Sottoclassi. Ereditarietà. Controllo statico dei tipi

Classi astratte Interfacce

Laboratorio di Sistemi Polimorfismo Java. Prerequisiti: per la comprensione dell'articolo è necessario conoscere il concetto di Ereditarietà in Java.

Pattern GOF 2. Laboratorio di Ingegneria del Software. Andrea Bei

UML Introduzione a UML Linguaggio di Modellazione Unificato. Corso di Ingegneria del Software Anno Accademico 2012/13

RICHIAMI DI PROGRAMMAZIONE A OGGETTI. Corso di Informatica Medica

INGEGNERIA DEL SOFTWARE

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

Oggetti e classi. Cos è un oggetto

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

Classi ed Oggetti. Fondamenti di Informatica A-K

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

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

«fornire un'interfaccia per la creazione di famiglie di oggetti correlati o dipendenti senza specificare quali siano le loro classi concrete» (GoF)

Sul pattern Decorator

SOMMARIO DESIGN PATTERN

Dichiarazione di una classe. Dichiarazione ereditarietà

Informatica Ereditarietà Java. Ereditarietà

OOP Ereditarietà A. FERRARI

L ereditarieta` Riuso del software: Ereditarieta`, Composizione, Polimorfismo e Binding Dinamico Ereditarietà Ereditarietà

Corso di Progettazione del Software

Concetti principali Ereditarietà e (overriding) di metodi. Ereditarietà e costruttori Livelli di accesso protected e package La classe Object

Introduzione al corso. Obiettivo del corso

Corso Programmazione Java Standard

La fase di Progettazione

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

Il Linguaggio Java. Le interfacce

Programmazione a Oggetti Metodologie di Programmazione 14 Maggio 2012

Sul pattern Strategy

Polimorfismo. Subtyping-polimorfismo

Programmazione Orientata agli Oggetti in Linguaggio Java

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

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

LA CLASSE Data ESERCIZIO. Definiamo la classe Data che incapsuli giorno, mese e anno (tutti int)

Introduzione alla programmazione orientata agli oggetti (prima parte) Rel 1.0

Marco Faella Introduzione al corso

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

Alcune info sulle prossime lezioni

Introduzione. Java. Esempio. Esempio

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Informazioni sull esame e Regole per lo svolgimento dei progetti

Implementazione dell albero binario in linguaggio C++

IL CONCETTO DI CLASSE

Gerarchia delle classi Classi astratte Interfacce (Eccezioni) Laboratorio di Programmazione - Esercitazio 1

Ingegneria del Software

Ingegneria del Software T

Stringhe ed Array. Fondamenti di Informatica A-K

Informatica. Prof. A. Longheu. Input e Output

Introduzione...xv. Giorno 1 - Una panoramica sui concetti principali...1

INGEGNERIA DEL SOFTWARE INFORMATICA ARDIMENTO PASQUALE

Programmazione ad oggetti

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e Polimorfismo

Ereditarietà. Unità 9. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Progettazione del Software Anno Accademico 2007/08

XML e Java. Agenda. ITProject Consulting

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Il Pattern PROXY. Ex presentazione realizzata dallo studente Paolo Melchiori (matricola 65734) nell a.a

Interfacce. Organizzazione di una classe. Organizzazione di una classe. Classi di un progetto. Classi di un progetto

Informatica Interfacce Java

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.) Sapienza - Università di Roma Facoltà di Ingegneria

Transcript:

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 1

CLASSIFICAZIONE 2

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

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: 4

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

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

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

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. 8

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. 9

STRUTTURA: Diagramma OMT 10

STRUTTURA: Diagramma UML 11

ESEMPIO STARBUZZ CAFFÈ (1) 12

ESEMPIO STARBUZZ CAFFÈ (2) 13

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

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. 15

APPLICAZIONE DECORATOR return bevanda.cost() cost() return super.cost() + getcharge() 16

STRUTTURA: Diagramma OMT 17

STRUTTURA: Diagramma UML 18

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à 19

PRO e CONTRO PRO 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à a un oggetto decorato. CONTRO 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. 20

IMPLEMENTAZIONE: ASPETTI DA CONSIDERARE DURANTE LA PROGETTAZIONE 1. 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. 2. 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. 21

IMPLEMENTAZIONE: ASPETTI DA CONSIDERARE DURANTE LA PROGETTAZIONE 3. 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. 4. 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). 22

ESEMPIO PATTERN STRATEGY Nel Pattern Strategy il componente trasferisce parte del suo comportamento a 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. 23

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. 24

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

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE 2. 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 TextView extends VisualComponent { private typeatt attribute1,attribute2; public TextView(typeAtt a1, typeatt a2) { public void Draw() { } } attribute1=a1; attribute2=a2 } abstract class Decorator extends VisualComponent { private VisualComponent component; public Decorator( VisualComponent c ) { component = c; } public void Draw() { component.draw(); } } 26

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE 27

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE 3. Creazione dei ConcreteDecorator (BorderDecorator, ScrollDecorator) sottoclassi di Decorator. class BorderDecorator extends Decorator { } private int borderwidth; public BorderDecorator( VisualComponent c, int w ) { super( c ); public void Draw() { super.draw(); private void DrawBorder(int a) { } DrawBorder(borderwidth); } borderwidth = w; } 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) { } } 28

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

PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE 4. Il client può ora realizzare le composizioni desiderate. public class DecoratorDemo { public static void main( String[] args ) { VisualComponent componenteprova = new BorderDecorator( new ScrollDecorator(new TextView( att1, att2 ), PointProva), widthprova); } } componenteprova.draw(); 30

Risultato: PATTERN DECORATOR: PASSI PER LA CREAZIONE DEL CODICE 31

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 byte o caratteri, rendendo così possibile il salvataggio/caricamento degli oggetti in/da file. Una semplice implementazione di ciò potrebbe essere la seguente: 32

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: 33

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 a un oggetto Stream e inoltra le richieste a esso. Le sottoclassi di StreamDecorator sovrascrivono il metodo HandleBufferFull e svolgono altre operazioni prima di chiamare HandleBufferFull della classe genitrice. 34

UTILIZZI NOTI: STREAM Creare un FileStream che comprime i dati binari e quindi li converte in codifica 7-bit ASCII: Stream prova1 = new CompressingStream( new ASCII7Stream( new FileStream( FileName ) ) ); prova1.putint(12); prova1.putstring( stringa ); 35

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 36