Chain of Responsibility

Pasa una solicitud por una cadena de manejadores hasta que uno la procesa.

Contexto

Una request HTTP debe pasar por: autenticación → rate-limit → validación → logging → handler. Cada paso puede continuar o cortar.

Problema

Si los pasos están acoplados, no puedes reordenarlos ni reutilizarlos.

Solución

Cada manejador conoce solo al siguiente; decide si procesa, delega o ambos.

#Ejemplo en C#

public abstract class Middleware
{
    private Middleware? _next;
    public Middleware LinkWith(Middleware next) { _next = next; return next; }

    public virtual bool Handle(Request r) => _next?.Handle(r) ?? true;
}

public class AuthMiddleware : Middleware
{
    public override bool Handle(Request r)
    {
        if (r.User is null) { r.Response = "401"; return false; }
        return base.Handle(r);
    }
}
public class RateLimitMiddleware : Middleware
{
    public override bool Handle(Request r) =>
        r.Hits < 100 ? base.Handle(r) : (r.Response = "429") is not null && false;
}
Cuándo NO aplicarlo

Cuando la cadena tiene siempre los mismos pasos en el mismo orden: un método secuencial es más simple.

Tradeoffs
Pro Contra
Reordenar y reutilizar pasos Difícil saber quién procesó la request
Encaja con pipelines (HTTP, MediatR) Riesgo de loops o no procesarse

#behavioral #gof #chain