lezione 07 - decorator
TRANSCRIPT
Ingegneria del Software
Introduzione al pattern…
Ingegneria del Software - A.A. 2003/2004
Esempio introduttivo (1/3)
• Si pensi ad un modello di oggetti che rappresenta gli impiegati (Employee) di una azienda. Tra gli impiegati esistono , ad esempio, gli Ingegneri (Engineer) che implementano le operazioni definite per gli impiegati, secondo le proprie caratteristiche.
[GoF’s Design Patterns in Javadi Franco Guidi Polanco]
Ingegneria del Software - A.A. 2003/2004
Esempio introduttivo (2/3)
• Il sistema comprende la possibilità di assegnare agli impiegati delle responsabilità:- un impiegato può diventare capoufficio(Administrative Manager)
- ad un impiegato può essere assegnata la direzione di un progetto(Project Manager)
• Le responsabilità non sono esculenti tra di loro e possono essere assegnate più volte.
• Questi cambiamenti di tipologia di alcuni impiegati coinvolgono modifiche delle responsabilità definite per gli oggetti, alterandone le esistenti o aggiungendone nuove.
Ingegneria del Software - A.A. 2003/2004
Esempio introduttivo (3/3)
• Esempio di risultato atteso:
• E’ interessante definire un modo per aggiungere, ed eventualmente rimuovere, dinamicamente nuove responsabilità ad un oggetto specifico di tipo Employee.
Presentazione del pattern Decorator
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (1/15)
• Nome Decorator [GoF95], conosciuto anche con il nome di pattern Wrapper.
• Synopsis Il pattern Decorator estende dinamicamente le funzionalità di un oggetto in maniera trasparente ai suoi client.
GoF sintetizza il pattern Decorator in questo modo:
“Attach additional responsabilities to an object dinamically. Decorators provide a flexible alternative to subclassing for extending functionality”
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (2/15)
<<interface>>• Context
Rispetto all’ esempio introduttivo:- Employee, specifica l’interfaccia degli impiegati a cui possono essere assegnate responsabilità dinamicamente- Engineer, implementa la classe di impiegati a cui possono essere affidate responsabilità- ResponsibleWorker, possiede il riferimento ad un oggetto Employee e ne implementa l’interfaccia- AdministratorManager e ProjectManager aggiungono nuove responsabilità all’Employee
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (3/15)
<<interface>>• Code example
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (4/15)
<<interface>>
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (5/15)
<<interface>>
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (6/15)
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (7/15)
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (8/15)
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (9/15)
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (10/15)
Project Manager
Project Manager
AdministrativeManager
Usa oggetti
di tipo EmployeeEngineerClient
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (11/15)
• Forces- E’ necessario estendere le funzionalità di una
classe, ma ci sono ragioni per non farlo attraverso l’ereditarietà
- E’ necessario aggiungere ed eventualmente rimuovere dinamicamente funzionalità ad un oggetto
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (12/15)
• Solution: Gli attori sono:
- AbstractServiceIFSpecifica l’interfaccia degli oggetti a cui possono essere aggiunte funzionalità dinamicamente
-ConcreteServiceImplementa la classe a cui possono essere aggiunte funzionalità
- AbstractWrapperPossiede il riferimento ad un oggetto di tipo AbstractServiceIF e ne implementa l’interfaccia
- ConcreteWrapperXAggiungono nuove responsabilità alConcreteService
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (13/15)
• Consequences
- A differenza dell’ereditarietà, che determina la natura di tutte le istanze di una classe staticamente, il pattern Decorator permette di alterare dinamicamente ed individualmente il comportamento di oggetti aggiungendo e rimuovendo wrapper
- Usando differenti combinazioni di pochi tipi di wrapper è possibile ottenere molti comportamenti diversi. Utilizzando l’ereditarietà è possibile ottenere lo stesso risultato solo estendendo una classe per ogni comportamento
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (14/15)
- L’estrema flessibilità degli oggetti wrapper può essere fonte di errore (combinazioni sbagliate, riferimenti circolari, ecc.)
- Rispetto all’ereditarietà utilizzare il pattern Decorator implica:
- Usare meno classi (progettazione e implementazione semplificata)
- Usare più oggetti (debugging più difficoltoso)
Ingegneria del Software - A.A. 2003/2004
Il pattern Decorator (15/15)
• ImplementationNessuna informazione indispensabile
• Java API usagePattern molto utilizzato quando si lavora con GUI (cfr. The Design Pattern di JAMES W. COOPER)
• Related Patterns– Delegation– Strategy– Template Method
- FilterIl pattern Filter è una versione specializzata di pattern Decoration specializzato nella manipolazione di Stream di dati.Indizio: InputStream, BufferedReader, …
Ingegneria del Software - A.A. 2003/2004
Domande?