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:
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 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 definisce un'operazione accept utilizzata per "accettare" un Visitor passato come parametro.
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 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.