Sto lavorando su un'applicazione GUI che genera un file di configurazione. Ho una gerarchia di classi per il modello di configurazione e utilizzo un albero di oggetti di quella gerarchia in diversi contesti diversi. Attualmente, utilizzo il pattern Visitor per evitare di inquinare le mie classi del modello con codice specifico del contesto.
interface IConfigurationElement {
void acceptVisitor(IConfigurationElementVisitor visitor);
}
In una versione precedente ho usato catene di condizioni instanceof
invece di Visitor. Confrontando i due approcci vedo i seguenti scambi.
Visitor
- È più facile e più sicuro aggiungere nuovo
IConfigurationElement
. Basta aggiungere una nuova dichiarazione aIConfigurationElementVisitor
e il compilatore genera errori per tutte le implementazioni dei visitatori. Coninstanceof
chains devi ricordare tutti i posti che devi estendere con il nuovo elemento di configurazione. Fondamentalmenteinstanceof
viola il principio DRY in quanto duplica la logica in diversi punti. - Il modello di visitatore è più efficiente di una catena di condizioni
instanceof
instanceof
- Il grande vantaggio di
instanceof
è la sua flessibilità. Ad esempioinstanceof
mi consente di definire soluzioni speciali per diversi sottoinsiemi diIConfigurationElement
implementazioni che devono essere gestite in modo simile in alcuni casi. Al contrario, Visitor mi impone di implementare un metodo per ogni classe di implementazione ogni volta.
Esiste una soluzione comune per questo tipo di problema? Posso adattare il visitatore in qualche modo, quindi posso fornire una soluzione comune per alcuni casi?