Successfully reported this slideshow.

Lezione 11 - Visitor

1,759 views

Published on

Published in: Education, Technology
  • Be the first to comment

Lezione 11 - Visitor

  1. 1. Ingegneria del Software
  2. 2. Introduzione al pattern…
  3. 3. Problema introduttivo • Si consideri una struttura che contiene un insieme eterogeneo di oggetti, su i quali bisogna applicare la stessa operazione, che però è implementata in modo diverso da ogni classe di oggetto. • Questa operazione potrebbe semplicemente stampare qualche dato dell’oggetto, formattato in un modo particolare. • Per esempio la collezione potrebbe essere un Vector che ha dentro di se oggetti String, Integer, Double o altri Vector. • Si consideri anche che l’operazione ad applicare non è in principio implementata negli oggetti appartenenti alla collezione e che questa operazione potrebbe essere ulteriormente ridefinita. Ingegneria del Software - A.A. 2003/2004
  4. 4. Possibile soluzione al problema introduttivo • Un approccio possibile sarebbe creare un oggetto con un metodo adeguato per scandire collezioni o stampare i dati dell’oggetto: Questo approccio va bene se si vuole lavorare con pochi tipi di dati, ma quando questi aumentano il codice diventa una lunga sequenza di if-then-else. Bisogna trovare un modo alternativo di applicare questa operazione a Bisogna trovare un modo alternativo di applicare questa operazione a tutti gli oggetti senza includerlanel codice delle classi degli oggetti. nel codice delle tutti gli oggetti senza includerla Software - A.A. 2003/2004 classi degli oggetti. Ingegneria del
  5. 5. Soluzione al problema introduttivo (1/3) VisitorExample java.util.Vector usa usa contiene Visitor Visitable WatcherVisitor VisitableString VisitableFloat +getString() Ingegneria del Software - A.A. 2003/2004
  6. 6. Soluzione al problema introduttivo (2/3) VisitorExample java.util.Vector usa usa contiene Visitor Visitable WatcherVisitor VisitableString VisitableFloat Ingegneria del Software - A.A. 2003/2004
  7. 7. Soluzione al problema introduttivo (3/3) VisitorExample java.util.Vector Visitor Visitable public void accept( Visitor visitor ) { visitor.visit( this ); } WatcherVisitor VisitableString VisitableFloat Ingegneria del Software - A.A. 2003/2004
  8. 8. Presentazione del pattern Visitor
  9. 9. Il pattern Visitor (1/16) • Nome Visitor [GoF95] • Synopsis Rappresenta una operazione da eseguire in una collezione di elementi di una struttura. Permette di definire nuove operazioni o modificare le esistenti senza cambiare le classi degli elementi sulle quali operano. • Context Cfr. esempio introduttivo Ingegneria del Software - A.A. 2003/2004
  10. 10. Il pattern Visitor (2/16) • Forces - Numerose operazioni possono essere eseguite sugli elementi di una struttura - Gli elementi della struttura appartengono a classi diverse - Gli elementi appartenenti alla struttura non cambiano spesso e neppure le relative classi Ingegneria del Software - A.A. 2003/2004
  11. 11. Il pattern Visitor (3/16) Ideal Solution: Visita guidata Ingegneria del Software - A.A. 2003/2004
  12. 12. Il pattern Visitor (4/16) • Client Utilizzatore di una struttura e del suo contenuto. Usa :ConcretVisitorX per eseguire computazioni sulla struttura e sul suo contenuto. • Visitor Superclasse astratta delle classi che eseguono computazioni sugli elementi di una struttura. Definisce un metodo per ogni tipo di elemento che le sue sottoclassi dovranno visitare. • ConcreteVisitorX Classi concrete di visitatori, implementano operazioni da eseguire sugli elementi della struttura. Ingegneria del Software - A.A. 2003/2004
  13. 13. Il pattern Visitor (5/16) • ObjectStructure Rappresenta l’oggetto “radice” di una struttura. La visita di un :Visitor inizia da un :ObjectStructure e poi continua sugli altri oggetti nella struttura • AbstractElement Superclasse astratta degli oggetti contenuti in una struttura. Definisce il metodo astratto accept con parametro di tipo AbstractVisitor. • ConcreteElementX Elemento di un oggetto struttura. Accetta di farsi visitare da un :ConcreteVisitorN e poi instrada il visitatore verso il successivo ConcreteElementY Ingegneria del Software - A.A. 2003/2004
  14. 14. Il pattern Visitor (6/16) • Diagramma di collaborazione della versione ideale di Visitor: Il percorso della visita è determinato dagli elementi della struttura • Vantaggi: I Visitor risultano indipendenti dalla struttura dell’oggetto struttura • Situazioni in cui è inapplicabile: – I visitatori possono modificare la struttura – Oggetti struttura troppo grandi per essere visitati completamente Ingegneria del Software - A.A. 2003/2004
  15. 15. Il pattern Visitor (7/16) Solution: Visita libera Svantaggio: Classi Visitor non Svantaggio: Classi Visitor non riutilizzabili (dipendono dalla riutilizzabili (dipendono dalla struttura dell’oggetto struttura). struttura dell’oggetto struttura). Ingegneria del Software - A.A. 2003/2004
  16. 16. Il pattern Visitor (8/16) public void accept( Visitor visitor ) { public void accept( Visitor visitor ) { visitor.visit( this ); visitor.visit( this ); }} • Il metodo accept è implementato con la tecnica del doubledispatch • single-dispatch: il metodo da eseguire dipende dal nome del metodo e dal tipo dell'oggetto su cui viene invocato (polimorfismo). • Il double-dispatch: il metodo da eseguire dipende non da uno ma da due oggetti. • Nel metodo accept l’istruzione visitor.visit(this) fa si che l'implementazione scelta del metodo visit dipenda da due classi:ConcreteVisitorN e ConcreteElementX. Infatti, prima viene scelta in modo polimorfo la classe ConcreteElementX nella chiamata di accept, poi il metodo accept sceglie in modo polimorfo la classe ConcreteVisitorN nella chiamata di visit. • Questo è l'elemento chiave del pattern del Visitor: l'operazione eseguita dipende sia dal tipo di operazione (Visitor) che dalla classe su cui viene applicata (Element). Ingegneria del Software - A.A. 2003/2004
  17. 17. Il pattern Visitor (9/16) • Consequences - Semplifica l’aggiunta di nuove operazioni - Mette insieme operazioni correlate e separa quelle non correlate - E’ scomodo aggiungere nuovi ConcreteElement - Incrina l’incapsulamento • Implementation - Chi si incarica di gestire il percorso della visita? Ingegneria del Software - A.A. 2003/2004
  18. 18. Il pattern Visitor (10/16) • Code example – Per l’implementazione si definisce l’interfaccia Visitable, che dovrà essere implementata da ogni oggetto che accetti la visita di un Visitor: Ingegneria del Software - A.A. 2003/2004
  19. 19. Il pattern Visitor (11/16) – Due concreti oggetti visitabili sono VisitableString e VisitableFloat: Ingegneria del Software - A.A. 2003/2004
  20. 20. Il pattern Visitor (12/16) – I ConcreteVisitor che sono in grado di scandire la collezione e i suoi oggetti, implementano l’interfaccia Visitor : Ingegneria del Software - A.A. 2003/2004
  21. 21. Il pattern Visitor (13/16) – Si presenta di seguito il codice della classe WatcherVisitor, che corrisponde ad un ConcreteVisitor : Ingegneria del Software - A.A. 2003/2004
  22. 22. Il pattern Visitor (14/16) – Ecco il codice di un’applicazione che gestisce una collezione eterogenea d’oggetti, e applica, tramite il WatcherVisitor, un’operazione di stampa su ogni elemento della collezione. Ingegneria del Software - A.A. 2003/2004
  23. 23. Il pattern Visitor (15/16) – Si noti che l’ultimo elemento della lista (un Double con valore uguale a 4), non implementa l’interfaccia Visitable, ed è trascurato nella scansione della collezione. Ingegneria del Software - A.A. 2003/2004
  24. 24. Il pattern Visitor (16/16) • Related Patterns Iterator, Little Language, Composite Il pattern Iterator rappresenta un’alternativa al pattern Visitor quando la struttura da navigare ha una struttura lineare Ingegneria del Software - A.A. 2003/2004
  25. 25. Domande? Ingegneria del Software - A.A. 2003/2004

×