Contexto
Eu tenho usado com uma hierarquia de objetos (uma árvore de expressão) um padrão de visitante "pseudo" (pseudo, pois ele não usa expedição dupla):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
Esse design era, no entanto questionável, bastante confortável, pois o número de implementações do MyInterface é significativo (~ 50 ou mais) e eu não precisava adicionar operações extras.
Cada implementação é única (é uma expressão ou operador diferente) e algumas são compostas (por exemplo, nós do operador que conterão outros nós do operador / folha).
No momento, o Traversal é executado chamando a operação Accept no nó raiz da árvore, que por sua vez chama Accept em cada um dos nós filhos, que por sua vez ... e assim por diante ...
Mas chegou a hora de adicionar uma nova operação , como uma bonita impressão:
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);
}
}
Basicamente, vejo duas opções:
- Manter o mesmo design, adicionando um novo método para minha operação a cada classe derivada, às custas da manutenção (não uma opção, IMHO)
- Use o padrão Visitante "true", à custa da extensibilidade (não uma opção, pois espero ter mais implementações ao longo do caminho ...), com mais de 50 sobrecargas do método Visit, cada uma correspondendo a uma implementação específica ?
Questão
Você recomendaria usar o padrão Visitor? Existe algum outro padrão que possa ajudar a resolver esse problema?
MyInterface
.. todas essas classes têm uma implementação exclusiva de DoSomething
e DoSomethingElse
? Não vejo onde sua classe visitante realmente atravessa a hierarquia - que mais parece um facade
no momento ..