Quando pode ajudar?
Uma árvore de sintaxe pode ter nós de soma, número e variável. Se a estrutura dos nós é relativamente estável, diferentes visitors podem calcular o resultado, imprimir a expressão ou gerar código sem misturar essas tarefas nas entidades.
Exemplo em C#
public interface INo
{
T Aceitar<T>(IVisitor<T> visitor);
}
public interface IVisitor<T>
{
T VisitarNumero(Numero numero);
T VisitarSoma(Soma soma);
}
public sealed record Numero(int Valor) : INo
{
public T Aceitar<T>(IVisitor<T> visitor) => visitor.VisitarNumero(this);
}O despacho duplo escolhe a operação pela implementação do elemento e o método específico do visitor.
O trade-off central
Adicionar uma operação é simples, mas adicionar um novo tipo de elemento exige atualizar todos os visitors. Não é boa escolha quando a família de tipos muda frequentemente ou quando pattern matching resolve o problema com mais clareza. Compare com Interpreter e Composite; veja o guia GoF.