všetky vzory

Memento

Uloží stav objektu tak, aby sa doň dal neskôr vrátiť.

class Snapshot {  constructor(text) {    this.text = text;  }} class Editor {  #text = '';   write(text) {    this.#text = text;  }   save() {    return new Snapshot(this.#text);  }   restore(snapshot) {    this.#text = snapshot.text;  }} class History {  #snapshots = [];   // It keeps the snapshot, but never looks inside it.  backup(editor) {    this.#snapshots.push(editor.save());  }   undo(editor) {    editor.restore(this.#snapshots.pop());  }} history.backup(editor);editor.write('new text');history.undo(editor);   // the editor is back in its original state

Celý priebeh v texte (11 krokov)
  1. Editor má svoj stav. Je to jeho vnútro — nikto zvonku doň nevidí a nikto iný ho nemení.
  2. História si pred zmenou vypýta snímku. Nepýta si stav — pýta si snímku, a to je rozdiel.
  3. Editor si ju vyrobí sám, vnútri seba. Rovnaký tvar aj farba ako jeho stav, lebo je to jeho kópia — pôvodný stav pritom zostáva na mieste.
  4. A vydá ju von. História si ju odloží a nikdy do nej nenazrie — nevie, čo je vnútri, a nemá to ako zistiť.
  5. Teraz sa editor zmení. Stav je iný — a snímka v histórii sa nezmenila, práve preto, že je to kópia.
  6. História si vypýta ďalšiu snímku, už toho nového stavu.
  7. Aj tú si odloží vedľa prvej. Dva body v čase, do ktorých sa dá vrátiť.
  8. Editor sa zmení tretíkrát. Tento stav si zatiaľ nikto neodložil.
  9. Krok späť. História vezme poslednú odloženú snímku a podá ju editorovi — stále bez toho, aby vedela, čo v nej je.
  10. Rozbaliť ju vie len editor, je to jeho snímka a jeho vnútro. A stav je zase modrý — presne taký, aký mal v chvíli, keď snímka vznikla.
  11. Stav odišiel von ako kópia, počkal u niekoho iného a vrátil sa späť. Držiteľ ho celý čas mal v ruke, ale ani raz doň nevidel — a v histórii zostala staršia snímka, takže sa dá vrátiť ešte o krok ďalej.

Kedy použiť

  • Krok späť, zrušenie rozrobenej zmeny, obnova po chybe — všetko chce zapamätaný stav.
  • Objekt vydá snímku sám, takže nikto zvonku nemusí vedieť, z čoho sa stav skladá.
  • Editor vie, čo si zapamätať; koľko snímok sa drží a dokedy, je vec histórie.
  • Pred riskantnou operáciou je snímka poistka, ktorú stačí zahodiť, keď sa podarí.

Pasce

  • Každá snímka je kópia stavu, takže pri dlhej histórii je pamäť rýchlo preč.
  • Plytká kópia nie je snímka — mení sa spolu s objektom a vráti prítomnosť.
  • Len čo držiteľ začne zo snímky čítať, zapuzdrenie je preč.
  • Zamieňa sa s Command: príkaz si pamätá zmenu a vracia ju opačným krokom, snímka celý stav.
  • Objekt sa vráti do minulosti, ale okolie, s ktorým medzitým hovoril, zostalo v prítomnosti.