Command Pattern in Python
Turn a request into an object you can queue, log or undo, like a light switch with an undo button.
- Commands with execute() and undo()
- Invoker, command and receiver
- Building an undo history
- 1
remoteInvoker - 2
LightCommandCommand - 3
light.on()Receiver: Light on
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
- A command object knows its receiver and the action to run.
- The invoker calls
execute()without knowing the details. - 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
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())
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.
- Substitua o domínio do exemplo preservando a estrutura do padrão.
- Compare o padrão com uma implementação mais simples e explique as diferenças.
- Escreva testes para cada participante antes de adicionar outra implementação.
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