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 nimănui interiorul obiectului. Obiectul însuși face instantaneul și el însuși se restaurează din el; lumea din afară doar ține instantaneele.
Acesta este șablonul din spatele „anulării până la un punct salvat”, al ciornelor și al punctelor de control.
Exemplu: instantanee ale editorului
save() întoarce un instantaneu; restore() îl primește înapoi. Greșeala făcută între cele două pur și simplu dispare.
Salvează, strică, restaurează
Instantaneul a fost luat cât timp textul era bun. După modificarea greșită, restore($saved) readuce exact starea veche — cel care ține instantaneul nu s-a uitat niciodată în el. Instantaneul este o clasă readonly: odată creat, nimic nu îl mai poate schimba.
Ieșire: script PHP
<?php
// Mementoul: un instantaneu înghețat al stării.
final readonly class Snapshot {
public function __construct(public string $text) {}
}
class Editor {
public string $text = "";
public function save(): Snapshot {
return new Snapshot($this->text);
}
public function restore(Snapshot $snapshot): void {
$this->text = $snapshot->text;
}
}
$editor = new Editor();
$editor->text = "Hello, world!";
$saved = $editor->save();
$editor->text = "Hello, wrold! oops";
echo "acum: ", $editor->text, "\n";
$editor->restore($saved);
echo "anulare: ", $editor->text, "\n";
Când să îl folosești
Folosește-l pentru puncte de control și revenire: anularea într-un 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 detaliile interne; instantaneele sunt valori simple, care pot fi ținute în liste pentru anulare pe mai multe niveluri.
Dezavantaje: instantaneele unei stări mari consumă rapid memorie; a decide ce intră în instantaneu (și a-l păstra complet pe măsură ce clasa crește) este ușor de greșit.