Patrón Command

Patrón Command

⚔️ El general y sus órdenes

Imagina un general en el campo de batalla.
No lucha directamente, sino que da órdenes:
“¡Atacad!”, “¡Defended la puerta!”, “¡Cubrid el flanco izquierdo!”

Cada orden es una comanda que sus soldados ejecutan.
Así funciona el Patrón Command: encapsular una acción como un objeto, para poder ejecutarla, deshacerla o almacenarla más tarde.

⚙️ ¿Cuándo usar el Patrón Command?

  • Cuando quieres desacoplar quién da la orden de quién la ejecuta.
  • Cuando necesitas guardar, deshacer o repetir acciones.
  • Cuando tu sistema tiene acciones que deben ejecutarse de forma flexible o secuencial.

🧰 Ejemplo en PHP

Vamos a crear una simulación del general y sus soldados:

<?php

// La interfaz Command define un método ejecutar()
interface Command {
    public function ejecutar();
}

// Receptor: los soldados que ejecutan las órdenes
class Soldado {
    public function atacar() {
        echo "El soldado ataca con su espada ⚔️\n";
    }

    public function defender() {
        echo "El soldado levanta su escudo 🛡️\n";
    }
}

// Comandos concretos
class ComandoAtacar implements Command {
    private Soldado $soldado;

    public function __construct(Soldado $soldado) {
        $this->soldado = $soldado;
    }

    public function ejecutar() {
        $this->soldado->atacar();
    }
}

class ComandoDefender implements Command {
    private Soldado $soldado;

    public function __construct(Soldado $soldado) {
        $this->soldado = $soldado;
    }

    public function ejecutar() {
        $this->soldado->defender();
    }
}

// Invoker: el general que da las órdenes
class General {
    private array $ordenes = [];

    public function recibirOrden(Command $orden) {
        $this->ordenes[] = $orden;
    }

    public function ejecutarOrdenes() {
        foreach ($this->ordenes as $orden) {
            $orden->ejecutar();
        }
        $this->ordenes = []; // limpia las órdenes después
    }
}

// Uso del patrón
$soldado = new Soldado();
$ordenAtacar = new ComandoAtacar($soldado);
$ordenDefender = new ComandoDefender($soldado);

$general = new General();
$general->recibirOrden($ordenAtacar);
$general->recibirOrden($ordenDefender);

$general->ejecutarOrdenes();

🧙‍♂️ Salida:

El soldado ataca con su espada ⚔️
El soldado levanta su escudo 🛡️

🧠 En resumen

El patrón Command convierte una acción (una “orden”) en un objeto independiente.
Así puedes ejecutarla, deshacerla o programarla más tarde.

En nuestro ejemplo, el General (Invoker) no necesita saber cómo el soldado ataca o defiende; solo emite la orden adecuada.

Eso ha sido todo por hoy.
El general ya ha dado sus órdenes y el ejército del código está en marcha ⚔️
Nos vemos en el próximo patrón… o en la próxima frikada que se me ocurra para explicarlo 👾