Ce este
Șablonul Memento salvează o copie a stării unui obiect, ca ea să poată fi restaurată mai târziu — fără a arăta nimănui interiorul obiectului. Obiectul însuși face copia și tot el se restaurează din ea; lumea din exterior doar păstrează copiile.
Acesta este șablonul din spatele lui „anulează până la un punct salvat”, al ciornelor și al punctelor de control.
Exemplu: copii ale stării editorului
Save() returnează o copie a stării; Restore() o primește înapoi. Greșeala făcută între cele două momente pur și simplu dispare.
Salvează, strică, restaurează
Copia a fost luată cât timp textul era bun. După modificarea greșită, Restore(saved) aduce înapoi exact starea veche — cel care ține copia nu s-a uitat niciodată în interiorul ei.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
type Editor struct {
text string
}
// Mementoul: o copie salvată a stării.
type Snapshot struct {
text string
}
func (e *Editor) Save() Snapshot {
return Snapshot{text: e.text}
}
func (e *Editor) Restore(s Snapshot) {
e.text = s.text
}
func main() {
e := &Editor{}
e.text = "Salut, lume!"
saved := e.Save()
e.text = "Salut, luem! ups"
fmt.Println("acum: ", e.text)
e.Restore(saved)
fmt.Println("anulare:", e.text)
}
Când să îl folosești
Folosește-l pentru puncte de control și revenire: anularea într-un editor, salvările dintr-un joc, „revino la setările implicite”, pași tranzacționali care ar putea avea nevoie de anulare.
Renunță la el când starea înseamnă una sau două valori simple — păstrează pur și simplu valoarea veche într-o variabilă. Și compară-l cu Command: comenzile anulează pas cu pas, mementourile sar înapoi la un punct salvat.
Avantaje și dezavantaje
Avantaje: revenire reală fără a expune detaliile interne; copiile stării sunt valori simple, care pot fi păstrate în liste pentru anulare pe mai multe niveluri.
Dezavantaje: copiile unei stări mari consumă repede memorie; a decide ce intră în copie (și a o păstra completă pe măsură ce tipul crește) este ușor de greșit.