patrón-strategy

Volver

Última actualización: 2026-03-13 16:24


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