Design Patterns Hands-On: Come aggiungere responsabilità e ruoli alle classi esistenti senza modificarle Domenico Ventura ...
chi era costui? Design Patterns
Un Design Pattern... <ul><li>Un design pattern è una soluzione comune, sicura  e comprovata a un problema comune e ricorre...
No code reuse... <ul><li>...with design patterns you have  experience  reuse!  </li></ul><ul><li>© Head First Design Patte...
Design Patterns: storia e eventi <ul><li>Coniati come termine da Alexander (1977) </li></ul><ul><li>Resi famosi dal libro ...
Il DECORATOR pattern Design Patterns Hands-on:
Jug Torino Lounge Bar <ul><li>Nel nostro lounge bar crescono gli affari, dobbiamo rifare il sistema informatico!! </li></u...
Le cose perbene: UML! TableOrder + totalCost() + print() + addCocktail() Has (1-n) Cocktail <<interface>> +  cost() + desc...
Un caso di test <ul><li>… e ora il codice!!! </li></ul>Tavolo 12 2 daiquiri 9,00 + 1 martini 3,70 + 1 tequila  Sr. 5,20  T...
Marketing: cocktail specials! <ul><li>Cocktail List </li></ul><ul><li>Martini Dry € 3,70 </li></ul><ul><li>Tequila Sunrise...
Marketing: cocktail specials! <ul><li>Gli special sono applicabili a tutti i cocktail, sono combinabili e possono essere o...
Ecco il primo tentativo Una vera esplosione di classi! Problemi derivanti? Cocktail <<interface>> + cost() + description()...
Riproviamo... <ul><li>Perché usare tutte queste classi? </li></ul><ul><ul><li>Non è meglio avere una classe astratta e del...
Di nuovo UML! TableOrder + totalCost() + print() + addCocktail() Has (1-n) Cocktail <<interface>> + cost() + description()...
Un altro caso di test <ul><li>… e ora il codice!!! </li></ul>Tavolo 8 1 Absolut Martini Otr (3,7+1,2+0,8)   5,70 + 2 Teq.S...
WOW! I test passano! <ul><li>Osservazioni </li></ul><ul><ul><li>Funziona??  </li></ul></ul><ul><ul><li>Ci piace? </li></ul...
Ancora quelli del Marketing! <ul><li>Cocktail List </li></ul><ul><li>Martini Dry € 3,70 </li></ul><ul><li>Tequila Sunrise ...
E il Double Cocktail? ??
O. C. P. <ul><li>Abbiamo violato l’ Open Closed Principle ! </li></ul><ul><ul><li>“ Una classe deve essere aperta alle est...
Il DECORATOR pattern <ul><li>L’ereditarietà non ci aiutato </li></ul><ul><li>Perché non partiamo da un cocktail base e poi...
Decoriamo? Delega? <ul><li>Sì, ok, ma nella pratica? </li></ul>Absolut  è un decorator, che fa da wrapper all’oggetto che ...
E il metodo cost()? 3,7 0.8 1.2 Chiamata a cost() sul decorator esterno   Chiamata a cost sull’oggetto decorato Chiamata a...
Caso di test con double <ul><li>… e ora il codice!!! </li></ul>Tavolo 4 1 Double Absolut Martini 1.8*(3,7+1,2)   8,82 + 2 ...
Decorator: cosa sappiamo <ul><li>I decorator sono dello stesso tipo degli oggetti che decorano (LSP) </li></ul><ul><li>Un ...
Decorator: definizione UML Component + aMethod() ConcreteDecorator + aMethod() Component ConcreteComponent + aMethod() Dec...
Un esempio celebre <ul><li>new  DoubleDecorator( </li></ul><ul><li>new AbsolutDecorator(new Martini())) </li></ul><ul><li>...
Un’altro esempio
Filtri sulle righe? <ul><li>Problema : implementare i filtri sulle righe di dettaglio del conto dinamicamente </li></ul><u...
Decorator e conti correnti LineDetector + detect() Component SimpleDetector + detect() DateDetector +detect() - LineDetect...
Concludendo: decorator <ul><li>aggiunge comportamenti in maniera flessibile ed efficace </li></ul><ul><li>consente di risp...
Upcoming SlideShare
Loading in …5
×

JUGTo Meeting febbario: Decorator Pattern

2,293 views

Published on

Design Patterns by examples: il Decorator, Come aggiungere nuove responsabilità e comportamenti alle classi esistenti senza modificarle. Entriamo nel Jug Torino Lounge Bar per un'implementazione pratica!
Domenico Ventura

Published in: Technology
  • Be the first to comment

