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