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 singur. Acțiunile devenite valori pot fi păstrate în liste, puse la coadă, amânate, înregistrate în jurnal și reluate.
În momentul în care ai nevoie de anulare (undo), ai nevoie de comenzi: ceva trebuie să rețină ce s-a făcut, ca să poată face operația inversă.
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 dea înapoi.
Acțiuni care se pot da singure înapoi
Greșeala de tastare „lmue” nu este ștearsă de un cod special, ci chiar de comanda care a adăugat-o — doar ea știe exact ce trebuie luat înapoi.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
type Command interface {
Execute()
Undo()
}
type AddText struct {
doc *[]string
text string
}
func (c AddText) Execute() { *c.doc = append(*c.doc, c.text) }
func (c AddText) Undo() { *c.doc = (*c.doc)[:len(*c.doc)-1] }
func main() {
doc := []string{}
history := []Command{}
for _, word := range []string{"Salut", "lmue"} {
cmd := AddText{doc: &doc, text: word}
cmd.Execute()
history = append(history, cmd)
}
fmt.Println("document: ", doc)
// Ultima comandă știe cum să se dea singură înapoi.
last := history[len(history)-1]
last.Undo()
fmt.Println("după anulare:", doc)
}
Când să îl folosești
Folosește-l pentru undo/redo, cozi de acțiuni, macrocomenzi și jurnale de audit — oriunde acțiunile trebuie păstrate sau anulate.
Renunță la el când acțiunile sunt de tipul „execută și uită”. În Go, o acțiune simplă pusă la coadă este adesea doar o valoare de tip funcție trimisă printr-un canal — șablonul complet își merită efortul doar când ai nevoie de anulare sau de inspecție.
Avantaje și dezavantaje
Avantaje: undo/redo devine ceva natural; acțiunile pot fi puse la coadă, înregistrate în jurnal și reluate; acțiunile noi se adaugă fără a modifica invocatorul.
Dezavantaje: câte un tip pentru fiecare acțiune se adună repede; starea corectă pentru anulare este delicată — o comandă trebuie să rețină tot ce îi este necesar ca să se poată da înapoi.