Patrón Cadena de Responsabilidad

Problema que resuelve este patrón: ¿Cómo Integrar distintos receptores que pueden atender  las peticiones emitidas por un objeto evitando el acoplamiento entre un emisor y un solo receptor?

Intención:

-Evitar acoplar el emisor de un mensaje a su receptor dándole a más de un objeto la posibilidad de manejar la solicitud. Se define una cadena de objetos, de modo que un objeto pasa la solicitud al siguiente en la cadena hasta que uno la maneja.

 

Definición - Solución:
El patrón de diseño Chain of Responsibility permite establecer una cadena de objetos receptores a través de los cuales se pasa una petición formulada por un objeto emisor. Cualquiera de los objetos receptores puede responder a la petición en función de un criterio establecido, cuando un objeto receptor responde el proceso se detiene.

•Patrón de comportamiento para objetos.
• Disminuye el acoplamiento entre el emisor de una petición y el receptor que finalmente la atiende.
• Se consigue dando a más de un objeto la oportunidad de responder a la petición.
• Los objetos receptores se encadenan y se van pasando la petición hasta que uno de ellos la atiende. 

Ejemplo 

Consideremos un sistema de ayudas sensible al contexto en una interfaz gráfica de usuario:
– El usuario puede obtener información ayuda sobre cualquier parte de la interfaz situándose sobre ella.
– La ayuda que se obtiene depende de la parte de la interfaz sobre la que se solicita y su contexto: p. ej., la ayuda que ofrece el botón de una ventana de diálogo puede no ser la misma que la que se asocia a un botón de la ventana principal de la aplicación.
– Si no existe ayuda específica sobre elemento del que se solicita (un botón, p.ej.), el sistema debería ofrecer un mensaje de ayuda más general sobre el contexto inmediato (la ventana de diálogo, p.ej.)

• La información de ayuda se organiza atendiendo a su profundidad en el contexto: de los elementos más internos a los más externos.
• El problema radica en que el objeto que finalmente proporciona la ayuda no es conocido explícitamente por el objeto solicitante.
• La idea del patrón es desacoplar los emisores de los receptores dando a diferentes objetos la posibilidad de atender peticiones.
• La petición se va pasando de un objeto a otro a lo largo de una cadena “de mando” hasta que uno de ellos la atiende:
 Solución:

Estructura:

 

Gestor
- Define una interfaz para tratar las peticiones.
- Implementa el enlace al sucesor (opcional).
GestorConcreto
- Trata las peticiones de las que es responsable
- Puede acceder a su sucesor
- Si el GestorConcreto puede manejar la petición, lo hace, en caso contrario la reenvía a su sucesor.



Observaciones:
Este patrón libera a un objeto de conocer quién atiende sus peticiones: el objeto sólo tiene que confiar en que la petición se tratará adecuadamente.
• Sin embargo, nada lo garantiza: si la petición no se atiende al final de la cadena, o ésta no está bien configurada.
• Ni el emisor ni el receptor tienen conocimiento explícito uno de otro: en vez de mantener referencias a todos los receptores, el emisor sólo mantiene una referencia a su sucesor.
• Habitualmente, en los casos susceptibles de aplicar este patrón, los enlaces que establecen la cadena de mando ya existen: patrón Compuesto o Decorador.
  
Ventajas:
  • Reduce acoplamiento
  • Proporciona flexibilidad al asignar responsabilidades