Patrón Command: encapsulación de acciones
Envuelva solicitudes en objetos Command para admitir deshacer/rehacer y la grabación de macros.
Patrón Command: encapsulación de acciones es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
La intención de Command
Command encapsula una solicitud como un objeto, lo que permite parametrizar los clientes con distintas solicitudes, ponerlas en cola, registrarlas y ejecutar operaciones que se puedan deshacer.
Interfaz de Command
Defina una interfaz con un método execute() y, opcionalmente, un método undo(). Cada objeto Command sabe cómo realizar y revertir una acción.
public interface Command {
void execute();
void undo();
}Command concreto: TextEditor
Cada Command concreto encapsula un receptor y los parámetros de la acción. Execute realiza la acción; undo la revierte.
public class InsertTextCommand implements Command {
private final TextEditor editor;
private final String text;
private final int position;
public InsertTextCommand(TextEditor editor, String text, int pos) {
this.editor = editor; this.text = text; this.position = pos;
}
public void execute() { editor.insert(position, text); }
public void undo() { editor.delete(position, text.length()); }
}Invocador: CommandHistory
El invocador mantiene un historial de los comandos ejecutados. Llama a execute() y añade el comando a una pila. Undo extrae el último comando y llama a undo().
public class CommandHistory {
private final Deque<Command> history = new ArrayDeque<>();
public void execute(Command cmd) {
cmd.execute();
history.push(cmd);
}
public void undo() {
if (!history.isEmpty()) history.pop().undo();
}
}Pila de deshacer y rehacer
Añada una pila de rehacer: al deshacer, inserte el comando en la pila de rehacer; al rehacer, extráigalo de esa pila y vuelva a ejecutarlo.
private final Deque<Command> undoStack = new ArrayDeque<>();
private final Deque<Command> redoStack = new ArrayDeque<>();
public void redo() {
if (!redoStack.isEmpty()) {
Command cmd = redoStack.pop();
cmd.execute();
undoStack.push(cmd);
}
}Macro Command
Un macro command es un compuesto que contiene una lista de comandos y los ejecuta en secuencia. Para deshacerlo, ejecuta las acciones inversas en orden inverso.
public class MacroCommand implements Command {
private final List<Command> commands;
public MacroCommand(List<Command> commands) { this.commands = commands; }
public void execute() { commands.forEach(Command::execute); }
public void undo() { for (int i = commands.size()-1; i>=0; i--) commands.get(i).undo(); }
}Cola de comandos para procesar tareas
Almacene los comandos en una cola y procéselos de forma asíncrona. Un subproceso de trabajo extrae y ejecuta los comandos, desacoplando a los productores del subproceso de ejecución.
BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();Command con Executor
Envuelva los comandos como lambdas Runnable y envíelos a un ExecutorService: la lambda es el objeto Command.
ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));Registro de comandos para auditoría
Los objetos Command serializables se pueden conservar en un registro. Durante la recuperación, reprodúzcalos para reconstruir el estado final, que es la base de Event Sourcing.
void execute(Command cmd) {
cmd.execute();
auditLog.append(cmd.toString()); // log every action
history.push(cmd);
}Botones de acción de la GUI
En los frameworks de GUI, cada botón o elemento de menú contiene un Command. Al hacer clic en el botón, se llama a command.execute(). Cambie los comandos en tiempo de ejecución para modificar el comportamiento del botón.
Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());Command frente a Strategy
Ambos encapsulan comportamiento. Strategy encapsula un algoritmo que se puede sustituir en tiempo de ejecución. Command encapsula una solicitud completa, incluidos sus parámetros y su receptor, y admite historiales y colas.
Command en Spring
El Tasklet de Spring Batch y el MessageHandler de Spring Integration son aplicaciones del patrón Command a nivel de aplicación. Cada Tasklet encapsula un paso de un trabajo por lotes.
Comprobación rápida
¿Qué método adicional añade Command, además de execute(), para admitir la operación de deshacer?
Resumen
Command encapsula acciones como objetos. Utilícelo para pilas de deshacer y rehacer, colas de tareas, grabación de macros y registro de auditoría. Combínelo con un invocador que mantenga el historial de comandos.
Preguntas frecuentes
¿La lección «Patrón Command: encapsulación de acciones» es gratis?
Sí — el texto completo de «Patrón Command: encapsulación de acciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Patrón Command: encapsulación de acciones»?
Envuelva solicitudes en objetos Command para admitir deshacer/rehacer y la grabación de macros. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Patrón Command: encapsulación de acciones»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Patrón Observer: notificación de eventos
- Patrón Strategy: algoritmos intercambiables
- Patrón Command: encapsulación de acciones
- Template Method: definición de esqueletos de algoritmos