Patrones de diseño de software: Cadena de responsabilidad
El patrón cadena de responsabilidad es un patrón de diseño de comportamiento que te permite pasar peticiones por una cadena de controladores. Cada controlador, después de recibir una solicitud, decide procesarla o pasarla al siguiente controlador de la cadena. ¿Qué problema resuelve el patrón cadena de responsabilidad? Un problema que puede resolver el patrón cadena […]

El patrón cadena de responsabilidad es un patrón de diseño de comportamiento que te permite pasar peticiones por una cadena de controladores. Cada controlador, después de recibir una solicitud, decide procesarla o pasarla al siguiente controlador de la cadena.

¿Qué problema resuelve el patrón cadena de responsabilidad?

Un problema que puede resolver el patrón cadena de responsabilidad es el de un sistema de pedidos en línea. Imagínate que deseas restringir el acceso al sistema para que solo los usuarios autenticados puedan crear pedidos. Además, los usuarios que tienen permisos administrativos deben tener acceso completo a todos los pedidos.

En este caso, las comprobaciones deben realizarse secuencialmente.  Si la aplicación crece, y necesitas nuevas implementaciones, también necesitarás añadir nuevos pasos de validación y verificaciones adicionales.

Con tantas verificaciones, el código se infla y se vuelve desordenado. Además, cambiar una verificación puede afectar a las demás verificaciones, y reutilizar las comprobaciones, para proteger otros componentes del sistema, puede hacer que dupliques parte del código, etc..etc.. ya te puedes imaginar en lo que se está transformando el sistema.

El patrón cadena de responsabilidad se basa en transformar comportamientos particulares en objetos independientes llamados controladores. Para ello, cada comprobación debe extraerse a su propia clase con un solo método.

Cada controlador tiene un campo para almacenar una referencia al siguiente controlador de la cadena. Los controladores procesan y pasan la solicitud más adelante en la cadena. Y, por último, un controlador puede decidir no pasar la solicitud más abajo en la cadena y detener cualquier procesamiento posterior.

¿Cuándo usar el patrón cadena de responsabilidad?

Podrías utilizar el patrón Cadena de Responsabilidad en los siguientes casos:

  • Se espera que tu programa procese diferentes tipos de peticiones de varias maneras, pero los tipos exactos de peticiones y sus secuencias se desconocen de antemano
  • Es esencial ejecutar varios controladores en un orden particular
  • Se supone que el conjunto de controladores y su orden deben cambiar en tiempo de ejecución

Pros y contras del patrón cadena de responsabilidad

Los siguientes son algunos de los “pros y cons” de este patrón.

Pros

Contras

  • Puedes controlar el orden de gestión de solicitudes

  • Principio de responsabilidad única

  • Puedes desacoplar las clases que invocan operaciones de las clases que realizan operaciones

  • Principio abierto/cerrado. Puedes introducir nuevos controladores en la aplicación sin romper el código de cliente existente

  • Algunas peticiones pueden terminar sin ser atendidas

“Show me the code”

Si quieres saber más cómo funciona el patrón Cadena de Responsabilidad, puedes ver este ejemplo de refacoring.guru en PHP.

Este patrón permite que múltiples objetos gestionen la solicitud sin duplicar la clase del remitente con las clases concretas de los destinatarios. La cadena se puede componer dinámicamente en tiempo de ejecución con cualquier controlador que siga una interfaz de controlar estándar.

En el ejemplo real verás cómo se puede usar el patrón Cadena de Responsabilidad en un middleware de solicitud HTTP. Los frameworks más populares de PHP lo implementan.  

¿Utilizas el patrón Cadena de Responsabilidad en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!  

Fuentes:

  • Chain of Responsibility in PHP / Design Patterns