DEV Community

Juarez Júnior for Develop4Us

Posted on • Edited on

1

C# Design Pattern: Strategy (Portugues)

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
    }
}
Enter fullscreen mode Exit fullscreen mode

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

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay