Visitor

Visitor è un design pattern comportamentale. È utilizzabile quando vogliamo aggiungere risorse a una composizione di oggetti e l’incapsulamento non è importante.

Problema

I clienti che frequentano il nostro ristorante sono sempre più interessati alla loro salute. Prima di ordinare, ci chiedono informazioni sui valori nutritivi dei piatti presenti sul menù. Alcuni clienti ci chiedono addirittura informazioni sui valori nutritivi dei singoli ingredienti.
Per sopperire a questa esigenza, la soluzione che ci viene in mente è quella di aggiungere nuovi metodi informativi ai piatti del menù MenuItem e ai loro ingredienti Ingredient:

Questa soluzione potrebbe causare l’apertura di un vaso di Pandora. Ogni volta che aggiungeremo un nuovo metodo, dovremo farlo in due posti. Inoltre, se volessimo migliorare il sistema aggiungendo una classe per le ricette, avremo un terzo posto in cui aggiungere metodi…

Soluzione

Per risolvere, aggiungiamo una classe Visitor, che “visita” ogni elemento della struttura composta Menu; la logica di attraversamento si trova nel client Traverser. Visitor è guidato da Traverser per raccogliere lo stato (attraverso il metodo getState) da tutti gli oggetti in Menu. Una volta raccolto lo stato, Traverser può chiedere a Visitor di effettuare le operazioni che desidera (ad es. getHealthRating, getCalories, ecc.). Quando è necessaria una nuova funzionalità, dovremo modificare solo il codice di Visitor.

Tutte le classi della composizione (Menu, MenuItem e Ingredient) devono solo esporre un metodo getState.

Conseguenze

Vantaggi:
• permette di aggiungere operazioni a una struttura composta senza modificarla;
• aggiungere nuove operazioni è relativamente semplice;
• il codice per le operazioni eseguite da Visitor è centralizzato.

Svantaggi:
• si rompe l’incapsulamento delle classi della composizione;
• le modifiche alle classi della composizione sono più complessi poiché coinvolgono la funzione di attraversamento.

Riferimenti

• Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides – Design Patterns. Elementi per il riuso di software a oggetti — © Pearson Education Inc. / © Pearson Paravia Bruno Mondadori, 1995-2008, pp. 333-346