Command
O Command transforma uma ação em um objeto.
Em vez de executar diretamente:
editor.copy();
podemos representar essa ação como:
new CopyCommand(editor);
Isso permite armazenar, executar, desfazer e até agendar comandos.
Exemplo
Criamos uma interface:
interface Command {
execute(): void;
undo(): void;
}
Nosso objeto real:
class Light {
turnOn() {
console.log(
"Luz ligada"
);
}
turnOff() {
console.log(
"Luz desligada"
);
}
}
Criamos os comandos:
class TurnOnCommand
implements Command {
constructor(
private light: Light
) {}
execute() {
this.light.turnOn();
}
undo() {
this.light.turnOff();
}
}
Agora temos um Invoker:
class RemoteControl {
constructor(
private command: Command
) {}
press() {
this.command.execute();
}
undo() {
this.command.undo();
}
}
Uso:
const light =
new Light();
const command =
new TurnOnCommand(light);
const remote =
new RemoteControl(command);
remote.press();
Resultado:
Luz ligada
Podemos desfazer:
remote.undo();
Resultado:
Luz desligada
Histórico de comandos
Uma grande vantagem é armazenar comandos.
class CommandHistory {
private history: Command[] = [];
execute(command: Command) {
command.execute();
this.history.push(command);
}
undo() {
const command =
this.history.pop();
command?.undo();
}
}
Agora podemos executar:
history.execute(
new TurnOnCommand(light)
);
E depois:
history.undo();
Exemplo real: Editor de texto
Imagine um editor:
Ctrl + C
Ctrl + V
Ctrl + Z
Ctrl + Y
Cada ação pode ser representada por um Command:
CopyCommand
PasteCommand
DeleteCommand
UndoCommand
Isso permite criar:
Histórico
Undo/Redo
Macro
Agendamento
Logs de ações
Quando usar?
Command é útil quando precisamos:
- Implementar Undo/Redo.
- Criar filas de tarefas.
- Agendar operações.
- Registrar ações.
- Criar macros.
- Desacoplar quem solicita uma ação de quem a executa.
A ideia principal é:
Transformar uma ação em um objeto que pode ser armazenado, executado ou desfeito.