Lezione 07 - Decorator

22
Ingegneria del Software

Transcript of Lezione 07 - Decorator

Page 1: Lezione 07 - Decorator

Ingegneria del Software

Page 2: Lezione 07 - Decorator

Introduzione al pattern…

Page 3: Lezione 07 - Decorator

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]

Page 4: Lezione 07 - Decorator

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.

Page 5: Lezione 07 - Decorator

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.

Page 6: Lezione 07 - Decorator

Presentazione del pattern Decorator

Page 7: Lezione 07 - 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”

Page 8: Lezione 07 - Decorator

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

Page 9: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (3/15)

<<interface>>• Code example

Page 10: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (4/15)

<<interface>>

Page 11: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (5/15)

<<interface>>

Page 12: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (6/15)

Page 13: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (7/15)

Page 14: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (8/15)

Page 15: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (9/15)

Page 16: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Il pattern Decorator (10/15)

Project Manager

Project Manager

AdministrativeManager

Usa oggetti

di tipo EmployeeEngineerClient

Page 17: Lezione 07 - Decorator

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

Page 18: Lezione 07 - Decorator

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

Page 19: Lezione 07 - Decorator

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

Page 20: Lezione 07 - Decorator

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)

Page 21: Lezione 07 - Decorator

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, …

Page 22: Lezione 07 - Decorator

Ingegneria del Software - A.A. 2003/2004

Domande?