Patrones de diseño en Python

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.

  • Avanzado
  • 3 min de lectura
  • 1 ejemplo ejecutable
Lo que aprenderás
  • Linking handlers
  • Handling or passing on a request
  • Changing the chain order
approve(500)
  1. 1Approver("Lead", 100)limit 100: pass on
  2. 2Approver("Manager", 1000)limit 1000: Manager approved 500
  3. 3next = 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

  1. Each handler checks whether it can handle the request.
  2. If not, it passes the request to the next handler.
  3. 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

Ejecutar código →
main.py
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))
Obtén un botón Run para este ejemplo

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.

  1. Sustituye el dominio del ejemplo conservando la estructura del patrón.
  2. Compara el patrón con una implementación más sencilla y explica las ventajas y desventajas.
  3. Escribe pruebas para cada participante antes de añadir otra implementación.
Ejecutar en el compilador de Python →