Ce este
Șablonul Memento salvează un instantaneu al stării unui obiect, ca să poată fi restaurată mai târziu — fără a arăta cuiva interiorul obiectului. Obiectul însuși creează instantaneul și tot el se restaurează din el; lumea din exterior doar păstrează instantaneele.
Acesta este șablonul din spatele funcției „anulează până la un punct salvat”, al ciornelor și al punctelor de control.
Exemplu: instantanee ale editorului
save() returnează un instantaneu; restore() îl primește înapoi. Greșeala făcută între timp pur și simplu dispare.
{ ...this } copiază valorile câmpurilor obiectului într-un obiect nou. Această copie contează: dacă instantaneul ar fi chiar obiectul, orice modificare ulterioară ar schimba și „starea veche”. Pentru o stare care conține obiecte sau tablouri imbricate, folosește structuredClone(this) — spread-ul copiază doar primul nivel.
Salvează, strică, restaurează
Instantaneul a fost luat cât timp textul era Salut, lume!. După modificarea greșită, editorul afișează Salut, lmue! hopa, iar apoi restore(saved) aduce înapoi exact textul vechi — cel care păstra instantaneul nu s-a uitat niciodată în interiorul lui.
Ieșire: program TypeScript și rezultatul capturat
// Memento-ul: un instantaneu salvat al stării.
type Snapshot = {
readonly text: string
}
class Editor {
text: string = ""
// Spread-ul copiază valorile câmpurilor, așa că modificările ulterioare nu ajung la el.
save(): Snapshot {
return { ...this }
}
restore(snapshot: Snapshot): void {
this.text = snapshot.text
}
}
const editor = new Editor()
editor.text = "Salut, lume!"
const saved = editor.save()
editor.text = "Salut, lmue! hopa"
console.log("acum: ", editor.text)
editor.restore(saved)
console.log("anulez:", editor.text)
Când să îl folosești
Folosește-l pentru puncte de control și revenire: anularea în editor, salvările din jocuri, „restaurează valorile implicite”, pași tranzacționali care ar putea avea nevoie de anulare.
Renunță la el când starea este 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 interiorul; instantaneele sunt valori simple care pot fi păstrate într-un tablou pentru anulare pe mai multe niveluri; marcarea câmpurilor lor cu readonly îi împiedică pe cei care le păstrează să le modifice.
Dezavantaje: instantaneele unei stări mari consumă rapid memorie; este ușor să greșești când decizi ce intră în instantaneu (și când trebuie să îl păstrezi complet pe măsură ce clasa crește).