Ce este
Șablonul Command transformă o acțiune într-o valoare: un obiect care știe cum să se execute — și adesea cum să se anuleze. Acțiunile ca valori pot fi păstrate în liste, pot fi puse în coadă, amânate, înregistrate în jurnal și reluate.
În clipa în care ai nevoie de anulare, ai nevoie de comenzi: ceva trebuie să rețină ce s-a făcut, pentru a face opusul.
Exemplu: scriere cu anulare
Fiecare cuvânt adăugat în document este o comandă cu execute() și undo(). Comenzile executate intră într-o listă de istoric — anularea înseamnă pur și simplu să ceri ultimei comenzi să se inverseze.
Acțiuni care se pot inversa singure
Greșeala de tipar „wrold” nu este eliminată de un cod special, ci de comanda care a adăugat-o — numai ea știe exact ce trebuie retras. array_pop scoate ultima comandă din istoric.
Ieșire: script PHP
<?php
class Document {
/** @var string[] */
public array $words = [];
}
interface Command {
public function execute(): void;
public function undo(): void;
}
class AddText implements Command {
public function __construct(
private Document $doc,
private string $text,
) {}
public function execute(): void {
$this->doc->words[] = $this->text;
}
public function undo(): void {
array_pop($this->doc->words);
}
}
$doc = new Document();
$history = [];
foreach (["Hello", "wrold"] as $word) {
$cmd = new AddText($doc, $word);
$cmd->execute();
$history[] = $cmd;
}
echo "document: ", implode(" ", $doc->words), "\n";
// Ultima comandă știe cum să se anuleze pe sine.
$last = array_pop($history);
$last->undo();
echo "după anulare: ", implode(" ", $doc->words), "\n";
Când să îl folosești
Folosește-l pentru anulare/refacere, cozi de acțiuni, macrocomenzi și jurnale de audit — oriunde acțiunile trebuie păstrate sau inversate.
Renunță la el când acțiunile sunt de tipul „execută și uită”. În PHP, o acțiune simplă pusă în coadă este adesea doar o închidere (closure) într-un tablou — șablonul complet își merită costul numai când e nevoie de anulare sau de inspecție.
Avantaje și dezavantaje
Avantaje: anularea/refacerea devine naturală; acțiunile pot fi puse în coadă, înregistrate în jurnal și reluate; acțiunile noi se adaugă fără a atinge invocatorul.
Dezavantaje: o clasă pentru fiecare acțiune se adună repede; starea corectă pentru anulare este subtilă — o comandă trebuie să capteze tot ce îi trebuie ca să se inverseze.