všetky vzory

Template Method

Zafixuje skelet postupu a nechá podtriedam doplniť jednotlivé kroky.

class Report {  // Skelet postupu. Poradie je pevné a potomok ho nezmení.  vytvor(data) {    this.hlavicka();    this.telo(data);    this.paticka();  }   hlavicka() {    // rovnaká pre všetkých  }   paticka() {    // rovnaká pre všetkých  }   telo(data) { throw new Error('abstraktná metóda'); }} class PdfReport extends Report {  telo(data) {    // vysadí tabuľku do PDF  }} class HtmlReport extends Report {  telo(data) {    // vypíše tabuľku do HTML  }} new PdfReport().vytvor(data);new HtmlReport().vytvor(data);

Celý priebeh v texte (10 krokov)
  1. Report je abstraktný a drží celý postup: hlavička, telo, pätička — v tomto poradí. Čo z toho je pevné a čo sa smie doplniť, rozhoduje on.
  2. Klient si vypýta PDF report. Volá PdfReport — o rodičovi nemusí vedieť nič.
  3. Lenže postup nebeží v PdfReport. Metóda je zdedená, takže poradie krokov je napísané hore, v rodičovi — a beží tam.
  4. Prvý krok je pevný: hlavičku kreslí rodič sám a pre všetkých rovnako. Potomok do nej nemá ako zasiahnuť.
  5. Druhý krok rodič nevie. Zavolá ho späť dolu, do potomka — a to je celý vzor: riadenie ide zhora, obsah zdola.
  6. Tretí krok je zase pevný. Pätička je rovnaká ako hlavička — spoločná pre všetkých.
  7. Druhý klient chce HTML.
  8. Postup je ten istý a beží zase v rodičovi. Hlavička aj pätička sú rovnaké, poradie tiež — nič z toho sa nedalo zmeniť.
  9. Otvorený krok ale skončil inde. Ten istý bod v postupe, iný potomok, iný výsledok.
  10. Poradie krokov je na jednom mieste a nedá sa obísť; potomok dopĺňa len to, čo mu rodič nechal otvorené. A všimni si, že na scéne nikto nič nedrží — celé to stojí na dedení, nie na odkaze. Práve tým sa vzor líši od Strategy.

Kedy použiť

  • Postup je pre všetky varianty rovnaký a líšia sa len niektoré kroky. Skelet sa napíše raz a potomkovia doplnia to málo, čo je odlišné.
  • Poradie krokov je podstatné a nesmie sa dať obísť. Keď ho drží rodič, potomok ho nemá ako zmeniť ani omylom.
  • Rovnaký kód sa opakuje v niekoľkých triedach a odlišuje sa uprostred. To spoločné sa vysunie hore, rozdiely zostanú dole.
  • Chcete presne určiť, kde sa smie zasiahnuť. Otvorené sú len tie metódy, ktoré rodič nechal nedokončené — a nič iné.

Pasce

  • Zamieňa sa so Strategy. Obidva menia časť správania, ale template method to robí dedením a stratégia zložením. Tu potomok krok dopĺňa a nedá sa vymeniť za behu; tam kontext dostane algoritmus zvonku ako objekt a vymeniť sa dá kedykoľvek.
  • Dedenie je väzba na celý život. Potomok je zviazaný s rodičom a jednu triedu môže rozšíriť len raz — keby mal doplniť kroky do dvoch postupov, nemá ako.
  • Rodič volá potomka a to sa ťažko číta. Beh preskakuje medzi dvoma triedami a v ani jednej z nich nie je celý postup vidieť naraz.
  • Otvorených krokov býva priveľa. Keď je nedokončená polovica metód, skelet nedrží nič a z rodiča sa stane zoznam prianí.
  • Potomok môže skelet prepísať. Nič mu nebráni prekryť aj tú metódu, ktorá mala byť pevná — a pravidlo, na ktorom vzor stojí, ticho padne.
  • Zmena v rodičovi sa prejaví u všetkých potomkov naraz. To je zámer aj riziko: postup sa dá vylepšiť na jednom mieste, ale aj pokaziť pre všetkých naraz.