všetky vzory

Command

Zabalí volanie do objektu, ktorý sa dá odložiť, zaradiť do frontu alebo vrátiť.

class Command {  execute() { throw new Error('abstraktná metóda'); }  undo() { throw new Error('abstraktná metóda'); }} class InsertText extends Command {  constructor(doc, text) {    super();    this.doc = doc;    this.text = text;  }   execute() {    this.doc.insert(this.text);  }   undo() {    this.doc.delete(this.text.length);  }} class Button {  history = [];   press(command) {    command.execute();    this.history.push(command);  }   undo() {    const last = this.history.pop();    last.undo();  }} const button = new Button();button.press(new InsertText(doc, 'hello'));button.press(new InsertText(doc, ' world'));button.undo();   // a call can be undone, because it is an object

Celý priebeh v texte (11 krokov)
  1. Command je abstraktný a vie dve veci: vykonať sa a vrátiť sa späť. To druhé je pri obyčajnom volaní nemysliteľné — volanie po sebe nenechá nič, čo by sa dalo vrátiť.
  2. Používateľ klikne na tlačidlo.
  3. A tu je celý vzor: z toho kliku sa stane objekt. Tlačidlo nič nevykoná — vyrobí príkaz typu InsertText a ten je odteraz vec, ktorú možno držať v ruke.
  4. Až potom povie príkazu, nech sa vykoná. Text pribudne v dokumente.
  5. A príkaz zostáva v histórii. Toto je ten rozdiel: obyčajné volanie by v tejto chvíli už neexistovalo.
  6. Druhý klik.
  7. Druhý príkaz — nová instancia s vlastným textom, uložená vedľa prvej.
  8. Aj ten sa vykoná.
  9. A teraz to, čo je bez vzoru nemožné: používateľ dá krok späť.
  10. Tlačidlo vezme posledný príkaz z histórie a povie mu, nech sa vráti. Ten vie, čo urobil, takže vie aj ako to odčiniť — a potom z histórie zmizne.
  11. V histórii zostal prvý príkaz a druhý je odčinený. Volanie zabalené do objektu sa dá odložiť, zaradiť do frontu, zopakovať aj vrátiť — obyčajné volanie zmizne, len čo prebehne.

Kedy použiť

  • Akcia sa má dať vrátiť späť — volanie po sebe nenechá nič, objekt áno.
  • Príkaz sa dá zaradiť do frontu, poslať inam a vykonať neskôr, než padlo rozhodnutie.
  • Tlačidlo, skratka aj menu držia ten istý príkaz a ani jedno nevie, čo sa stane.
  • Zoznam príkazov je zároveň história, makro aj protokol o tom, čo sa udialo.
  • Volajúci drží príkaz, nie príjemcu — ten sa dá vymeniť bez jeho vedomia.

Pasce

  • Vrátenie späť je ťažšie, než vyzerá — niekedy znamená uložiť celý predošlý stav.
  • Desať operácií znamená desať tried, väčšinou s jedinou jednoriadkovou metódou.
  • Zamieňa sa so Strategy: stratégia hovorí ako, príkaz čo — prvá sa vymieňa, druhý odkladá.
  • Kroky sa vracajú odzadu; vrátenie prostredného dá dokument, aký nikdy neexistoval.
  • Kým je príkaz v histórii, drží aj svojho príjemcu — ten nezanikne ani po zavretí.