DEV Community

Juarez Júnior for Develop4Us

Posted on • Edited on

C# Design Pattern: Command (Portugues)

O padrão Command é usado para encapsular uma solicitação como um objeto, permitindo que você parametrize clientes com diferentes solicitações, filas ou operações reversíveis. Ele é útil quando você quer separar a lógica de execução de comandos, por exemplo, em um editor de texto que permite desfazer e refazer ações, como copiar, colar ou excluir.

Exemplo de Código em C#:

// Interface para os comandos
public interface IComando
{
    void Executar();
}

// Classe que representa um receptor, ou seja, quem executa as ações reais
public class Luz
{
    public void Ligar()
    {
        Console.WriteLine("A luz está ligada.");
    }

    public void Desligar()
    {
        Console.WriteLine("A luz está desligada.");
    }
}

// Comando para ligar a luz
public class ComandoLigarLuz : IComando
{
    private Luz _luz;

    public ComandoLigarLuz(Luz luz)
    {
        _luz = luz;
    }

    public void Executar()
    {
        _luz.Ligar();
    }
}

// Comando para desligar a luz
public class ComandoDesligarLuz : IComando
{
    private Luz _luz;

    public ComandoDesligarLuz(Luz luz)
    {
        _luz = luz;
    }

    public void Executar()
    {
        _luz.Desligar();
    }
}

// O invocador, que chama os comandos
public class ControleRemoto
{
    private IComando _comando;

    public void DefinirComando(IComando comando)
    {
        _comando = comando;
    }

    public void PressionarBotao()
    {
        _comando.Executar();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Criar os objetos
        Luz luz = new Luz();
        IComando ligarLuz = new ComandoLigarLuz(luz);
        IComando desligarLuz = new ComandoDesligarLuz(luz);

        // Criar o invocador (controle remoto)
        ControleRemoto controle = new ControleRemoto();

        // Ligar a luz
        controle.DefinirComando(ligarLuz);
        controle.PressionarBotao();  // Saída: A luz está ligada.

        // Desligar a luz
        controle.DefinirComando(desligarLuz);
        controle.PressionarBotao();  // Saída: A luz está desligada.
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação do Código:

Neste exemplo, o ControleRemoto é o invocador que chama comandos para ligar e desligar a luz. Os comandos ComandoLigarLuz e ComandoDesligarLuz encapsulam as ações de ligar e desligar a luz, e o controle remoto decide qual comando executar. Isso separa a lógica de execução do controle remoto da lógica específica de cada comando.

Conclusão:

O padrão Command é útil para encapsular ações como objetos independentes, permitindo maior flexibilidade para definir, substituir ou até mesmo desfazer operações. Ele separa o cliente que solicita a execução de uma ação do objeto que realiza essa ação.

Código fonte: GitHub

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

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