💡 Ver Caso Práctico: Ejemplo Práctico del Patrón Command
Command (Comando) es un patrón de diseño comportamental que convierte una solicitud en un objeto independiente que contiene toda la información sobre ella, permitiendo parametrizar métodos, encolar solicitudes y soportar operaciones deshacer.
Propósito y Caso de Uso
Utiliza Command cuando necesites desacoplar el objeto que invoca una acción (ej. un botón de UI) del objeto que sabe ejecutarla. También resuelve necesidades de historial de acciones (undo/redo), colas de tareas diferidas, o registro/logging de operaciones ejecutadas.
Estructura del Patrón
- Comando (Interfaz): Declara el método
execute()(y opcionalmenteundo()). - Comandos Concretos: Encapsulan una acción concreta y sus parámetros, delegando en el receptor.
- Receptor (Receiver): Contiene la lógica de negocio real que ejecuta la acción.
- Invocador (Invoker): Dispara el comando sin conocer los detalles de la acción.
Flujo de Funcionamiento
- Creación: Se crea un comando concreto, encapsulando receptor y parámetros.
- Registro: El invocador guarda el comando (en una cola, historial o simplemente para dispararlo).
- Ejecución: El invocador llama a
execute()sin conocer qué hace el comando internamente.
Ejemplos de Implementación Reales
interface Command {
execute(): void;
undo(): void;
}
class TextDocument {
content = '';
}
class InsertTextCommand implements Command {
constructor(private doc: TextDocument, private text: string) {}
execute() { this.doc.content += this.text; }
undo() { this.doc.content = this.doc.content.slice(0, -this.text.length); }
}
class CommandHistory {
private history: Command[] = [];
execute(command: Command) {
command.execute();
this.history.push(command);
}
undo() {
const command = this.history.pop();
command?.undo();
}
}
const doc = new TextDocument();
const history = new CommandHistory();
history.execute(new InsertTextCommand(doc, 'Hola '));
history.execute(new InsertTextCommand(doc, 'mundo'));
console.log(doc.content); // "Hola mundo"
history.undo();
console.log(doc.content); // "Hola "Cuándo NO usarlo
Si la acción es simple y directa, sin necesidad de encolarla, deshacerla o registrarla, envolverla en un comando añade indirección innecesaria (YAGNIGlosarioYAGNI (You Aren't Gonna Need It)Principio de Extreme Programming (XP) que establece que un programador no debe añadir funcionalidad hasta que sea estrictamente necesario. Su objetivo es evitar la sobre-ingeniería (over-engineering), previniendo código para funcionalidades hipotéticas.Ver término completo →).