Treci la conținutul principal

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.

Prompt
Scrie un script PHP cu șablonul Memento: o clasă Editor cu o proprietate text, o clasă readonly Snapshot, o metodă save care întoarce un instantaneu și o metodă restore care primește unul. Scrie un text bun, salvează, fă o modificare greșită, afișează-o, restaurează instantaneul și afișează textul recuperat.
Ieșire: script PHP

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.