Um caso concreto
O cálculo de frete pode variar por transportadora ou região. Um grande switch espalhado pelo checkout dificulta incluir uma regra nova sem afetar as existentes.
Exemplo em C#
public interface ICalculadoraFrete
{
decimal Calcular(Pedido pedido);
}
public sealed class FreteExpresso : ICalculadoraFrete
{
public decimal Calcular(Pedido pedido) => pedido.Peso * 2.5m;
}
public sealed class Checkout(ICalculadoraFrete frete)
{
public decimal Total(Pedido pedido) => pedido.Subtotal + frete.Calcular(pedido);
}O mecanismo de composição decide qual estratégia injetar; a regra de cálculo continua isolada e pode ser testada sem o checkout.
Trade-offs
Strategy é valioso quando há variação real, mas criar uma classe para cada expressão trivial pode exagerar. Compare com State, que modela transições e comportamento condicionado pelo ciclo de vida, e veja o catálogo de padrões.