Strategy

Define una familia de algoritmos, los encapsula y los hace intercambiables.

Contexto

Calcular el envío puede hacerse por peso, por zonas o por tarifa plana. Las reglas cambian según el cliente.

Problema

Un if gigante por modo de envío crece sin control y viola OCP.

Solución

Una interfaz IShippingStrategy con una implementación por algoritmo. El cliente recibe la estrategia por inyección.

#Ejemplo en C#

public interface IShippingStrategy { decimal Calculate(Order o); }

public class FlatRate   : IShippingStrategy { public decimal Calculate(Order o) => 5m; }
public class ByWeight   : IShippingStrategy { public decimal Calculate(Order o) => o.Weight * 0.8m; }
public class ByDistance : IShippingStrategy { public decimal Calculate(Order o) => o.KmToDestination * 0.05m; }

public class Checkout
{
    private readonly IShippingStrategy _shipping;
    public Checkout(IShippingStrategy s) => _shipping = s;
    public decimal Total(Order o) => o.Subtotal + _shipping.Calculate(o);
}
Cuándo NO aplicarlo
  • Cuando solo existe una estrategia.
  • Cuando los algoritmos comparten mucho estado: el patrón fragmenta artificialmente.
Tradeoffs
Pro Contra
Cumple OCP Más clases
Cliente inyecta la estrategia Cliente debe conocer cuándo usar cuál

#behavioral #gof