Estoy trabajando en una aplicación GUI que genera un archivo de configuración. Tengo una jerarquía de clases para el modelo de configuración y uso un árbol de objetos de esa jerarquía en varios contextos diferentes. Actualmente, uso el patrón Visitor para evitar contaminar mis clases de modelo con código específico de contexto.
interface IConfigurationElement {
void acceptVisitor(IConfigurationElementVisitor visitor);
}
En una versión anterior, utilizaba cadenas de instanceofcondiciones en lugar de Visitor. Comparando los dos enfoques, veo los siguientes intercambios.
Visitante
- Es más fácil y seguro agregar nuevos
IConfigurationElement. Simplemente agregue una nueva declaraciónIConfigurationElementVisitory el compilador genera errores para todas las implementaciones de los visitantes. Con lasinstanceofcadenas, debe recordar todos los lugares que debe extender con el nuevo elemento de configuración. Básicamenteinstanceofviola el principio DRY ya que duplica la lógica en varios lugares. - El patrón de visitante es más eficiente que una cadena de
instanceofcondiciones.
en vez de
- La gran ventaja de
instanceofes su flexibilidad. Por ejemplo,instanceofme permite definir soluciones especiales para diferentes subconjuntos deIConfigurationElementimplementaciones que deben manejarse de manera similar en algunos casos. Por el contrario, Visitor me obliga a implementar un método para cada clase de implementación cada vez.
¿Existe una solución común para este tipo de problema? ¿Puedo adaptar el visitante de alguna manera, para poder proporcionar una solución común para algunos casos?