Chain of Responsibility es un patrón de diseño de comportamiento que permite pasar solicitudes a lo largo de la cadena de manejadores potenciales hasta que uno de ellos gestiona la solicitud.
El patrón permite que varios objetos gestionen la solicitud sin acoplar la clase emisora a las clases concretas de los receptores. La cadena puede componerse dinámicamente durante el tiempo de ejecución con cualquier manejador que siga una interfaz manejadora estándar.
Ejemplos de uso: El patrón Chain of Responsibility no es un invitado habitual en el programa Java, ya que tan solo es relevante cuando el código opera con cadenas de objetos.
Uno de los casos de uso más populares para el patrón es la propagación de eventos a los componentes padre (bubbling) de las clases GUI. Otro caso de uso notable son los filtros de acceso secuencial.
Aquí tienes algunos ejemplos del patrón en las principales bibliotecas Java:
Identificación: El patrón es reconocible porque los métodos de comportamiento de un grupo de objetos invocan indirectamente los mismos métodos en otros objetos, mientras que todos los objetos siguen la interfaz común.
Acceso filtrado
Este ejemplo muestra cómo una solicitud que contiene información de usuario pasa una cadena secuencial de manejadores que realizan varias acciones, como la autenticación, autorización y validación.
Este ejemplo es un poco diferente de la versión estándar del patrón establecida por varios autores. La mayoría de ejemplos del patrón se basan en la noción de buscar el manejador adecuado, lanzarlo y salir de la cadena a continuación. Pero aquí ejecutamos todos los manejadores hasta que hay uno que no puede gestionar una solicitud. Ten en cuenta que éste sigue siendo el patrón Chain of Responsibility, aunque el flujo es un poco distinto.
middleware
middleware/Middleware.java: Interfaz de validación básica
middleware/ThrottlingMiddleware.java: Comprueba el límite de cantidad de solicitudes
middleware/UserExistsMiddleware.java: Comprueba las credenciales del usuario
middleware/RoleCheckMiddleware.java: Comprueba el papel del usuario