Sul pattern Decorator
|
|
|
- Giorgia Salvatori
- 9 anni fa
- Просмотров:
Транскрипт
1 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
2 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
3 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
4 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
5 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à ) 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
Esempio 2: Subtyping
Esempio 2: Subtyping 22 Subclassing e subtyping Fino ad ora abbiamo trattato l ereditarietà come strumento che consente il riuso flessibile di classi già esistenti mediante l aggiunta o la ridefinizione
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Ing. Gianluca Caminiti Sommario ( OOP ) Programmazione Object-Oriented Incapsulamento, Ereditarietà, Polimorfismo Richiami
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi
Esempio: Interfacce. Gioco Interfacce
Esempio: Interfacce 1 Descrizione Si supponga di avere delle carte da gioco. Ogni carta rappresenta un Personaggio che può essere di tipo o Umano o Mostro. Un Personaggio di tipo Umano ha una forza fisica
ereditarietà e polimorfismo
ereditarietà e polimorfismo Java ereditarietà o l ereditarietà permette di definire nuove classi partendo da classi sviluppate in precedenza o la nuova classe viene definita esprimendo solamente le differenze
Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.
OO in Java: classi astratte, interfacce, classi interne Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro [email protected] Programmazione,
Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo
Esempi al calcolatore su: 1) 2) Subtyping e polimorfismo 1 Esempio 1: 2 Introduzione Java prevede due automatismi legati ai costruttori: Se una classe non ha costruttori viene creato automaticamente il
Esempio: Interfacce. Gioco Interfacce
Esempio: Interfacce 1 Descrizione Si supponga di avere delle carte da gioco. Ogni carta rappresenta un Personaggio che può essere di tipo o Umano o Mostro. Un Personaggio di tipo Umano ha una forza fisica
18 - Classi parzialmente definite: Classi Astratte e Interfacce
18 - Classi parzialmente definite: Classi Astratte e Interfacce Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/
Ingegneria del Software
Ingegneria del Software Analisi Object Oriented ed Elementi di Programmazione OO Origini Le metodologie ad oggi nascono negli anni 70 ma si affermano solo nelgi anni 80 grazie alla nascita dei linguaggi
A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas
Classi e oggetti A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas Oggetti La programmazione orientata agli oggetti, OOP (Object-Oriented Programming),
Overloading - Overriding
1 Overloading - Overriding Overloading: Funzioni con uguale nome e diversa firma possono coesistere. move(int dx, int dy) move(int dx, int dy, int dz) Overriding: Ridefinizione di una funzione in una sottoclasse
Laboratorio di Progettazione di Sistemi Software Design Patterns
TITLE Laboratorio di Progettazione di Sistemi Software Design Patterns Valentina Presutti (A-L) Riccardo Solmi (M-Z) 1 Indice degli argomenti Tipi di Design Patterns Creazionali Strutturali Comportamentali
Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà
L ereditarietà è il meccanismo attraverso cui viene implementata la relazione di specializzazione (is-a). L ereditarietà è il meccanismo attraverso cui una classe (derivata) eredita da un altra classe
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Classi e Oggetti: Metafora Parte a versione 2.2 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Design Pattern Comportamentali
Design Pattern Comportamentali Focalizzano sul controllo del flusso tra oggetti Descrivono le comunicazioni tra oggetti Aiutano a valutare le responsabilità assegnate agli oggetti Suggeriscono modi per
Esempi in Java di program.ne O-O
Esempi in Java di program.ne O-O Ereditarietà Polimorfismo statico e dinamico Esercitazione laboratorio Interfaccia Comparable e Comparator 1 Gerarchia di ereditarietà Persona IS_A Docente Studente Tecnico
La classe java.lang.object
La classe java.lang.object In Java: Gerarchia di ereditarietà semplice Ogni classe ha una sola super-classe Se non viene definita esplicitamente una super-classe, il compilatore usa la classe predefinita
Interfacce. Esempio: interfaccia I con una sola funzione g() public interface I {
Interfacce Una interfaccia è un astrazione per un insieme di funzioni pubbliche delle quali si definisce solo la segnatura, e non le istruzioni. Un interfaccia viene poi implementata da una o più classi
Ereditarietà e Polimorfismo
Ereditarietà e Polimorfismo Riusare il software A volte si incontrano classi con funzionalità simili In quanto sottendono concetti semanticamente vicini È possibile creare classi disgiunte replicando le
Progettazione del Software
Progettazione del Software Simulazione di esame Domenico Fabio Savo Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Sapienza Università di Roma Anno Accademico 2015/2016
Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)
Programmazione ad Oggetti Modulo A (Esame del 11/9/2015) Esercizio 1 Considerate la seguente gerarchia di classi: class A { public void print(string s) { System.out.println(s); public void m1() { print("a.m1");
Programmazione orientata agli oggetti Classi astratte e interfacce
Programmazione orientata agli oggetti Classi astratte e interfacce Fondamenti di Informatica L-B 1 Classi astratte Java ci consente di definire classi in cui uno o più metodi non sono implementati, ma
UML Diagrammi delle classi. UML Diagramma classi 1
UML Diagrammi delle classi UML Diagramma classi 1 Diagramma delle classi Non è nei nostri obiettivi affrontare UML nel suo complesso Ci concentreremo sui diagrammi delle classi che ci forniscono un linguaggio
Il Linguaggio Java. Le interfacce
Il Linguaggio Java Le interfacce Ordinamento dei conti PROBLEMA: si vogliono ordinare i libretti di risparmio (SavingsAccount) in base al loro tasso di interesse REQUISITO: La classe dovrebbe essere ordinabile,
Guida introduttiva su Eclipse. Ing. Marco Dell'Unto [email protected]
Guida introduttiva su Eclipse Ing. Marco Dell'Unto [email protected] Introduzione Eclipse è un ambiente di sviluppo (IDE) multilinguaggio e multipiattaforma scritto in Java. E Open Source. Può
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali
Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali 1 Ereditarietà, polimorfismo e altri sporchi trucchi Facciamo un esempio che ci permette di comprendere come vengono utilizzate
Funzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso
Prefazione. Capitolo 1 Sistemi di elaborazione 1
Prefazione XI Capitolo 1 Sistemi di elaborazione 1 1.1 Algoritmo 1 1.2 Esecuzione 3 1.3 Memoria 4 1.4 Calcolo meccanico 5 1.5 Capacità di calcolo 7 1.6 Computer 8 Domande di verifica 11 Esercizi 11 Capitolo
Programmazione ad Oggetti
Programmazione ad Oggetti Java Eccezioni Eccezioni in breve Un eccezione è un oggetto che descrive una situazione anomala o di errore L eccezioni vengono lanciate da una parte di un programma e possono