JUGTo Meeting febbario: Decorator Pattern

  1. 1. Design Patterns Hands-On: Come aggiungere responsabilità e ruoli alle classi esistenti senza modificarle Domenico Ventura Il Decorator Pattern
  2. 2. chi era costui? Design Patterns
  3. 3. Un Design Pattern... <ul><li>Un design pattern è una soluzione comune, sicura e comprovata a un problema comune e ricorrente nello sviluppo del software. </li></ul><ul><li>Più difficile: </li></ul><ul><ul><li>Un pattern esprime una relazione tra un contesto, un problema e la sua soluzione (ottimale) </li></ul></ul>
  4. 4. No code reuse... <ul><li>...with design patterns you have experience reuse! </li></ul><ul><li>© Head First Design Patterns http://www.headfirstlabs.com/books/hfdp </li></ul>
  5. 5. Design Patterns: storia e eventi <ul><li>Coniati come termine da Alexander (1977) </li></ul><ul><li>Resi famosi dal libro “Design Patterns - Elements of Reusable Software” Gamma, Helm, Johnson e Vlissides(1995) (la Gang of Four) </li></ul><ul><li>Suddivisi in: </li></ul><ul><ul><li>Creational : sulla creazione degli oggetti </li></ul></ul><ul><ul><li>Structural : sulla composizione degli oggetti </li></ul></ul><ul><ul><li>Behavioural : sulla comunicazione tra oggetti </li></ul></ul>
  6. 6. Il DECORATOR pattern Design Patterns Hands-on:
  7. 7. Jug Torino Lounge Bar <ul><li>Nel nostro lounge bar crescono gli affari, dobbiamo rifare il sistema informatico!! </li></ul><ul><li>Cocktail List </li></ul><ul><li>Martini Dry € 3,70 </li></ul><ul><li>Tequila Sunrise € 5,20 </li></ul><ul><li>Caipirinha € 4,80 </li></ul><ul><li>Daiquiri € 4,50 </li></ul>
  8. 8. Le cose perbene: UML! TableOrder + totalCost() + print() + addCocktail() Has (1-n) Cocktail <<interface>> + cost() + description() Daiquiri Martini TequilaSunrise Caipirinha
  9. 9. Un caso di test <ul><li>… e ora il codice!!! </li></ul>Tavolo 12 2 daiquiri 9,00 + 1 martini 3,70 + 1 tequila Sr. 5,20 TOT. 17,90
  10. 10. Marketing: cocktail specials! <ul><li>Cocktail List </li></ul><ul><li>Martini Dry € 3,70 </li></ul><ul><li>Tequila Sunrise € 5,20 </li></ul><ul><li>Caipirinha € 4,80 </li></ul><ul><li>Daiquiri € 4,50 </li></ul><ul><li>Specials </li></ul><ul><li>Appetizers € 2,20 patatine fritte e onion rings </li></ul><ul><li>Absolut € 1,20 alcool in quantità! </li></ul><ul><li>On the rocks € 0,80 cubetti di ghiaccio </li></ul>
  11. 11. Marketing: cocktail specials! <ul><li>Gli special sono applicabili a tutti i cocktail, sono combinabili e possono essere ordinati contemporaneamente </li></ul><ul><li>Esempio: </li></ul><ul><ul><li>Un double martini on the rocks </li></ul></ul><ul><ul><li>Un double absolut Daiquiri con Appetizers </li></ul></ul><ul><ul><li>Etc. </li></ul></ul>
  12. 12. Ecco il primo tentativo Una vera esplosione di classi! Problemi derivanti? Cocktail <<interface>> + cost() + description() Daiquiri Martini TequilaSunrise Caipirinha DoubleMartini MartiniOtr AbsolutMartini AppetizerMartini DaiquiriOtr AbsolutDaiquiri AppetizerDaiquiri
  13. 13. Riproviamo... <ul><li>Perché usare tutte queste classi? </li></ul><ul><ul><li>Non è meglio avere una classe astratta e delle variabili di istanza che dicono se e quali special sono abbinati ad un cocktail?? </li></ul></ul>
  14. 14. Di nuovo UML! TableOrder + totalCost() + print() + addCocktail() Has (1-n) Cocktail <<interface>> + cost() + description() BaseCocktail + isAbsolut() + setAbsolut(); + ... + cost() + description() Daiquiri Martini TequilaSunrise Caipirinha
  15. 15. Un altro caso di test <ul><li>… e ora il codice!!! </li></ul>Tavolo 8 1 Absolut Martini Otr (3,7+1,2+0,8) 5,70 + 2 Teq.Sr con appetizers 2*(5,20 + 2,20) 14,80 + 1 Caipirinha 4,80 TOT. 25,30
  16. 16. WOW! I test passano! <ul><li>Osservazioni </li></ul><ul><ul><li>Funziona?? </li></ul></ul><ul><ul><li>Ci piace? </li></ul></ul><ul><ul><li>Cosa succede se arrivano altri specials? </li></ul></ul><ul><ul><li>E i cocktail analcolici? Che senso ha setAbsolut su un mango-tamarindo? </li></ul></ul><ul><ul><li>Altre osservazioni? </li></ul></ul>
  17. 17. Ancora quelli del Marketing! <ul><li>Cocktail List </li></ul><ul><li>Martini Dry € 3,70 </li></ul><ul><li>Tequila Sunrise € 5,20 </li></ul><ul><li>Caipirinha € 4,80 </li></ul><ul><li>Daiquiri € 4,50 </li></ul><ul><li>Specials </li></ul><ul><li>Double -20% sul prezzo doppio! </li></ul><ul><li>doppio cocktail in </li></ul><ul><li>bicchiere extra large! </li></ul><ul><li>Appetizers € 2,20 patatine fritte e onion rings </li></ul><ul><li>Absolut € 1,20 alcool in quantità! </li></ul><ul><li>On the rocks € 0,80 cubetti di ghiaccio </li></ul>
  18. 18. E il Double Cocktail? ??
  19. 19. O. C. P. <ul><li>Abbiamo violato l’ Open Closed Principle ! </li></ul><ul><ul><li>“ Una classe deve essere aperta alle estensioni ma chiusa ai cambiamenti” </li></ul></ul>
  20. 20. Il DECORATOR pattern <ul><li>L’ereditarietà non ci aiutato </li></ul><ul><li>Perché non partiamo da un cocktail base e poi lo “decoriamo” con gli special richiesti? Ad es. </li></ul><ul><ul><li>Prendiamo un oggetto Martini </li></ul></ul><ul><ul><li>“ Decoriamolo” con Absolut </li></ul></ul><ul><ul><li>“ Decoriamolo” con OnTheRocks </li></ul></ul><ul><ul><li>Chiamiamo cost() e basiamoci sulla delega per il risultato </li></ul></ul>
  21. 21. Decoriamo? Delega? <ul><li>Sì, ok, ma nella pratica? </li></ul>Absolut è un decorator, che fa da wrapper all’oggetto che decora (sfruttando il polimorfismo) OnTheRocks Absolut Martini
  22. 22. E il metodo cost()? 3,7 0.8 1.2 Chiamata a cost() sul decorator esterno Chiamata a cost sull’oggetto decorato Chiamata a cost sull’oggetto decorato € 4.7 cost() OnTheRocks cost() Absolut Martini cost()
  23. 23. Caso di test con double <ul><li>… e ora il codice!!! </li></ul>Tavolo 4 1 Double Absolut Martini 1.8*(3,7+1,2) 8,82 + 2 Daiquiri con appetizers 2*(4,50 + 2,20) 13,40 + 1 Double Caipirinha 1.8*4,80 8,64 TOT. 30,86
  24. 24. Decorator: cosa sappiamo <ul><li>I decorator sono dello stesso tipo degli oggetti che decorano (LSP) </li></ul><ul><li>Un oggetto può essere decorato, dinamicamente e a runtime, da uno o più decorator </li></ul><ul><li>Un decorator aggiunge un comportamento, delegando anche al decorato </li></ul>
  25. 25. Decorator: definizione UML Component + aMethod() ConcreteDecorator + aMethod() Component ConcreteComponent + aMethod() Decorator +aMethod() - Component decorated
  26. 26. Un esempio celebre <ul><li>new DoubleDecorator( </li></ul><ul><li>new AbsolutDecorator(new Martini())) </li></ul><ul><li>Ricorda qualcosa... </li></ul><ul><ul><li>Qualcosa che finisce in stream ? </li></ul></ul><ul><li>Le classi per I/O del JDK utilizzano il pattern decorator! </li></ul><ul><li>new BufferedInputStream(new FileInputStream(“a.txt”)) </li></ul><ul><li>new LineNumberReader(new FileReader(“b.txt”)) </li></ul>
  27. 27. Un’altro esempio
  28. 28. Filtri sulle righe? <ul><li>Problema : implementare i filtri sulle righe di dettaglio del conto dinamicamente </li></ul><ul><ul><li>Non posso sapere a priori se e quali filtri l’utente sceglie </li></ul></ul><ul><li>Risoluzione : ma con un decorator ovviamente! </li></ul>
  29. 29. Decorator e conti correnti LineDetector + detect() Component SimpleDetector + detect() DateDetector +detect() - LineDetector decorated MovementDetector +detect() - LineDetector decorated
  30. 30. Concludendo: decorator <ul><li>aggiunge comportamenti in maniera flessibile ed efficace </li></ul><ul><li>consente di rispettare OCP </li></ul><ul><li>proliferazione di classi </li></ul><ul><li>maggior complessità nell’istanziazione (Builders? Factories?) </li></ul>

×