I visitor pattern (o modello del visitatore) è un pattern comportamentale di progettazione che permette di aggiungere nuove operazioni a una struttura di oggetti esistente senza modificarne la struttura stessa. In sostanza, separa l'algoritmo dall'oggetto su cui opera.
Come funziona:
Elemento (Element): Definisce un'interfaccia accept()
che accetta un oggetto Visitor
come argomento. Ogni classe concreta Element
implementa il metodo accept()
e chiama il metodo visit()
corrispondente dell'oggetto Visitor
che ha ricevuto.
Visitor: Definisce un'interfaccia visit()
per ogni tipo di Element
concreto. Ogni metodo visit()
prende un oggetto Element
specifico come argomento.
Visitor Concreto (ConcreteVisitor): Implementa ogni metodo visit()
definito nell'interfaccia Visitor
. Ogni metodo visit()
contiene la logica specifica da eseguire sull'elemento corrispondente.
Elemento Concreto (ConcreteElement): Implementa l'interfaccia Element
. Ogni classe concreta Element
sa come essere "visitata" da un Visitor
specifico. All'interno del metodo accept()
, viene chiamato il metodo visit()
appropriato del Visitor
.
Benefici:
Visitor
concreti) senza modificare le classi Element
. Questo rispetta il principio di Open/Closed Principle.Visitor
possono essere usati con la stessa struttura di oggetti.Svantaggi:
Element
e Visitor
.Element
cambia frequentemente, è necessario modificare tutti i Visitor
, violando il principio di Open/Closed Principle in questo caso.Esempio d'uso:
Immagina una struttura di documenti XML. Potresti avere Element
come <tag>
, <attribute>
, <text>
. Con il visitor pattern, potresti creare Visitor
che:
Concetti chiave:
Element
: Interfaccia che definisce il metodo accept()
.Visitor
: Interfaccia che definisce i metodi visit()
per ogni tipo di Element
.ConcreteVisitor
: Implementa la logica specifica per ogni elemento.ConcreteElement
: Implementa l'interfaccia Element
e sa come essere "visitato".Il pattern Visitor è utile quando si ha una struttura di oggetti che raramente cambia, ma si desidera eseguire molte operazioni diverse su quegli oggetti.