Estou trabalhando em um aplicativo GUI que gera um arquivo de configuração. Eu tenho uma hierarquia de classes para o modelo de configuração e uso uma árvore de objetos dessa hierarquia em vários contextos diferentes. Atualmente, eu uso o padrão Visitor para evitar poluir minhas classes de modelo com código específico de contexto.
interface IConfigurationElement {
void acceptVisitor(IConfigurationElementVisitor visitor);
}
Em uma versão anterior, usei cadeias de instanceof
condições em vez do Visitor. Comparando as duas abordagens, vejo as seguintes trocas.
Visitante
- É mais fácil e seguro adicionar novos
IConfigurationElement
. Basta adicionar uma nova declaraçãoIConfigurationElementVisitor
e o compilador gera erros para todas as implementações de visitantes. Cominstanceof
cadeias, você precisa lembrar de todos os lugares que precisa estender com o novo elemento de configuração. Basicamente,instanceof
viola o princípio DRY, pois duplica a lógica em vários lugares. - O padrão de visitantes é mais eficiente que uma cadeia de
instanceof
condições
instancia de
- A grande vantagem
instanceof
é a sua flexibilidade. Por exemplo,instanceof
permite-me definir soluções especiais para diferentes subconjuntos deIConfigurationElement
implementações que precisam ser tratadas de maneira semelhante em alguns casos. Por outro lado, o Visitor me obriga a implementar um método para cada classe de implementação todas as vezes.
Existe uma solução comum para esse tipo de problema? Posso adaptar o Visitante de alguma forma, para fornecer uma solução comum para alguns casos?