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