Ce este
Șablonul Command transformă o acțiune într-o valoare: un obiect care știe cum să se execute singur — și adesea cum să se anuleze singur. Acțiunile ca valori pot fi stocate în tablouri, puse la coadă, amânate, înregistrate și reluate.
În momentul în care ai nevoie de anulare, ai nevoie de comenzi: ceva trebuie să rețină ce s-a făcut, ca să facă opusul.
Exemplu: scriere cu anulare
Fiecare cuvânt adăugat în document este o comandă cu execute() și undo(). Comenzile executate ajung într-un tablou de istoric — anularea înseamnă pur și simplu să ceri ultimei comenzi să se inverseze.
Acțiuni care se pot inversa singure
Greșeala de tastare wrold este eliminată nu de un cod special, ci de comanda care a adăugat-o — doar ea știe exact ce să retragă. Fiecare comandă păstrează chiar tabloul documentului, așa că push și pop ale ei modifică documentul apelantului.
Ieșire: program TypeScript și rezultatul capturat
interface Command {
execute(): void
undo(): void
}
class AddText implements Command {
private doc: string[]
private text: string
constructor(doc: string[], text: string) {
this.doc = doc
this.text = text
}
execute(): void {
this.doc.push(this.text)
}
undo(): void {
this.doc.pop()
}
}
const doc: string[] = []
const history: Command[] = []
for (const word of ["Hello", "wrold"]) {
const command = new AddText(doc, word)
command.execute()
history.push(command)
}
console.log("document: ", doc)
// Ultima comandă știe cum să se anuleze singură.
const last = history[history.length - 1]
last.undo()
console.log("după anulare:", doc)
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 stocate sau inversate.
Renunță la el când acțiunile se execută și se uită. O acțiune pusă la coadă, fără nimic de anulat, este adesea doar o valoare de tip funcție într-un tablou — șablonul complet își merită costul doar când este nevoie de anulare sau de inspecție.
Avantaje și dezavantaje
Avantaje: anularea/refacerea devine naturală; acțiunile pot fi puse la coadă, înregistrate ș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.