Patrón Chain of Responsibility en Validación de Pagos

Clase 25 de 27Curso 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:

  1. Define una interfaz o clase abstracta para los manejadores: Esta será la base para todos los elementos que participen en la cadena.

  2. Implementa cada manejador heredando de la interfaz o clase abstracta: Cada manejador tendrá su lógica de validación específica.

  3. Configura la cadena de manejadores: Establece el orden de los manejadores a medida que se procesan las solicitudes.

  4. 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.