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.