Contexto
He estado usando con una jerarquía de objetos (un árbol de expresión) un patrón de visitante "pseudo" (pseudo, ya que en él no se usa el envío doble):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
Este diseño fue, sin embargo cuestionable, bastante cómodo ya que la cantidad de implementaciones de MyInterface es significativa (~ 50 o más) y no necesité agregar operaciones adicionales.
Cada implementación es única (es una expresión u operador diferente), y algunos son compuestos (es decir, nodos de operador que contendrán otros nodos de operador / hoja).
El recorrido se realiza actualmente llamando a la operación Aceptar en el nodo raíz del árbol, que a su vez llama Aceptar en cada uno de sus nodos secundarios, que a su vez ... y así sucesivamente ...
Pero ha llegado el momento en que necesito agregar una nueva operación , como una bonita impresión:
public class MyImpl : MyInterface
{
// Property does not come from MyInterface
public string SomeProperty { get; set; }
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
public void Accept(SomePrettyPrinter printer)
{
printer.PrettyPrint(this.SomeProperty);
}
}
Básicamente veo dos opciones:
- Mantener el mismo diseño, agregando un nuevo método para mi operación a cada clase derivada, a expensas de la capacidad de mantenimiento (no es una opción, en mi humilde opinión)
- Use el patrón de visitante "verdadero", a expensas de la extensibilidad (no es una opción, ya que espero tener más implementaciones en el camino ...), con aproximadamente más de 50 sobrecargas del método de visita, cada una de las cuales coincide con una implementación específica ?
Pregunta
¿Recomendaría usar el patrón de visitante? ¿Hay algún otro patrón que pueda ayudar a resolver este problema?
MyInterface
... ¿todas esas clases tienen una implementación única de DoSomething
y DoSomethingElse
? No veo dónde está su clase visitante atraviesa realmente la jerarquía - se parece más a una facade
en el momento ..