Método de estrategia: patrones de diseño de Python

El método de estrategia es un patrón de diseño de comportamiento que le permite definir la familia completa de algoritmos, encapsula cada uno y los coloca en clases separadas y también permite intercambiar objetos. Se implementa en Python reemplazando dinámicamente el contenido de un método definido dentro de una clase con el contenido de funciones definidas fuera de la clase. Permite seleccionar el algoritmo en tiempo de ejecución. Este método también se denomina Método de política .
 

Problema sin usar el método de estrategia

Imagina que creaste una aplicación para la tienda departamental. ¿Parece sencillo? Inicialmente, había un único tipo de descuento llamado On-Sale-Descuento. Asi que. todo iba con tranquilidad y no hubo dificultad para mantener una aplicación tan sencilla para un desarrollador pero conforme pasa el tiempo, el dueño de la tienda departamental demanda incluir algún otro tipo de descuento también para los clientes. Es muy fácil decir hacer estos cambios, pero definitivamente no es muy fácil implementar estos cambios de manera eficiente.
 

Solución usando el método de la estrategia

Veamos cómo podemos resolver el problema descrito anteriormente de manera eficiente. Podemos crear una clase específica que extraerá todos los algoritmos en clases separadas llamadas Estrategia . La clase real debe almacenar la referencia a una de las clases de estrategia.

Python3

"""A separate class for Item"""
class Item:
 
    """Constructor function with price and discount"""
 
    def __init__(self, price, discount_strategy = None):
         
        """take price and discount strategy"""
         
        self.price = price
        self.discount_strategy = discount_strategy
         
    """A separate function for price after discount"""
 
    def price_after_discount(self):
         
        if self.discount_strategy:
            discount = self.discount_strategy(self)
        else:
            discount = 0
             
        return self.price - discount
 
    def __repr__(self):
         
        statement = "Price: {}, price after discount: {}"
        return statement.format(self.price, self.price_after_discount())
 
"""function dedicated to On Sale Discount"""
def on_sale_discount(order):
     
    return order.price * 0.25 + 20
 
"""function dedicated to 20 % discount"""
def twenty_percent_discount(order):
     
    return order.price * 0.20
 
"""main function"""
if __name__ == "__main__":
 
    print(Item(20000))
     
    """with discount strategy as 20 % discount"""
    print(Item(20000, discount_strategy = twenty_percent_discount))
 
    """with discount strategy as On Sale Discount"""
    print(Item(20000, discount_strategy = on_sale_discount))

Producción:

Price: 20000, price after discount: 20000
Price: 20000, price after discount: 16000.0
Price: 20000, price after discount: 14980.0 

Diagrama de clase

El siguiente es el diagrama de clases para el Método de Estrategia

clase-diagrama-estrategia-método

clase-diagrama-estrategia-método

Ventajas

  • Principio abierto/cerrado: siempre es fácil introducir las nuevas estrategias sin cambiar el código del cliente.
  • Aislamiento: podemos aislar los detalles de implementación específicos de los algoritmos del código del cliente.
  • Encapsulación: las estructuras de datos utilizadas para implementar el algoritmo están completamente encapsuladas en las clases de estrategia. Por lo tanto, la implementación de un algoritmo se puede cambiar sin afectar la clase Contexto.
  • Cambio en tiempo de ejecución: es posible que la aplicación pueda cambiar las estrategias en tiempo de ejecución.

Desventajas

  • Creación de objetos adicionales: en la mayoría de los casos, la aplicación configura el contexto con el objeto de estrategia requerido. Por lo tanto, la aplicación necesita crear y mantener dos objetos en lugar de uno.
  • Conciencia entre los clientes: la diferencia entre las estrategias debe ser clara entre los clientes para poder seleccionar la mejor para ellos.
  • Aumenta la complejidad: cuando solo tenemos unos pocos algoritmos para implementar, es un desperdicio de recursos implementar el método de estrategia.

Aplicabilidad 

  • Muchas clases similares: este método es muy preferido cuando tenemos muchas clases similares que difieren en la forma en que se ejecutan.
  • Conquistando el Aislamiento: Generalmente se usa para aislar la lógica de negocios de la clase de la implementación algorítmica.

Lectura adicional: método de estrategia en Java

Publicación traducida automáticamente

Artículo escrito por chaudhary_19 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *