Skip to main content

Chan Of Responsibility

Chain of Responsibility permite encadenar pasos independientes que procesan una solicitud en orden, donde cada paso decide continuar o cortar, sin que el emisor conozca quién ejecuta cada parte.

👉 No modela el negocio.

👉 Modela la política de ejecución del negocio.

¿Se usa hoy en arquitectura hexagonal?

Sí, pero no en el Domain.

✔ Vive en:

  • application
  • use cases
  • pipelines
  • flows

❌ No vive en:

  • Entidades
  • Value Objects
  • Agregados

En Hexagonal:

El Chain orquesta reglas del dominio, no las contiene.

Cómo se implementa hoy (vs GoF)

GoF (clásico)

  • Cada handler conoce al siguiente
  • Lógica + control de flujo mezclados
  • Orientado a OO puro

Hoy (industria real)

  • Chain como pipeline
  • Handlers pequeños y sin lógica de negocio
  • Reglas delegadas al dominio
  • Ensamblado externo (factory / config)

Nombres tipo:

  • Step
  • Filter
  • Middleware

👉 El patrón se usa, pero no se nombra.

Anti-ejemplo típico

if (validateStock(order)) {
if (checkFraud(order)) {
if (applyDiscount(order)) {
confirm(order);
}
}
}

❌ Flujo rígido

❌ No extensible

❌ Cambiar el orden rompe todo

❌ No es testeable por partes

Reemplazo (si existe)

No tiene un “reemplazo directo”, pero alternativas según el problema:

NecesidadMejor opción
Solo reglasSpecification
Algoritmos distintosStrategy
Flujo fijoTemplate Method
Muchas reglas dinámicasRule Engine
Estado complejoState Machine

👉 Chain se usa cuando el orden importa y puede cambiar.

Ejemplo (resumido)

Order Processing Chain

→ Stock Policy

→ Fraud Policy

→ VIP Discount

→ Confirm Order

Cada paso ejecuta o falla

  • El dominio decide qué es válido
  • El Chain decide cuándo se aplica

👉 Ver implementación completa en GitHub: https://github.com/MaxiCorrea/java-chain-of-responsibility

Regla de oro

Si necesitás flags para saltear pasos, necesitás otra Chain.

Y otra más:

Si el Chain tiene lógica de negocio, está mal ubicado.

Frase final

Chain of Responsibility no es un patrón de dominio. Es una herramienta para diseñar flujos que cambian sin romper el sistema.

Ver video

Chain of responsibility in Java