Los patrones de diseño son soluciones a problemas comunes en el desarrollo de software, donde cada patrón es como una plantilla que puede ser configurada de acuerdo a una necesidad o problema particular, definen un lenguaje común que ayuda a que los equipos de desarrollo se comuniquen y trabajen de una forma más efectiva y eficiente, estos varían de acuerdo a su complejidad y nivel de detalle y usualmente se encuentran categorizados dentro de tres grupos, de acuerdo con Shvets:
- Patrones creacionales : Proveen mecanismos de creación de objetos, lo que ayuda a incrementar la flexibilidad y la reutilización del código existente.
- Patrones estructurales: Explican como ensamblar objectos y clases dentro de grandes estructuras, manteniendo estas flexibles y eficientes.
- Patrones de comportamiento: Proporcionan mecanismos para la comunicación y la asignación de responsabilidades entre objetos.
Patrón de Diseño Strategy
Strategy es un patrón de comportamiento, que permite definir un grupo de algoritmos, y ponerlos cada uno dentro de clases separadas, haciendo que los objetos se puedan intercambiar.
Imagina por ejemplo que tienes una app para una tienda en línea y buscas ofrecer descuentos especiales a los clientes con diferentes variables: fijos, algunos días de la semana, fechas especiales, entre otros, ¿Cómo podrías hacer para determinar que promoción es la mejor opción en un día en particular?
En este tipo de situaciones, el patrón de diseño Strategy puede ayudarte, pues en lugar de escribir una lógica compleja para determinar cada opción de descuento y sus variables, puedes crear una estrategia separada por cada opción y usarla según los objetivos que deseas alcanzar, de esta manera, podrias cambiar las opciones de descuento fácilmente sin afectar el resto del código en tu aplicación.
El patrón Strategy funciona creando una interfaz común para todas las estrategias, y cada estrategia implementa la interfaz a su manera, el código fuente puede usar la interfaz para acceder a cualquier estrategia y cambiar el algoritmo de manera dinámica en tiempo de ejecución.
Como se puede observar el patrón de diseño Strategy es una buena decisión a la hora de hacer lógica que es reutilizable y flexible. Ayudando a mantener el código limpio y organizado lo que hace fácil realizar cambios de comportamiento en el sistema.
Casos de uso
El patrón de diseño Strategy puede ser de gran utilidad en los siguientes casos:
- Algoritmos: Se puede usar para intercambiar algoritmos o su comportamiento de manera dinámica basado en entradas o condiciones de ambiente.
- Procesamiento de pagos: Puede ser usado para cambiar el método de pago de acuerdo con la elección del usuario.
- Precio de productos: En comercios electrónicos puede ser usado para cambiar el precio de los productos basado en los diferentes descuentos y promociones de la tienda.
- Enrutado: En aplicaciones de envíos y logística, el patrón Strategy puede ser usado para cambiar la ruta de un envío basado en condiciones de tráfico, y tiempos de envío.
Como implementar el patrón strategy
A manera de ejemplo en la app de la tienda en línea podemos agregar una opción para seleccionar el medio de transporte para el envío de un producto: Camión, barco y avión, cada opción puede tener costos diferentes:
- Crear la interfaz ShippingMethod que define el método para calcular los gastos de envío:

2. Crear la implementación del método de la interfaz por cada método de envío

3. Crear la función shippingGateway que usa el patrón de diseño strategy

4. Crear la función calculate que implementa la interfaz ShippingMethod para calcular los gastos de envío
5. Por último se adiciona un ejemplo del código realizado para una mayor comprensión.
En este caso se seleccionó la estrategia Car, y por último se ejecutó la función calculate, que ejecuta el método calculateShippingFee el cual se encuentra implementado en todos los demás objetos.
Conclusión
El patrón de diseño Strategy es flexible y robusto, ayuda a romper el código en pequeñas piezas, reducieno la complejidad lógica del código y permitiendo que este sea más fácil de mantener y actualizar.
Bibliografía
1- Strategy Design Pattern, Avinash Tingre, https://medium.com/javarevisited/strategy-design-pattern-a-smart-way-to-make-decisions-c8f8c37e3aec 2- Strategy, refactoring guru, https://refactoring.guru/design-patterns/strategy