Sul pattern Decorator



Documenti analoghi
Programmazione Object-Oriented Interfacce Ereditarietà vs Composizione Alcuni Design Patterns

Il pattern decorator. L21_DecoratorPattern 1

Esempio 2: Subtyping

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

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

Lettura e scrittura di file di dati input/output

La paninoteca. Mi resta da scrivere solo costo()

IL TEMA DELLA RIUSABILITÀ

public BankAccount() { balance = 0; } public BankAccount(double initialbalance) { balance = initialbalance; }

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

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

Sul pattern Iterator

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

Esempio: Interfacce. Gioco Interfacce

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

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

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

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à e polimorfismo

Sommario. I Uso degli oggetti 39

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

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

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Determinazione del tipo

NON ABBIAMO ANCORA CORRETTO LE PROVETTE!!!

Esercitazione sui Design Pattern. lunedì 29 aprile 13

Esempio: Interfacce. Gioco Interfacce

18 - Classi parzialmente definite: Classi Astratte e Interfacce

17 - Classi parzialmente definite: Classi Astratte e Interfacce

RICHIAMI DI PROGRAMMAZIONE A OGGETTI. Corso di Informatica Medica

Sul pattern Strategy

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

Informatica Ereditarietà Java. Ereditarietà

Ereditarietà e Polimorfismo. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Programmazione Orientata agli Oggetti in Linguaggio Java

Classi astratte Interfacce

Ingegneria del Software

Ereditarietà. Una classe, detta superclasse, può essere specializzata definendo una sottoclasse che ne contenga casi particolari.

Gerarchie e polimorfismo: liste

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

OOP Ereditarietà A. FERRARI

Overloading - Overriding

Laboratorio di Progettazione di Sistemi Software Design Patterns

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione orientata agli oggetti Subtyping e polimorfismo. Subtyping-polimorfismo

Esercitazione n 3. Capacità di analisi e di estensione di progetti esistenti Linguaggio Java:

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

Design Pattern Comportamentali

Esempi in Java di program.ne O-O

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

La classe java.lang.object

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

Gerarchia di classi Java 1

Fondamenti di informatica T-1 (A K) Esercitazione 8: classi e oggetti

Ereditarietà e Polimorfismo

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

Esonero del corso di Programmazione a Oggetti

Astrazioni sui dati : Specifica di Tipi di Dato Astratti in Java

Corso di Linguaggi di Programmazione

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

Object Oriented Design Patterns: Decorator

Gerarchia di classi Java 1

Fornisce una interfaccia unificata per un insieme di interfacce di un sottosistema, rendendo più facile l uso di quest ultimo.

Progettazione del Software

Corso sul linguaggio Java

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

Progettazione del Software

Pila 1. Pila 2. Pila 4. Pila 3. Attenti all ordine! public: Pila() { size=initialsize; defgsize =initialsize; marker=0; contenuto=new int[size]; }

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Ingegneria del Software L-A

