Command
Definição (GoF): “Encapsular uma solicitação como objeto, permitindo parametrizar clientes com diferentes solicitações, enfileirar/registrar solicitações e oferecer suporte a desfazer (undo).”
Problema
- A UI (cliente) decide o que fazer com
if/elsee chama o receiver diretamente (alto acoplamento). - Para cada novo dispositivo/ação, a UI cresce e fica difícil suportar undo/redo.
classDiagram
direction LR
class UI {
+clickOn()
+clickOff()
}
class Light {
+on()
+off()
}
UI --> Light : chama direto (acoplado)
Código Fonte (Problema — acoplado)
- Como desacoplar a UI dos dispositivos e adicionar undo/redo sem reescrever a interface?
Solução (GoF)
- Definir um Command com
execute()(e opcionalmenteundo()). - A UI vira um Invoker que apenas dispara comandos.
- O código que realmente faz o trabalho fica em um Receiver (ex.:
Light).
Diagrama GoF Genérico (Mermaid)
classDiagram
direction LR
class Client
class Invoker { +setCommand(Command) +press() }
class Command { <<interface>> +execute() }
class ConcreteCommand { -receiver: Receiver +execute() }
class Receiver { +action() }
Client --> Invoker : configura
Client --> ConcreteCommand : cria
Invoker --> Command : invoca
ConcreteCommand --> Receiver : delega
Código Fonte (Genérico)
| Command.java | |
|---|---|
| Receiver.java | |
|---|---|
Exemplo — Lâmpada + Controle Remoto
Diagrama da Solução (Mermaid)
classDiagram
direction LR
class Remote {
+bind(key, Command)
+press(key)
+undo()
}
class Command { <<interface>> +execute() +undo() }
class LightOnCommand { -light: Light +execute() +undo() }
class LightOffCommand { -light: Light +execute() +undo() }
class Light { +on() +off() +isOn() }
Remote --> Command : invoca
LightOnCommand ..> Light
LightOffCommand ..> Light
Código Fonte (Solução — com Undo)
Observações Didáticas
- Desacoplamento: o invoker não conhece detalhes do receiver.
- Extensível: novos dispositivos/ações ⇒ novos
Commands; a UI só fazbind. - Undo/Redo: cada
Commandconhece como desfazer sua própria ação. - MacroCommand: pode-se compor uma lista de
Commands para executar/undo em bloco.