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.