Ce este
Șablonul Comandă (Command) transformă o acțiune într-o valoare: un obiect care știe să se execute singur — și adesea să se anuleze singur. Acțiunile ca valori pot fi păstrate în liste, puse la coadă, amânate, înregistrate în jurnal și reluate.
Din momentul în care ai nevoie de anulare (undo), ai nevoie de comenzi: ceva trebuie să țină minte 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-o listă de istoric — anularea înseamnă pur și simplu să-i ceri ultimei comenzi să se inverseze singură.
Acțiuni care se pot inversa singure
Greșeala de tipar „wrold” este eliminată nu de un cod special, ci de comanda care a adăugat-o — doar ea știe exact ce trebuie să ia înapoi.
Ieșire: program Python complet
from dataclasses import dataclass
from typing import Protocol
class Command(Protocol):
def execute(self) -> None: ...
def undo(self) -> None: ...
@dataclass
class AddText:
doc: list[str]
text: str
def execute(self) -> None:
self.doc.append(self.text)
def undo(self) -> None:
self.doc.pop()
doc: list[str] = []
history: list[Command] = []
for word in ["Hello", "wrold"]:
cmd = AddText(doc, word)
cmd.execute()
history.append(cmd)
print("documentul: ", doc)
# Ultima comandă știe cum să se anuleze singură.
last = history[-1]
last.undo()
print("după anulare:", doc)
Când să-l folosești
Folosește-l pentru anulare/refacere (undo/redo), 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 Python, o acțiune simplă pusă la coadă este adesea doar o funcție adăugată într-o listă — șablonul complet își merită locul doar când ai nevoie de anulare sau de inspectare.
Avantaje și dezavantaje
Avantaje: anularea/refacerea devine firească; acțiunile pot fi puse la coadă, înregistrate în jurnal și reluate; acțiuni noi se adaugă fără să modifici obiectul care le invocă.
Dezavantaje: câte o clasă pentru fiecare acțiune se adună repede; starea corectă pentru anulare este delicată — o comandă trebuie să rețină tot ce îi trebuie ca să se inverseze.