Um caso familiar

Uma requisição HTTP pode passar por autenticação, autorização, logging e tratamento de erros. Cada middleware tem uma responsabilidade e a ordem altera o resultado.

Exemplo simplificado em C#

public abstract class Validador
{
    protected Validador? Proximo { get; private set; }
    public Validador Encadear(Validador proximo) { Proximo = proximo; return proximo; }
    public virtual void Validar(Pedido pedido)
    {
        ValidarAtual(pedido);
        Proximo?.Validar(pedido);
    }
    protected abstract void ValidarAtual(Pedido pedido);
}

Em código real, represente interrupção, resultados e cancelamento com tipos explícitos; evite falhas silenciosas quando ninguém da cadeia tratar a solicitação.

Trade-offs

A cadeia reduz dependências diretas, mas torna o fluxo dependente da configuração e da ordem. Registre a composição claramente e teste caminhos em que o processamento termina cedo. Frameworks de middleware já oferecem esse mecanismo em muitos cenários. Compare com Command e consulte o catálogo GoF.