Cos'è visitors?

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:

  1. 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.

  2. Visitor: Definisce un'interfaccia visit() per ogni tipo di Element concreto. Ogni metodo visit() prende un oggetto Element specifico come argomento.

  3. Visitor Concreto (ConcreteVisitor): Implementa ogni metodo visit() definito nell'interfaccia Visitor. Ogni metodo visit() contiene la logica specifica da eseguire sull'elemento corrispondente.

  4. 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:

  • Apertura/Chiusura: Permette di aggiungere nuove operazioni (aggiungendo nuovi Visitor concreti) senza modificare le classi Element. Questo rispetta il principio di Open/Closed Principle.
  • Separazione delle responsabilità: Separa la logica operativa dalla struttura dell'oggetto.
  • Riutilizzo del codice: Diversi Visitor possono essere usati con la stessa struttura di oggetti.

Svantaggi:

  • Complessità: Può rendere il codice più complesso, soprattutto se ci sono molti tipi di Element e Visitor.
  • Cambiamenti negli Elementi: Se la gerarchia degli 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:

  • Stampa l'intero documento XML.
  • Valida il documento XML.
  • Estrae informazioni specifiche dal documento XML.

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.