Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Patrones de Diseño de Comportamiento

Command

Encapsular una solicitud como un objeto

Universidad Nacional de Rio Negro - Sede Andina

Definición

El patrón Command (Orden) es un patrón de diseño de comportamiento que convierte una solicitud en un objeto independiente que contiene toda la información sobre la misma.

Esta transformación permite parametrizar a los clientes con diferentes solicitudes, retrasar o poner en cola la ejecución de una solicitud y soportar operaciones que se pueden deshacer.

Origen e Historia

Formalizado por el GoF en 1994, el patrón Command se inspiró en la necesidad de implementar “callbacks” en lenguajes que no soportaban funciones como ciudadanos de primer orden. Al encapsular una función dentro de un objeto, se lograba la misma flexibilidad que un puntero a función pero con los beneficios de la orientación a objetos (estado, herencia y polimorfismo).

Motivación

La motivación principal es desacoplar al objeto que invoca una operación del objeto que sabe cómo realizarla. Esto permite que el invocador no necesite conocer los detalles internos del receptor ni la operación específica que se va a ejecutar.

Contexto

Cuando aplica

Cuando no aplica

Consecuencias de su uso

Positivas

Negativas

Alternativas

Estructura

Diagramas

Diagrama de Clases

Diagrama de Secuencia

Ejemplos

/**
 * Interfaz Command.
 */
public interface Comando {
    void ejecutar();
    void deshacer();
}

/**
 * Receptor: El objeto que sabe cómo realizar la acción.
 */
public class Luz {
    public void encender() { System.out.println("Luz encendida"); }
    public void apagar() { System.out.println("Luz apagada"); }
}

/**
 * Comando Concreto.
 */
public class ComandoEncenderLuz implements Comando {
    private Luz luz;
    
    public ComandoEncenderLuz(Luz luz) { this.luz = luz; }
    
    @Override
    public void ejecutar() { luz.encender(); }
    
    @Override
    public void deshacer() { luz.apagar(); }
}

/**
 * Invocador.
 */
public class ControlRemoto {
    private Stack<Comando> historial = new Stack<>();
    
    public void presionarBoton(Comando cmd) {
        cmd.ejecutar();
        historial.push(cmd);
    }
    
    public void presionarDeshacer() {
        if (!historial.isEmpty()) {
            historial.pop().deshacer();
        }
    }
}

Ejercicios

Resumen

El patrón Command es la base de las aplicaciones interactivas modernas. Al transformar una acción en un objeto, nos otorga control sobre el flujo temporal de las operaciones, permitiéndonos pausar, revertir o agrupar intenciones de usuario de manera elegante y desacoplada.

Próximo paso

Para seguir, conviene pasar a el material siguiente, donde el recorrido continúa sobre esta base.