3. 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 Java
di Franco Guidi Polanco]
Ingegneria del Software - A.A. 2003/2004
4. 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
5. 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.
Ingegneria del Software - A.A. 2003/2004
7. 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
8. Il pattern Decorator (2/15)
• Context
Rispetto all’ esempio <<interface>>
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
9. Il pattern Decorator (3/15)
• Code example
<<interface>>
Ingegneria del Software - A.A. 2003/2004
10. Il pattern Decorator (4/15)
<<interface>>
Ingegneria del Software - A.A. 2003/2004
11. Il pattern Decorator (5/15)
<<interface>>
Ingegneria del Software - A.A. 2003/2004
16. Il pattern Decorator (10/15)
Project Manager
Project Manager
Administrative
Manager
Usa oggetti
Client Engineer
di tipo Employee
Ingegneria del Software - A.A. 2003/2004
17. 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
18. Il pattern Decorator (12/15)
• Solution: Gli attori sono:
- AbstractServiceIF
Specifica l’interfaccia degli
oggetti a cui possono essere
aggiunte funzionalità
dinamicamente
-ConcreteService
Implementa la classe a cui
possono essere aggiunte
funzionalità
- AbstractWrapper
Possiede il riferimento ad un
oggetto di tipo
AbstractServiceIF
e ne implementa l’interfaccia
- ConcreteWrapperX
Aggiungono nuove
responsabilità al
ConcreteService
Ingegneria del Software - A.A. 2003/2004
19. 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
20. 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
21. Il pattern Decorator (15/15)
• Implementation
Nessuna informazione indispensabile
• Java API usage
Pattern molto utilizzato quando si lavora con GUI
(cfr. The Design Pattern di JAMES W. COOPER)
• Related Patterns
– Delegation - Filter
– Strategy Il pattern Filter è una versione specializzata
di pattern Decoration specializzato nella
– Template Method
manipolazione di Stream di dati.
Indizio: InputStream, BufferedReader, …
Ingegneria del Software - A.A. 2003/2004