3. Problema introduttivo (1/3)
Cosa accade alle persone che “giocano più ruoli”?
Cosa accade alle persone che “giocano più ruoli”?
Ingegneria del Software - A.A. 2003/2004
6. Il pattern Delegation (1/8)
• Nome Delegation (When not to use Inheritance)
[Grand98]
• Synopsis La delega è un modo per “estendere” e riusare le
funzionalità di una classe senza ricorrere
all’ereditarietà. La nuova classe simula
l’ereditarietà utilizzando un’istanza della classe
originale per fornire le funzionalità originali. A
queste ne aggiunge di nuove.
Ingegneria del Software - A.A. 2003/2004
7. Il pattern Delegation (2/8)
• Context - Delegation è più generale dell’ereditarietà
- L’ereditarietà è utile per relazioni del tipo “is-a-
kind-of” perchè sono intrinsecamente statiche
- In relazioni tra classi più dinamiche, tipo “is-a-
role-played-by”, l’ereditarietà crea problemi
- Esempio:
Sistema per la prenotazione di biglietti
aerei che prevede passeggeri, personale di
linea, agente di vendita biglietti aerei, ecc.
Ingegneria del Software - A.A. 2003/2004
9. Il pattern Delegation (4/8)
• Forces
– L’ereditarietà è una relazione statica che non cambia nel
tempo
– Se una classe tenta di nascondere un metodo o una
variabile ereditata da una superclasse, allora quella
superclasse non dovrebbe essere estesa
– Dichiarare un classe come sottoclasse di una classe utility
può essere rischioso
• Estendendo una classe come Vector, quest’ultima potrebbe
cambiare nel tempo perdendo la compatibilità
• I client potrebbero presupporre la superclasse
(es. cast per passaggio di parametri)
• I client potrebbero richiamare i metodi pubblici della
superclasse
Ingegneria del Software - A.A. 2003/2004
10. Il pattern Delegation (5/8)
• Solution - Gli “attori” del
pattern Delegation sono:
Da Context…
– Delegator
– Delegate
… a Solution
Ingegneria del Software - A.A. 2003/2004
11. Il pattern Delegation (6/8)
• Consequences
- Vantaggi
-Aggira i problemi dell’ereditarietà
-Facile cambiare il comportamento di un
oggetto a run-time
- Svantaggi
- Meno strutturata rispetto all’ereditarietà:
relazioni tra le classi meno ovvie
• Implementation
- Implementazione banale
• Java API usage
- Le API Java presentano molti esempi di delegation
pattern.
- Alla base del modello ad eventi Java.
Ingegneria del Software - A.A. 2003/2004
12. Il pattern Delegation (7/8)
• Code example
FlightSegment
FlightSegment non estende la
classe LuggageCompartment!
Ingegneria del Software - A.A. 2003/2004
13. Il pattern Delegation (8/8)
LuggageCompartment LuggageCompartment
non estende Vector!
• Related Patterns - Molti pattern usano il principio di delega
Es. Decorator, Proxy, Observer.
Ingegneria del Software - A.A. 2003/2004