Chain of Responsibility Pattern in Python
Pass a request along a chain of handlers until one of them deals with it, like expense approvals by amount.
- Linking handlers
- Handling or passing on a request
- Changing the chain order
- 1
Approver("Lead", 100)limit 100: pass on - 2
Approver("Manager", 1000)limit 1000: Manager approved 500 - 3
next = Nonewould return "Declined"
Pass it on until someone handles it
Chain of Responsibility es un patrón de diseño que organiza los manejadores (handlers) en una cadena. Cada manejador decide si atiende la petición él mismo o si la pasa al siguiente. Un ejemplo conocido es la aprobación de gastos: las cantidades pequeñas las aprueba el jefe de equipo y las mayores suben al gerente.
Puntos clave
- Each handler checks whether it can handle the request.
- If not, it passes the request to the next handler.
- The sender does not know which handler will respond.
¿Cuándo se usa?
- Resolver problemas recurrentes de diseño de objetos con estructuras probadas.
- Desacoplar responsabilidades para facilitar la extensión y las pruebas del código.
- Usar un vocabulario de diseño común al hablar de arquitectura con el equipo.
Código de ejemplo
class Approver:
# Chain of Responsibility: offer a request to handlers in order.
def __init__(self, name, limit, next_approver=None):
self.name, self.limit, self.next = name, limit, next_approver
def approve(self, amount):
# Handle locally or pass the request along the chain.
if amount <= self.limit:
return f"{self.name} approved {amount}"
if self.next:
return self.next.approve(amount)
return "Declined"
chain = Approver("Lead", 100, Approver("Manager", 1000))
print(chain.approve(500))
Resultado de la ejecución
Manager approved 500
Explicación del código
Cada Approver tiene un límite. El jefe de equipo (Lead) solo aprueba hasta 100, así que la cantidad de 500 pasa al siguiente de la cadena, el Manager, cuyo límite es 1000. El Manager aprueba la petición y el resultado es Manager approved 500. Si nadie en la cadena puede aprobarla, el resultado es Declined.
Cambia los valores y ejecuta el programa en el compilador Python online de CodeUtility sin instalar Python.
Ejercicios de práctica
Prueba a modificar el código siguiendo las ideas de abajo. Cambiar el código y ver el resultado te ayudará a entender la lección mucho mejor que solo leerla.
- Sustituye el dominio del ejemplo conservando la estructura del patrón.
- Compara el patrón con una implementación más sencilla y explica las ventajas y desventajas.
- Escribe pruebas para cada participante antes de añadir otra implementación.