Patrón Chain of Responsibility en Validación de Pagos
Clase 25 de 27 • Curso de Patrones de Diseño y SOLID en Python
Resumen
¿Qué es el patrón de diseño Chain of Responsibility?
El Chain of Responsibility es un patrón de diseño de comportamiento diseñado para gestionar solicitudes a través de una cadena de manejadores, cada uno con una responsabilidad única. Esta cadena permite que distintas condiciones se apliquen a una solicitud en su camino a través de los diferentes manejadores. Este patrón se emplea comúnmente en sistemas que requieren pasos de validación, como servicios de pago o mecanismos de autenticación.
¿Cuándo deberíamos aplicar el patrón Chain of Responsibility?
Este patrón es ideal en situaciones donde se necesita:
- Procesar solicitudes en una serie de pasos definidos, aumentando la modularidad.
- Sistemas de validación de datos que demandan flexibilidad.
- Escenarios donde se requiere una estructura que permita autenticación, autorización o cumplimiento de requisitos específicos antes de proceder con una acción.
¿Cómo aplicar el patrón Chain of Responsibility?
Implementar este patrón en tu proyecto puede ser sencillo si sigues estos pasos:
-
Define una interfaz o clase abstracta para los manejadores: Esta será la base para todos los elementos que participen en la cadena.
-
Implementa cada manejador heredando de la interfaz o clase abstracta: Cada manejador tendrá su lógica de validación específica.
-
Configura la cadena de manejadores: Establece el orden de los manejadores a medida que se procesan las solicitudes.
-
Envía la solicitud al primer manejador: Este manejará la solicitud y la pasará al siguiente, o directamente la rechazará si no cumple con ciertos criterios.
Ejemplo de implementación con código
A continuación, un ejemplo simple en pseudocódigo para ilustrar cómo podrías implementar esta estructura:
class Validator:
def set_next(self, handler):
pass
def validate(self, data):
pass
class MontoValidator(Validator):
def validate(self, data):
if data["monto"] < 1000:
return True
return False
class TarjetaValidator(Validator):
def validate(self, data):
if data["tarjeta"] == "VISA":
return True
return False
class FraudeValidator(Validator):
def validate(self, data):
# Simulated fraud check
return not data.get("fraud", False)
monto_validator = MontoValidator()
tarjeta_validator = TarjetaValidator()
fraude_validator = FraudeValidator()
monto_validator.set_next(tarjeta_validator)
tarjeta_validator.set_next(fraude_validator)
solicitud = {"monto": 500, "tarjeta": "VISA", "fraud": False}
if monto_validator.validate(solicitud):
print("Seguimos con la solicitud")
else:
print("Solicitud rechazada")
Este ejemplo puede variar dependiendo del lenguaje de programación que uses y los detalles específicos de tu proyecto. La clave es la reutilización y claridad que este patrón introduce, permitiendo modificaciones rápidas y bajo acoplamiento entre los componentes del sistema.
Continúa aprendiendo y experimentando con patrones de diseño para mejorar la arquitectura de tus sistemas. Recuerda que la práctica constante es esencial para dominar estas técnicas y aplicarlas efectivamente en proyectos reales.