馃攽 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:
-
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.
-
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()
operform()
que ser谩 implementado por cada algoritmo concreto.
-
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()
operform()
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
Este diagrama UML ilustra el patr贸n de dise帽o Strategy. Cada parte del diagrama se explica a continuaci贸n:
-
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 comoContextInterface()
. 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 claseContext
contiene o tiene acceso a un objetoStrategy
.
- La clase
-
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 elContext
va a ejecutar.
- La clase
-
Estrategias Concretas (ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC):
- Las clases
ConcreteStrategyA
,ConcreteStrategyB
, yConcreteStrategyC
son implementaciones concretas de la interfazStrategy
. 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 elContext
puede utilizar.
- Las clases
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.