všetky vzory

Memento

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

class Snimka {  constructor(text) {    this.text = text;  }} class Editor {  #text = '';   napis(novy) {    this.#text = novy;  }   uloz() {    return new Snimka(this.#text);  }   obnov(snimka) {    this.#text = snimka.text;  }} class Historia {  #snimky = [];   // Snímku si odloží, ale dovnútra nikdy nenazrie.  zaloz(editor) {    this.#snimky.push(editor.uloz());  }   spat(editor) {    editor.obnov(this.#snimky.pop());  }} historia.zaloz(editor);editor.napis('nový text');historia.spat(editor);   // editor je späť v pôvodnom stave

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ť

  • Stav treba vedieť vrátiť do skoršieho bodu. Krok späť, zrušenie rozrobenej zmeny, obnova po chybe — všetko potrebuje zapamätaný stav.
  • Zapuzdrenie sa nesmie porušiť. Objekt vydá snímku sám a nikto zvonku nemusí vedieť, z čoho sa jeho stav skladá.
  • Uchovávanie stavu má robiť niekto iný než ten, komu patrí. Editor vie, čo si má zapamätať; koľko snímok sa drží a dokedy, je vec histórie.
  • Pred riskantnou operáciou treba mať istotu návratu. Snímka je poistka, ktorú stačí zahodiť, keď sa všetko podarí.

Pasce

  • Snímky sú drahé. Každá je kópia stavu, takže pri veľkom objekte a dlhej histórii je pamäť preč skôr, než si to niekto všimne.
  • Plytká kópia nie je snímka. Keď si snímka odloží odkaz na tú istú vnútornú štruktúru, zmení sa spolu s objektom — a vrátenie do minulosti vráti prítomnosť.
  • Držiteľ nesmie do snímky vidieť. Akonáhle z nej začne čítať, stane sa závislým na vnútri cudzieho objektu a zapuzdrenie je preč.
  • Zamieňa sa s Command. Príkaz vie, akú operáciu vykonal, a vracia ju opačným krokom; snímka nevie o operácii nič a vracia celý stav naraz. Prvý si pamätá zmenu, druhý výsledok.
  • Nikto nevie, kedy snímku zahodiť. Bez pravidla história rastie donekonečna a s ňou aj všetko, na čo snímky odkazujú.
  • Obnovený stav nemusí sedieť s okolím. Objekt sa vráti do minulosti, ale to, s čím medzitým komunikoval, zostalo v prítomnosti.