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 tot el se restaurează din acesta; lumea din afară doar păstrează instantaneele.
Acesta este șablonul din spatele funcțiilor „anulează până la un punct salvat”, al ciornelor și al punctelor de control.
Exemplu: instantanee ale editorului
save() returnează un instantaneu — o dataclass înghețată pe care cel care o păstrează nu o poate modifica; restore() primește unul înapoi. Greșeala dintre ele pur și simplu dispare.
Salvează, strică, restaurează
Instantaneul a fost făcut cât timp textul era bun. După editarea greșită, restore(saved) readuce exact starea veche — cel care păstrează instantaneul nu s-a uitat niciodată înăuntrul lui.
Ieșire: program Python complet
from dataclasses import dataclass
# Memento-ul: un instantaneu salvat al stării, înghețat astfel încât
# cel care îl păstrează să nu-l poată modifica.
@dataclass(frozen=True)
class Snapshot:
text: str
class Editor:
def __init__(self) -> None:
self.text = ""
def save(self) -> Snapshot:
return Snapshot(text=self.text)
def restore(self, snapshot: Snapshot) -> None:
self.text = snapshot.text
e = Editor()
e.text = "Hello, world!"
saved = e.save()
e.text = "Hello, wrold! oops"
print("acum: ", e.text)
e.restore(saved)
print("anulat:", e.text)
Când să-l folosești
Folosește-l pentru puncte de control și revenire: anulare în editor, salvări în jocuri, „restaurează setările implicite”, pași tranzacționali care ar putea necesita anulare.
Renunță la el când starea este formată din una sau două valori simple — păstrează pur și simplu valoarea veche într-o variabilă. Și compară-l cu Comandă: comenzile anulează pas cu pas, pe când 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 păstrate în liste pentru anulare pe mai multe niveluri.
Dezavantaje: instantaneele unei stări mari consumă repede memorie; e ușor să greșești când decizi ce intră în instantaneu (și când îl menții complet pe măsură ce clasa crește).