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 👾