L ereditarieta` Linguaggi di Programmazione: Paradigmi di Programmazione (Sperimentazioni)

Bank account. private double balance; 11/2/2011

Programmazione orientata agli oggetti Subtyping e polimorfismo

Esonero del corso di Programmazione a Oggetti

Programmazione orientata agli oggetti Classi astratte e interfacce

UML Diagrammi delle classi. UML Diagramma classi 1

PROGRAMMAZIONE Gerarchie di tipi: implementazioni multiple e principio di sostituzione

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

unità di compilazione

Automazione di test. Si presuppone la conoscenza del documento XML.pdf. Un package per i test automatizzati

Oggi. La programmazione strutturata - III. Sequenza e selezione. Dove siamo. Iterazione: while e do/while. Raffinamenti successivi.

Corso sul linguaggio Java

Il Linguaggio Java. Le interfacce

Guida introduttiva su Eclipse. Ing. Marco Dell'Unto

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

PROGRAMMAZIONE 2 Gerarchie di 9pi: implementazioni mul9ple e principio di sos9tuzione

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

Funzioni, Stack e Visibilità delle Variabili in C

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

Prova d Esame Compito A

Prefazione. Capitolo 1 Sistemi di elaborazione 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Programmazione ad Oggetti

R. Orsini - A. Roncato - F. Dalla Libera

Transcript:

Sul pattern Decorator 1 Introduzione Consideriamo una famosa panineria fa tre tipi di panini: al prosciutto crudo, al prosciutto cotto, al tonno. A ciascuno di questi tre tipi corrisponde un costo. Figura 1: Schema di partenza Il programma client quando vuole un prezzo fa così: Sandwich crudo = new SandwichCrudo(); double prezzo = crudo.getcost(); Se ci sono le aggiunte (pomodoro, mozzarella, lattuga, capperi,...) ai tre tipi di base, si può avere una varietà grandissima di tipi di panino. Si ha così il modello dei Figura 2, o quello di Figura 3. Ciascun tipo di panino ha un suo specifico costo. Il modello di Figura 2 è più compatto e modulare di quello di Figura 3 ma in ogni caso si tratta di una strada impercorribile quando il numero degli ingredienti cresce. Bisogna aggiungere classi e nel definire il prezzo di un panino multiingredienti occorre fare mente locale a quanto vale il prezzo della base, ecc. Se un ingrediente viene a costare di più occorre mettere mano a tutte le classi in cui c è l ingrediente. Regola Il sistema deve essere aperto alle espansioni, ma le classi devono restare chiuse! toccando solo in un punto. Col modello di Figura 3 si avrebbe questo genere di codice. Si estende aggiungendo o Sandwich crudomozzpom = new SandwichCrudoMozzarellaPomodoro(); double prezzo = crudomozzpom.getcost(); 1

Figura 2: Panini diversificati rispetto a quelli di base in funzione degli ingredienti aggiuntivi. Figura 3: Panini diversificati in base agli ingredienti principali e agli ingredienti aggiuntivi. 2 Tenere separati gli aspetti che si possono aggiungere Conviene aggiungere il costo di ciascun ingrediente a quello di base del panino, come in Figura 4. Sandwich panino = new SandwichCrudo(); panino.addingrediente(pomo); panino.addingrediente(xx); double prezzo = panino.getcost(); forall i in panino.ingredienti prezzo = prezzo + i.getcost(); Vantaggi Si può estendere quanto si vuole. Le classi sono separate. Tutto si limita ad aggiungere nuove classi nell aggregato degli ingredienti. 2

Figura 4: Panini diversificati in base ai tre tipi principali con l aggiunta di ingredienti. 2.1 Un altro modo (migliore?): il decoratore In Figura 5 c è il modello generale del decoratore. In Figura 6 il decoratore applicato al nostro esempio. Figura 5: Pattern Decorator. 3

Figura 6: Pattern Decorator nel nostro caso. Nel caso specifico. public abstract class Sandwich{ protected double cost; public abstract double getcost(); public class SandwichCrudo extends Sandwich{ public SandwichCrudo(double cost){ this.cost = cost; public double getcost(){ return cost; public abstract class IngrDecoratore extends Sandwich{ protected Sandwich component; public class Pomodoro extends IngrDecoratore{ public Pomodoro(Sandwich component){ this.component = component; double getcost(){ return component.getcost+cost; // Nel client Sandwich panino = new SandwichCrudo(); panino = new Pomodoro(panino); panino = new Lattuga(panino); panino = new Capperi(panino); //panino di base // panino + pomodoro // panino + pomodoro + lattuga // panino + pomodoro + lattuga + capperi 4

int prezzo = panino.getcost(); Vantaggi Come sopra: si può estendere quanto si vuole. Si tratta di aggiungere classi senza toccare le esistenti Il decoratore aggiunge funzionalità a un oggetto. Si può costruire una pila di decoratori: il client può limitarsi a vedere solo il frutto dell ultima decorazione. L esempio tipico è quello delle interfacce: una finestra viene decorata con una scrollbar. Il client vede solo una finestra con scrollbar e non sa che la finestra in effetti è di per sé priva di scrollbar. Definizione Il pattern Decorator aggiunge funzionalità a un oggetto dinamicamente. La decorazione è una alternativa al subclassing (all uso dell ereditarietà per differenziare-estendere le funzionalità ). 2.1.1 Confronto con la programmazione procedurale Anche per il decoratore la base concettuale è rappresentata dal polimorfismo e dalla composizione degli oggetti a runtime. Nella programmazione procedurale ciò era possibile solo in parte. Le procedure ricorsive sono esempi di decoratori che, iterativamente, lavorano sugli ingressi prodotti da una precedente chiamata. Nella programmazione procedurale non esiste un meccanismo come quello della composizione degli oggetti e pertanto l unica possibilità è quella di prevedere sequenze di chiamate a tempo di compilazione. 3 Decoratori in Java Java fa un largo uso di decoratori nel package di io. In Figura 7 viene mostrato il decoratore FilteredInputStream e due sue realizzazioni concrete Figura 7: Sopra: alcune classi nella gerarchia di input. Sotto la gerarchia per la classe InputDataStream. 5