Visitor

Il Visitor permette di separare un algoritmo dalla struttura di oggetti composti a cui è applicato, in modo da poter aggiungere nuove operazioni e comportamenti senza dover modificare la struttura stessa.

Visitor è utile quando:

      • Una struttura di oggetti è costituita da molte classi con interfacce diverse ed è necessario che l'algoritmo esegua su ogni oggetto un'operazione differente a seconda dalla classe concreta dell'oggetto stesso.
      • E' necessario eseguire svariate operazioni indipendenti e non relazionate tra loro sugli oggetti di una struttura composta, ma non si vuole sovraccaricare le interfacce delle loro classi. Riunendo le operazioni correlate in ogni Visitor è possibile inserirle nei programmi solo dove necessario.
      • Le classi che costituiscono la struttura composta sono raramente suscettibili di modifica, ma è necessario aggiungere spesso operazioni sui rispettivi oggetti. Ogni intervento sulle operazioni richiede la modifica o l'estensione di un Visitor, mentre ogni modifica alle classi della struttura vincola alla ridefinizione delle interfacce di tutti i Visitor, compito che può risultare estremamente complesso nei progetti di una certa dimensione.

Visitor

Visitor dichiara un metodo visit per ogni ConcreteElement appartenente alla struttura di oggetti, in modo che ogni oggetto della struttura possa invocare il metodo visitappropriato passando un riferimento a sé (this) come parametro.

Questo permette al Visitor di identificare la classe che ha chiamato il metodo visit, eseguire il comportamento corrispondente e accedere all'oggetto attraverso la sua specifica interfaccia.

ConcreteVisitor

ConcreteVisitor implementa le operazioni visit dichiarate da Visitor perché agiscano come desiderato sulle rispettive classi. Inoltre fornisce il contesto dell'algoritmo e ne mantiene in memoria lo stato, che spesso accumula i risultati parziali ottenuti durante l'attraversamento della struttura.

Element

Element definisce un'operazione accept utilizzata per "accettare" un Visitor passato come parametro.

ConcreteElement

ConcreteElement implementa la accept definita da Element. In generale accept chiama il metodo visit del Visitor ricevuto, passando come parametro un riferimento a sé.

ObjectStructure

ObjectStructure contiene ed elenca gli elementi. Quando necessario può fornire un'interfaccia d'alto livello che permetta a Visitor di visitare i singoli Element. Può essere implementata applicando il pattern Composite, oppure utilizzando una collezione come ad esempio un array o qualsiasi altra struttura dati.

Fonte Wikipedia