Versioni
| Conosciuto anche comeNon ha altri nomi. IntentoIl design pattern Visitor rappresenta un' operazione che deve essere eseguita sugli elementi di una GerarchiaDiOggetti. La nuova operazione viene definita senza modificare le classi degli oggetti della gerarchia su cui opera. L'operazione che viene eseguita è determinata da 2 cose: dal tipo concreto di Visitor (ConcreteVisitor1 piuttosto che ConcreteVisitor2, ...) e dal tipo concreto del Element (ConcreteElementA pittosto che ConcreteElementB, ...). La classe ConcreteVisitor che rappresenta l'operazione è applicata a run-time alla GerarchiaDiOggetti quindi questo design pattern è classificato rispetto allo scopo (vedi ClassificazioneDeiDesignPattern#ClassiOggetti) come rivolto agli oggetti. Rispetto al fine questo design pattern è classificato tra i ClassificazioneDeiDesignPattern#Comportamentali . Diagramma UML
Un'altro diagramma equivalente qui e qui . Nota: il Client chiamerà il metodo Accept dell'oggetto che è la radice della gerarchia di oggetti, l'implementazione di questo metodo Accept provvederà a chiamare il metodo Accept di tutti gli oggetti referenziati dalla radice. MotivazioneQuando una operazione deve essere applicata ad una GerarchiaDiOggetti le cui classi appartengono ad una sola GerarchiaDiClassi (ossia hanno una classe base comune) come questa:
aggiungere una operazione (es. operation4) richiede di modificare la classe base (Parent) inserendo la nuova operazione (operation4) con le parti comuni alle varie classi derivate (Child1, Child2, Child3) per poi inserire in ognuna delle classi derivate (Child1, Child2, Child3) la nuova operazione (operation4). Quindi aggiungere una nuova operazione in questa situazione è un'operazione onerosa; nel caso in cui gli oggetti della gerarchia appartengano a diverse gerarchie di classi (ossia non abbiano una classe base comune) diventa inevitabile duplicare la logica della operazione. Applicando il design pattern Visitor in questo modo:
per aggiungere una nuova operazione è sufficiente implementare la classe Operation4. Un esempio simile è disponibile qui . Il design pattern Visitor quindi
Quando l'operazione calcola un risultato cumulativo di tutti gli oggetti della gerarchia, non può essere implementata nella singola classe ConcreteElement e quindi necessariamente deve essere delegata a una classe ConcreteVisitor. Il design pattern Visitor quindi
Esempi d'uso in .NETNessun esempio trovato. Note sulla implementazione in .NETDel codice .NET di esempio è disponibile qui . Relazione con altri design patternQuesto design pattern può essere usato per applicare una operazione a tutti gli oggetti di una struttura definita dal PatternComposite. Questo design pattern può essere applicatio per realizzare il PatternInterpreter. Vedi la mappa della RelazioneTraDesignPattern. ApprofondimentiIl design pattern Visitor pur semplificando l'aggiunta di nuove operazioni (ConcreteVisitor3) complica invece l'aggiunta di nuove classi (ConcreteElementC) che devono supportare le operazioni esistenti (ad esempio perché i loro oggetti entrano a far parte della gerarchia di oggetti che viene visitata). Quindi il design pattern Visitor è utile quando c'è una gerarchia di classi consolidata ed invece si vuole supportare l'evoluzione con nuove operazioni. Se la gerarchia di classi cambia frequentemente è meglio considerare alternative diverse. Domande di approfondimento
Link
| UGIdotNETWikiUGIdotNETWiki è il WikiWiki italiano dedicato a .NET Se è la prima volta che senti parlare di Wiki, leggi il BenvenutoAiVisitatori e WikiInUnMinuto, oppure il ManualePassoPassoDelWiki. Argomenti Recenti | ||||||||||||||||||||||||||||||||||||||
| © 2008 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali | ||||||||||||||||||||||||||||||||||||||||