2015-12-30 14 views
5

È accettabile che il visitatore cambi lo stato dell'oggetto in cui opera? Questo tipo di operazione non è considerato come anti-pattern?Modello visitatore: modifica lo stato dell'oggetto?

+0

Poiché il visitatore utilizza l'oggetto, può accedere a qualsiasi metodo e proprietà pubblici. Quindi spetta a te impostare l'incapsulamento obbligatorio dell'oggetto. Il visitatore dovrebbe essere in grado sia di accedere alle proprietà di sola lettura per visualizzare qualcosa o raccogliere informazioni, sia di modificare lo stato dell'oggetto tramite chiamata di un metodo pubblico come MarkVisited() o Init(). Sembra un carico utile per il visitatore –

+0

È utile quando non si dispone del codice sorgente delle classi di terze parti. È possibile dichiarare metodi in Visitor e aggiungere un'operazione comune, che si estende su più oggetti correlati –

risposta

4

È assolutamente necessario modificare gli oggetti visitati.

Assicurati solo che la classe visitatore sia denominata in modo appropriato, quindi è ovvio che ha un effetto collaterale.

+1

Un esempio potrebbe essere un visitatore che visita ogni nodo (mostro, torre, qualsiasi cosa) e aumenta la forza (sto pensando a un gioco qui) a caso tra il 25% e il 50%. Quello è un visitatore valido che muta ciò che visita. – mawalker

2

Fintantoché il visitatore utilizza solo l'interfaccia pubblica e nessuno dei metodi di interfaccia consente al visitatore di mettere l'oggetto in uno stato non valido. Il visitatore è libero di cambiare lo stato dell'oggetto visitato.

1

Come hanno già detto le altre risposte, non c'è anti-pattern nel mutare l'oggetto durante la sua visita; ma come con tutti gli stati mutabili, bisogna fare attenzione negli scenari multi-thread. Assicurati che nessun altro thread stia mutando l'oggetto nello stesso momento del visitatore, oppure assicurati che la sincronizzazione sia corretta.