Este é um exemplo do Padrão de Estratégia . A biblioteca fornece um analisador genérico que chama de volta à estratégia de análise fornecida pelo usuário, que permite que o analisador evite manter o estado desnecessário. As garantias adicionais relativas à sequência de invocações de método são apenas uma parte da interface que não pode ser expressa dentro do sistema de tipos como uma assinatura de método.
A intenção do padrão de estado é diferente: Permitir que um objeto mude seu comportamento quando seu estado mudar, sem condicionais excessivos. Para esse fim, cada estado é representado por uma subclasse separada. Um wrapper contém o objeto de estado atual e pode alterar o estado. Aqui, a API do analisador não tem a capacidade de alterar os retornos de chamada. No entanto, a estratégia de suprimentos pode usar o padrão de estado internamente.
A intenção do padrão de visitante é diferente: Para adicionar novas operações a uma hierarquia de classes sem alterar essas classes. O recurso de definição é uma abordagem de expedição dupla que equivale a uma baixa segura. Aqui, parece não haver uma hierarquia de classes que exija um visitante. No entanto, o analisador ou a estratégia pode usar um visitante internamente para lidar com elementos diferentes (por exemplo, para reagir de maneira diferente aos nós de texto, elemento e comentário).
Isso está relacionado ao padrão observador , já que a estratégia de análise é notificada sempre que o estado do analisador é alterado. Como parece não haver suporte para registrar observadores múltiplos , acho que a caracterização como um exemplo do padrão de estratégia é mais precisa. No entanto, essa análise baseada em retorno de chamada que você está vendo é absolutamente um tipo de análise orientada por eventos.