# Propósito
El patrón Chain of Responsibility (Cadena de Responsabilidad) desacopla al emisor de una solicitud de su receptor, permitiendo que más de un objeto tenga la oportunidad de manejar esa solicitud.
Esto se hace encadenando los objetos receptores y pasando la solicitud a lo largo de la cadena hasta que sea manejada.
# Problema
-
Acoplamiento Rígido: El emisor necesita conocer al receptor específico.
-
Decisión de Manejo: Una solicitud puede ser manejada de diferentes maneras según el contexto.
# Solución
-
Cadena de Handlers: Pasa la solicitud a través de una cadena; cada eslabón decide si procesa o pasa.
-
Desacoplamiento: El emisor no sabe quién resolverá la solicitud.
# Estructura
# Participantes
- Handler: Interfaz común para todos los manejadores.
- ConcreteHandler: Implementa el manejo o pasa al sucesor.
- Client: Inicia la solicitud en el primer eslabón.
# Diagrama de Secuencia
Cada receptor puede procesar algo antes de pasar la solicitud, permitiendo distribuir la funcionalidad.
# Cuándo Usarlo
-
El manejador no se conoce a priori y se debe determinar automáticamente.
-
Enviar solicitud a un grupo sin especificar el receptor explícitamente.
# Ventajas
-
verified
Desacoplamiento: Emisor y receptor no dependen uno de otro.
-
verified
Flexibilidad: Dinamismo en quién maneja la solicitud.
# Desventajas
-
warning
Rendimiento: La cadena puede ser larga.
-
warning
No Garantizado: Puede que nadie maneje la solicitud.
# Ejemplo: Soporte Técnico
Sistema de soporte multinivel: básico, intermedio y avanzado. Cada nivel resuelve o escala la incidencia.
# Código Java
abstract class SupportHandler {
protected SupportHandler next;
public void setNext(SupportHandler n) { next = n; }
public abstract void handle(SupportRequest r);
}
class BasicSupport extends SupportHandler {
public void handle(SupportRequest r) {
if (r.getLevel() <= BASIC) System.out.println("Basic handles it");
else if (next != null) next.handle(r);
}
}
# Mapeo Participantes
- SupportHandler (Handler): Interfaz abstracta.
- Basic/Intermediate/Advanced (Receiver): Clases concretas.
- Client: Inicia la solicitud.
# Conclusiones
Cada manejador tiene la oportunidad de tratar la solicitud o pasarla a lo largo de la cadena, permitiendo una resolución gradual y eficiente.
# Patrones relacionados
Composite
Se puede usar combinado para que los padres actúen como sucesores.