Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Patrones de Diseño de Comportamiento

Chain of Responsibility

Pasar una solicitud por una cadena de controladores

Universidad Nacional de Rio Negro - Sede Andina

Definición

El patrón Chain of Responsibility (Cadena de Responsabilidad) es un patrón de diseño de comportamiento que evita acoplar al emisor de una solicitud con su receptor, permitiendo que múltiples objetos tengan la oportunidad de procesar la solicitud.

El patrón encadena los objetos receptores y pasa la solicitud a lo largo de la cadena hasta que un objeto la maneja o se alcanza el final de la misma.

Origen e Historia

Formalizado por el Gang of Four (GoF) en 1994, este patrón surgió de la necesidad de desacoplar los sistemas de manejo de eventos en interfaces gráficas. En estos sistemas, un evento (como un clic) puede ser manejado por el componente que lo recibe o pasar a su contenedor padre, y así sucesivamente, hasta que un elemento tome la responsabilidad de procesarlo.

Motivación

La motivación principal es reducir el acoplamiento entre el objeto que emite una petición y el conjunto de objetos que pueden resolverla. Sin este patrón, el emisor debería conocer exactamente qué objeto puede procesar su pedido, lo que genera un código rígido y difícil de extender con nuevos manejadores.

Contexto

Cuando aplica

Cuando no aplica

Consecuencias de su uso

Positivas

Negativas

Alternativas

Estructura

Diagramas

Diagrama de Clases

Diagrama de Secuencia

Ejemplos

/**
 * Solicitud a procesar.
 */
public class SolicitudAyuda {
    private String descripción;
    private int prioridad; // 1=baja, 2=media, 3=alta
    
    public SolicitudAyuda(String desc, int prior) {
        this.descripción = desc;
        this.prioridad = prior;
    }
    
    public int getPrioridad() { return prioridad; }
    public String getDescripción() { return descripción; }
}

/**
 * Manejador base.
 */
public abstract class Manejador {
    protected Manejador siguiente;
    
    public void setSiguiente(Manejador sig) { this.siguiente = sig; }
    
    public final void procesar(SolicitudAyuda solicitud) {
        if (puedeManejar(solicitud)) {
            ejecutar(solicitud);
        } else if (siguiente != null) {
            siguiente.procesar(solicitud);
        }
    }
    
    protected abstract boolean puedeManejar(SolicitudAyuda solicitud);
    protected abstract void ejecutar(SolicitudAyuda solicitud);
}

/**
 * Manejador concreto: Soporte Nivel 1.
 */
public class SoporteNivel1 extends Manejador {
    @Override
    protected boolean puedeManejar(SolicitudAyuda s) { return s.getPrioridad() == 1; }
    
    @Override
    protected void ejecutar(SolicitudAyuda s) {
        System.out.println("Nivel 1 resuelve: " + s.getDescripción());
    }
}

Ejercicios

Resumen

El Chain of Responsibility es el patrón de los “niveles de atención”. Su mayor ventaja es el desacoplamiento dinámico que permite construir tuberías de procesamiento donde cada eslabón decide su participación. Es ideal para sistemas extensibles de reglas de negocio o validaciones en cascada.

Próximo paso

Para seguir, conviene pasar a el material siguiente, donde el recorrido continúa sobre esta base.