terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat chain_of_responsibility.md
guest@codeandosimple: ~/blog/design-patterns $ cat chain_of_responsibility.md

Chain of Responsibility_

// "Toma la actitud de un estudiante, nunca seas demasiado viejo para hacer preguntas, nunca sepas demasiado como para aprender algo nuevo" - Og Mandino

# 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

Estructura UML Chain of Responsibility

# 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

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.

Ejemplo Soporte Técnico

# 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.