DEV Community

Juarez Júnior
Juarez Júnior

Posted on

C# Design Pattern: State (Portugues)

O padrão State permite que um objeto altere seu comportamento quando seu estado interno muda. Isso faz com que o objeto pareça mudar de classe. Ele é útil quando você deseja que um objeto tenha diferentes comportamentos dependendo de seu estado atual, como uma máquina de venda automática que pode estar em estados como "aguardando moeda", "dispensando item", ou "sem estoque".

Exemplo de Código em C#:

// Interface de Estado
public interface IEstado
{
    void InserirMoeda(MaquinaVendas maquina);
    void SelecionarProduto(MaquinaVendas maquina);
    void DispensarProduto(MaquinaVendas maquina);
}

// Estado de aguardando moeda
public class AguardandoMoeda : IEstado
{
    public void InserirMoeda(MaquinaVendas maquina)
    {
        Console.WriteLine("Moeda inserida. Selecione o produto.");
        maquina.DefinirEstado(new AguardandoSelecao());
    }

    public void SelecionarProduto(MaquinaVendas maquina)
    {
        Console.WriteLine("Insira uma moeda primeiro.");
    }

    public void DispensarProduto(MaquinaVendas maquina)
    {
        Console.WriteLine("Insira uma moeda e selecione um produto.");
    }
}

// Estado de aguardando seleção de produto
public class AguardandoSelecao : IEstado
{
    public void InserirMoeda(MaquinaVendas maquina)
    {
        Console.WriteLine("Você já inseriu uma moeda. Selecione o produto.");
    }

    public void SelecionarProduto(MaquinaVendas maquina)
    {
        Console.WriteLine("Produto selecionado. Dispensando o produto...");
        maquina.DefinirEstado(new ProdutoDispensado());
    }

    public void DispensarProduto(MaquinaVendas maquina)
    {
        Console.WriteLine("Selecione um produto primeiro.");
    }
}

// Estado de dispensando produto
public class ProdutoDispensado : IEstado
{
    public void InserirMoeda(MaquinaVendas maquina)
    {
        Console.WriteLine("Aguarde, já estamos dispensando o produto.");
    }

    public void SelecionarProduto(MaquinaVendas maquina)
    {
        Console.WriteLine("Aguarde, o produto está sendo dispensado.");
    }

    public void DispensarProduto(MaquinaVendas maquina)
    {
        Console.WriteLine("Produto dispensado! Retire o produto.");
        maquina.DefinirEstado(new AguardandoMoeda());
    }
}

// Classe Maquina de Vendas
public class MaquinaVendas
{
    private IEstado _estadoAtual;

    public MaquinaVendas()
    {
        _estadoAtual = new AguardandoMoeda();
    }

    public void DefinirEstado(IEstado novoEstado)
    {
        _estadoAtual = novoEstado;
    }

    public void InserirMoeda()
    {
        _estadoAtual.InserirMoeda(this);
    }

    public void SelecionarProduto()
    {
        _estadoAtual.SelecionarProduto(this);
    }

    public void DispensarProduto()
    {
        _estadoAtual.DispensarProduto(this);
    }
}

class Program
{
    static void Main(string[] args)
    {
        MaquinaVendas maquina = new MaquinaVendas();

        // Testando a máquina de vendas
        maquina.InserirMoeda();
        maquina.SelecionarProduto();
        maquina.DispensarProduto();
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação do Código:
Neste exemplo, a classe MaquinaVendas altera seu comportamento com base em seu estado atual. Quando uma moeda é inserida, o estado muda de AguardandoMoeda para AguardandoSelecao. Depois que o produto é selecionado, o estado muda para ProdutoDispensado. Cada estado define um comportamento específico para as ações, como inserir moeda, selecionar um produto ou dispensar o produto.

Conclusão:
O padrão State é útil quando um objeto pode ter diferentes comportamentos dependendo de seu estado interno. Ele permite que você separe a lógica relacionada a cada estado, tornando o código mais fácil de entender e modificar.

Código fonte: GitHub

Top comments (0)