馃攽 Strategy


Video de BettaTech

El patr贸n de dise帽o Strategy es un patr贸n de comportamiento que permite definir una familia de algoritmos, encapsular cada uno de ellos como un objeto, y hacerlos intercambiables. Strategy permite variar los algoritmos utilizados por un objeto de manera din谩mica sin alterar el uso de los algoritmos por parte de los clientes.

Intenci贸n

El prop贸sito del patr贸n Strategy es:

  • Desacoplar un algoritmo de su clase y esconder los detalles de implementaci贸n al cliente.
  • Permitir el cambio din谩mico de comportamiento de un objeto cuando su estado interno cambia.

Uso

El patr贸n Strategy es especialmente 煤til cuando:

  • Varias versiones de un algoritmo existen, y el cliente no debe conocer los detalles de implementaci贸n.
  • La implementaci贸n de un algoritmo puede cambiar independientemente de los clientes que lo utilizan.
  • Hay m煤ltiples comportamientos condicionales y quieres evitar m煤ltiples sentencias condicionales.

Estructura

El patr贸n Strategy se compone de tres partes principales:

  1. Contexto (Context):

    • Mantiene una referencia a una estrategia concreta (ConcreteStrategy) y puede definir una interfaz que permite a la estrategia acceder a sus datos.
    • Delega el trabajo a la estrategia asociada en lugar de ejecutarlo por s铆 mismo.
  2. Estrategia (Strategy):

    • Es una interfaz o clase abstracta com煤n a todos los algoritmos concretos que forman parte de esta familia de algoritmos.
    • Declara un m茅todo usualmente llamado execute() o perform() que ser谩 implementado por cada algoritmo concreto.
  3. Estrategias Concretas (ConcreteStrategies):

    • Son implementaciones concretas de la interfaz Strategy que encapsulan cada uno de los algoritmos.
    • Cada uno define su propio m茅todo execute() o perform() con el comportamiento espec铆fico.

Ventajas

  • Flexibilidad: Al separar las estrategias y el contexto, puedes cambiar el comportamiento del contexto en tiempo de ejecuci贸n cambiando su estrategia.
  • Reutilizaci贸n: Las estrategias pueden ser reutilizadas entre diferentes contextos.
  • Principios SOLID: Strategy favorece la programaci贸n orientada a interfaces y soporta el principio de inversi贸n de dependencias, que dice que las clases de alto nivel no deber铆an depender de las clases de bajo nivel, sino de abstracciones.

Desventajas

  • Complejidad Adicional: Puede sobrecomplicar el c贸digo si se utiliza para casos que no requieren una variabilidad de comportamientos significativa.
  • Conocimiento de las Estrategias: Los clientes deben conocer las diferencias entre las estrategias para poder seleccionar la adecuada.

Ejemplo Aplicado

Un ejemplo com煤n es un sistema de pago en l铆nea donde puedes tener diferentes estrategias para procesar un pago (por ejemplo, con tarjeta de cr茅dito, PayPal, criptomoneda). El cliente selecciona la estrateg铆a de pago y el contexto (sistema de pago) utiliza la estrategia para procesar el pago sin conocer los detalles de la implementaci贸n.

Resumen

En conclusi贸n, el patr贸n Strategy es fundamental para dise帽ar sistemas flexibles y f谩cilmente extensibles, permitiendo el cambio de algoritmos en tiempo de ejecuci贸n sin gran impacto en el c贸digo cliente. Permite separar la selecci贸n de un algoritmo de su ejecuci贸n, proporcionando una serie de alternativas para realizar una tarea espec铆fica.

Estructura

image

Este diagrama UML ilustra el patr贸n de dise帽o Strategy. Cada parte del diagrama se explica a continuaci贸n:

  1. Contexto (Context):

    • La clase Context es la clase que utiliza la estrategia y tiene un m茅todo que se refiere a la estrategia, a menudo llamado algo como ContextInterface(). En la pr谩ctica, este m茅todo utilizar谩 un objeto de la estrategia para ejecutar una parte de su algoritmo.
    • Posee una referencia a la interfaz Strategy que se muestra con una l铆nea que termina en un rombo blanco, indicando una relaci贸n de asociaci贸n; la clase Context contiene o tiene acceso a un objeto Strategy.
  2. Estrategia (Strategy):

    • La clase Strategy es una interfaz o clase abstracta que define una operaci贸n com煤n para todas las estrategias concretas, denominada aqu铆 AlgorithmInterface(). Esta operaci贸n es el m茅todo que el Context va a ejecutar.
  3. Estrategias Concretas (ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC):

    • Las clases ConcreteStrategyA, ConcreteStrategyB, y ConcreteStrategyC son implementaciones concretas de la interfaz Strategy. Cada una de ellas implementar谩 AlgorithmInterface() de manera que realice un comportamiento espec铆fico del algoritmo.
    • Aunque comparten la misma operaci贸n AlgorithmInterface(), cada implementaci贸n de la operaci贸n realizar谩 probablemente acciones muy diferentes; estas diferencias representan las distintas estrategias que el Context puede utilizar.

La esencia de este diagrama es que el objeto Context puede cambiar su comportamiento en tiempo de ejecuci贸n al cambiar el objeto Strategy que est谩 utilizando sin cambiar su interfaz. Esto le permite variar su comportamiento din谩micamente al delegar detalles operativos a los objetos de estrategia, en lugar de implementar m煤ltiples comportamientos en s铆 mismo.