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 instanceofcondiçõ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çãoIConfigurationElementVisitore o compilador gera erros para todas as implementações de visitantes. Cominstanceofcadeias, você precisa lembrar de todos os lugares que precisa estender com o novo elemento de configuração. Basicamente,instanceofviola o princípio DRY, pois duplica a lógica em vários lugares. - O padrão de visitantes é mais eficiente que uma cadeia de
instanceofcondições
instancia de
- A grande vantagem
instanceofé a sua flexibilidade. Por exemplo,instanceofpermite-me definir soluções especiais para diferentes subconjuntos deIConfigurationElementimplementaçõ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?