Padrões de projeto em Python

Command Pattern in Python

Turn a request into an object you can queue, log or undo, like a light switch with an undo button.

  • Avançado
  • 3 min de leitura
  • 1 exemplo executável
O que você vai aprender
  • Commands with execute() and undo()
  • Invoker, command and receiver
  • Building an undo history
LightCommand(light, "on").execute()
  1. 1remoteInvoker
  2. 2LightCommandCommand
  3. 3light.on()Receiver: Light on
undo() calls light.off(): Light off.

A request you can store

Command é um padrão de projeto que encapsula uma solicitação em um objeto próprio. Assim, você pode guardar solicitações em uma lista, executá-las depois, manter um histórico ou oferecer a função desfazer (undo). Quem envia a solicitação também não precisa saber quem vai executá-la.

Pontos-chave

  1. A command object knows its receiver and the action to run.
  2. The invoker calls execute() without knowing the details.
  3. Keeping executed commands in a list makes undo possible.

Quando usar?

  • Resolver problemas recorrentes de design de objetos com estruturas comprovadas.
  • Desacoplar responsabilidades para facilitar a extensão e os testes do código.
  • Usar um vocabulário de design comum ao discutir arquitetura com a equipe.

Código de exemplo

Executar código →
main.py
class Light:
    # Command: package a request as an object for later execution.
    def on(self): return "Light on"
    def off(self): return "Light off"


class LightCommand:
    def __init__(self, light, action):
        self.light, self.action = light, action

    def execute(self):
        # Store a request as data that can be invoked later.
        return getattr(self.light, self.action)()


light = Light()
for command in [LightCommand(light, "on"), LightCommand(light, "off")]:
    print(command.execute())
Gerar um botão Run para este exemplo

Resultado da execução

Light on
Light off

Explicação do código

Cada LightCommand guarda um objeto Light e o nome da operação a executar, como on ou off. O método execute() usa getattr() para chamar o método correspondente de Light. O laço executa os dois comandos em sequência e imprime Light on e depois Light off.

Altere os valores e execute o programa no compilador Python online CodeUtility sem instalar Python.

Exercícios práticos

Tente modificar o código seguindo as sugestões abaixo. Mudar o código e observar o resultado ajuda você a entender muito mais do que só ler.

  1. Substitua o domínio do exemplo preservando a estrutura do padrão.
  2. Compare o padrão com uma implementação mais simples e explique as diferenças.
  3. Escreva testes para cada participante antes de adicionar outra implementação.
Executar no compilador Python →

Pratique com um desafio

Use o conteúdo desta lição para resolver um problema real. Cada desafio roda no navegador, com testes instantâneos e uma revisão por IA.

Todos os desafios