Strategy Pattern (Patrón de Estrategia)
1. Definición
El Strategy Pattern es un patrón de diseño de comportamiento
definido en el libro Design Patterns (GoF).
Permite definir una familia de algoritmos, encapsular cada uno y
hacerlos intercambiables en tiempo de ejecución.
La idea principal es separar el algoritmo de la lógica que lo utiliza, permitiendo cambiar el comportamiento sin modificar el código del consumidor.
2. Problema que resuelve
Cuando un sistema tiene múltiples variantes de un comportamiento y se implementan mediante:
- múltiples
if switch- validaciones por tipo
el código se vuelve:
- difícil de mantener
- difícil de extender
- violando el Open/Closed Principle (OCP)
Ejemplo problemático:
if(type == ItemType.Activity)
ProcessActivity();
if(type == ItemType.Meal)
ProcessMeal();
if(type == ItemType.Transport)
ProcessTransport();
Cada vez que se agrega un nuevo comportamiento, el método debe modificarse.
3. Solución con Strategy
Se define una interfaz común para el algoritmo.
public interface IProcessingStrategy
{
void Process();
}
Luego se implementan distintas estrategias.
public class ActivityStrategy : IProcessingStrategy
{
public void Process()
{
Console.WriteLine("Processing Activity");
}
}
public class MealStrategy : IProcessingStrategy
{
public void Process()
{
Console.WriteLine("Processing Meal");
}
}
El contexto utiliza la estrategia sin conocer su implementación.
public class Processor
{
private readonly IProcessingStrategy _strategy;
public Processor(IProcessingStrategy strategy)
{
_strategy = strategy;
}
public void Execute()
{
_strategy.Process();
}
}
4. Ejecución
var processor = new Processor(new ActivityStrategy());
processor.Execute();
El algoritmo puede cambiarse en tiempo de ejecución simplemente cambiando la estrategia.
5. Variante común en .NET
En muchos sistemas modernos se usa una versión simplificada basada en delegates o funciones.
Dictionary<Type, Func<string, object>> strategies;
Esto se conoce como:
- Strategy Registry
- Type Map
- Table Driven Design
Permite registrar estrategias sin usar if o switch.
6. Ventajas
- Cumple Open/Closed Principle
- Reduce condicionales complejos
- Facilita agregar nuevos comportamientos
- Aumenta la reutilización de código
- Permite seleccionar algoritmos dinámicamente
7. Desventajas
- Incrementa el número de clases
- Puede agregar complejidad si hay pocas variantes
- Requiere una abstracción inicial adecuada
8. Cuándo usarlo
El patrón Strategy es útil cuando:
- Hay múltiples formas de ejecutar un algoritmo
- Se quiere evitar lógica condicional compleja
- Los algoritmos pueden cambiar en runtime
- Se desea extender comportamiento sin modificar código existente