O padrão Strategy permite definir uma família de algoritmos, encapsulá-los em classes separadas e torná-los intercambiáveis. O objeto que usa o algoritmo pode selecionar qual estratégia usar em tempo de execução. É útil quando você tem múltiplas formas de realizar uma operação e deseja alternar entre elas de forma flexível, como diferentes formas de ordenar uma lista ou calcular um preço.
Exemplo de Código em C#:
// Interface de Estratégia
public interface ICalculoPreco
{
decimal CalcularPreco(decimal precoBase);
}
// Implementação de uma estratégia para preço normal
public class PrecoNormal : ICalculoPreco
{
public decimal CalcularPreco(decimal precoBase)
{
return precoBase;
}
}
// Implementação de uma estratégia para desconto
public class PrecoComDesconto : ICalculoPreco
{
private decimal _percentualDesconto;
public PrecoComDesconto(decimal percentualDesconto)
{
_percentualDesconto = percentualDesconto;
}
public decimal CalcularPreco(decimal precoBase)
{
return precoBase - (precoBase * _percentualDesconto / 100);
}
}
// Implementação de uma estratégia para preço premium
public class PrecoPremium : ICalculoPreco
{
public decimal CalcularPreco(decimal precoBase)
{
return precoBase + (precoBase * 0.20m); // Adiciona 20% ao preço
}
}
// Classe que utiliza uma estratégia de cálculo de preço
public class Produto
{
private ICalculoPreco _estrategiaPreco;
private decimal _precoBase;
public Produto(ICalculoPreco estrategiaPreco, decimal precoBase)
{
_estrategiaPreco = estrategiaPreco;
_precoBase = precoBase;
}
public void DefinirEstrategia(ICalculoPreco estrategiaPreco)
{
_estrategiaPreco = estrategiaPreco;
}
public void ExibirPrecoFinal()
{
Console.WriteLine($"Preço final: {_estrategiaPreco.CalcularPreco(_precoBase)}");
}
}
class Program
{
static void Main(string[] args)
{
// Criar um produto com preço base de 100
Produto produto = new Produto(new PrecoNormal(), 100);
// Exibir preço com estratégia normal
produto.ExibirPrecoFinal(); // Saída: Preço final: 100
// Alterar para a estratégia de desconto e exibir o preço
produto.DefinirEstrategia(new PrecoComDesconto(10)); // 10% de desconto
produto.ExibirPrecoFinal(); // Saída: Preço final: 90
// Alterar para a estratégia de preço premium e exibir o preço
produto.DefinirEstrategia(new PrecoPremium());
produto.ExibirPrecoFinal(); // Saída: Preço final: 120
}
}
Explicação do Código:
Neste exemplo, temos três estratégias diferentes para calcular o preço de um produto: PrecoNormal, PrecoComDesconto e PrecoPremium. A classe Produto utiliza uma dessas estratégias para calcular o preço final. O método DefinirEstrategia permite trocar a estratégia de cálculo de preço em tempo de execução. No código principal, o preço do produto é calculado com as três estratégias diferentes.
Conclusão:
O padrão Strategy é útil quando você deseja que um objeto tenha múltiplas formas de realizar uma operação e quer tornar essas opções intercambiáveis. Ele ajuda a separar a lógica de diferentes algoritmos, permitindo maior flexibilidade e reutilização de código.
Código fonte: GitHub
Top comments (0)