Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Strutturali 1
Alfredo Milani
Dipartimento di Matematica e Informatica
Università degli Studi di Perugia
Sommario
Pattern di progetto
Cosa sono
Perché studiarli
Classificazione
Catalogo dei pattern
Classificazioni dei pattern
I pattern strutturali
2
Bibliografia
[GoF] E. Gamma, R. Helm, R. Johnson, J. Vlissides (GoF,
Gang of Four), Design Patterns – Elements of
Reusable Object-Oriented Software, Addison Wesley,
1994 (anche in Italiano)
[ST] A. Shalloway & J. R. Trott, Design Patterns
Explained, Addison Wesley, 2002
[M] S. J. Metsker, Design Patterns Java Workbook,
Addison wesley, 2002 (anche in italiano)
Didatticamente:
Esempi di buon software OO
Pattern : Programmazione OO =
Strutture controllo : Programmazione strutturata
“I pattern sono l’equivalente della
programmazione strutturata nel caso OO”
Professionalmente
Utili per pensare a un livello più alto
Vocabolario, terminologia
4
Tre categorie
Strutturali
Strutture tipiche
Comportamentali
Gestione di comportamenti
Creazionali
Come creare oggetti in modo controllato
Discusse, esistono alternative
5
Classificazione dei pattern
Strutturali Creazionali Comportamentali
1. Adapter 8. Factory 13. Template Method
(Adattatore) Method (Metodo sagoma)
2. Façade (Metodo 14. Strategy (Strategia)
(Facciata) fabbrica) 15. State (Stato)
3. Composite 9. Abstract
16. Command (Comando)
(Composto) Factory
(Fabbrica 17. Observer (Osservatore)
4. Decorator 18. Mediator (Mediatore)
(Decoratore) astratta)
10. Singleton 19. Memento (Memento,
5. Bridge Ricordo)
(Ponte) (Singoletto)
11. Prototype 20. Iterator (Iteratore)
6. Proxy
(Proxy) (Prototipo) 21. Visitor (Visitatore)
12. Builder 22. Chain of Responsibility
7. Flyweight
(Peso piuma) (Costruttore) (Catena di responsabilità)
© A. Milani - Design 23. Interpreter (Interprete) 6
pattern
1. Adapter (Adattatore)
7
Scopo
Dati:
Un cliente che si aspetta
una classe/oggetto che fornisce certi servizi
con una certa interfaccia (nome di classe, metodi e
loro segnature)
Una classe che
fornirebbe quei servizi
ma ha un’interfaccia diversa da quella attesa
Adapter adatta l’interfaccia diversa a quella
attesa
8
Esempio (1/3)
Figura
Gerarchia…
+ set Posiz ione()
+ get Posiz ione()
+ display()
+ riem pi()
+ set Colore()
9
Esempio (2/3)
Vogliamo aggiungere Cerchio
Lo implementiamo da zero? Circle
Fatica inutile…
Usiamo la classe Circle? + di splayIt()
+ fill(c : Color)
Ha un’interfaccia diversa… + set Center()
Creiamo un adattatore
(Nota: non possiamo modificare Circle…)
Non abbiamo il sorgente
È usato così com’è
…
10
Esempio (3/3)
Figura
- colore : Color
+ setPosizione()
+ getPosizione()
+ display()
+ riempi()
+ setColore()
+ displayIt()
+ fill(c : Color)
display -> circle.displayIt() + setCenter()
riempi() -> circle.fill(colore)
11
Considerazioni
12
Due tipi di Adapter
13
Diagramma Class Adapter
<<Interface>> Adatt ato
Cliente
Obiettivo
+ m'()
+ m()
Obiettivo x; ClassAdapter
...
x.m(); m -> thi s.m '();
+ m()
14
Diagramma Object Adapter
Cliente Obiettivo Adattato
+ m() + m'()
ObjectAdapter
Obiettivo x;
... -adattato
x.m(); + m()
m -> adattato.m'()
16
2. Façade (facciata)
Scopo
Rendere più semplice l’uso di un sistema
Fornire un’unica interfaccia per un insieme di
funzionalità “sparse” su più interfacce/classi
17
Esempi
18
Diagramma Façade
sottosistema
C1
Cl ie nt Facade
C4
C2
C5 C6
C3
19
Vantaggi Façade
20
Commenti
È un pattern facile
Spesso ha solo metodi statici
Façade, utilità e demo
Façade
Utilità (utility) in UML
Classe con solo metodi statici
Demo
Classe che mostra come usare una classe o un
(sotto)sistema
Di solito è un’applicazione (giocattolo) autonoma
21
Façade vs. Adapter
22
3. Composite (Composto)
Scopo
Comporre oggetti in strutture ricorsive ad albero
per rappresentare gerarchie parte-tutto
e consentire ai clienti di trattare in modo
uniforme oggetti singoli/semplici e composizioni
di oggetti
È un bel pattern
23
Esempio (1/5)
Programma di grafica
Deve consentire di
Creare oggetti semplici (Punto, Linea, Cerchio,…)
Raggruppare dinamicamente oggetti semplici in
oggetti composti (4 linee in un rettangolo, …)
Trattare gli oggetti composti come se fossero
oggetti semplici
24
Esempio (2/5)
Raggruppare quattro linee per fare un
rettangolo
Raggruppare N linee per fare una
serpentina
Raggruppare un rettangolo e una
serpentina…
…
…Proviamo a fare un diagramma
UML…
25
Esempio (3/5)
1o tentativo: cos’è che non va?
Gruppo
Figura 0.. *
+ add( : Figura)
-componenti + remove( : Figura)
+ draw() + draw()
for (...) {
Punto Linea Cerchi o
componenti.draw();
}
+ draw() + draw() + draw()
+ draw()
:Gruppo Linea
Serpent ina
Rettangolo
:Gruppo
l0: Lin ea :Gruppo
29
Diagramma Composite
Component
Cl ient
+ operation()
+ add() n
+ remove()
+ getChildren()
Leaf Composite
+ operation() + operation()
+ add() -children
+ remove()
+ getChilldren()
30
Commenti
Semplifica il cliente, che tratta strutture
composte e singoli oggetti in modo uniforme
In tutti i punti in cui il cliente si aspetta un
oggetto primitivo, gli si può passare un oggetto
composto
Interfaccia di Component
Massimizzazione → flessibilità: il Client non
distingue oggetti atomici e composti. Però, che
implementazione per add su una foglia?
Minimizzazione → sicurezza: no problem per add
sulle foglie, però interfacce diverse…
31
Commenti
Leaf e Composite possono:
essere astratte
avere sottoclassi (ed è facile aggiungerne…)
Cicli (contenimento di se stesso, mutuo
contenimento) possono causare ricorsione ∞
nelle visite
Memorizzare i nodi visitati…
Usato in java.awt: Component e
Container
Può rendere il progetto troppo generico
32
4. Decorator (Decoratore)
Scopo
Aggiungere dinamicamente a un oggetto
responsabilità/funzionalità/operazioni
Alternativa (più flessibile) alla creazione di
sottoclassi per l’estensione di funzionalità
(anche la specializzazione può aggiungere
responsabilità/funzionalità/operazioni)
33
Esempio
Come ottenerlo?
34
Aggiungere responsabilità
AreaDiTesto
staticamente?
AreaDiTesto AreaDiTestoC onB ar
Ereditarietà ConBordo raScorrimento
+ draw()
+ draw() + draw()
draw() ->
decorato.draw()
DecoratoreBordo DecoratoreBarra
- spessoreBordo Scorrimento
- posizioneScroll
+ draw()
draw() -> + drawBorder() + draw()
super. draw(); + scrollTo() draw() ->
drawBorder(); s crol lTo();
s uper. draw();
37
Diagramma degli oggetti
Catena con
Varie decorazioni
Alla fine, un’istanza di AreaDiTesto
new DecoratoreBordo(
new DecoratoreBarraScorrimento(
new AreaDiTesto()))
new DecoratoreBarraScorrimento(
new DecoratoreBordo(
new AreaDiTesto()))
z:Decoratore
Bordo -decorato
y:DecoratoreBarra
Scorrimento -decorato
x:AreaDiTesto
38
Diagramma Decorator
Cliente Componente
+ operazione() 1
+ operazione() + operazione()
operazione ->
deco rato.op erazione()
Decoratore2 Decoratore1
- statoAggiunto
+ operazione()
+ com portam entoAgg iunti vo() + operazione()
operazione ->
super.ope razi one();
comport amentoAggiunt o();
39
Decoratore vs. ereditarietà
Dinamico (run time) Statico (compile time)
Senza vincoli per il Con vincoli per il
client (può client (non può
inventarsi combinazioni inventarsi combinazioni
non previste) non previste)
Aggiunge responsabilità Aggiunge responsabilità
a un singolo oggetto a (tutte le istanze di)
una classe
Evita esplosione Può causare esplosione
combinatoria combinatoria
40
Usi tipici del Decorator
Stream Java
Interfacce utente grafiche
Componente grafica
area di testo, finestra, panel, …
decorata con
bordo, barra di scorrimento, …
(eventualmente più di uno!)
Non usata nelle Swing di Java
JComponent ha setBorder
41
Decorator vs. Composite
42
Decorator vs. Adapter
Decorator
Arricchisce di funzionalità senza modificare
l’interfaccia
modifica le responsabilità di un oggetto, non la
sua interfaccia
Adapter modifica l’interfaccia di un oggetto
(può anche arricchire, aggiungere
responsabilità/funzionalità, ma in modo limitato)
43