všetky vzory

Template Method

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

class Report {  // The skeleton of the procedure. The order is fixed and a child cannot change it.  create(data) {    this.header();    this.body(data);    this.footer();  }   header() {    // the same for everyone  }   footer() {    // the same for everyone  }   body(data) { throw new Error('abstraktná metóda'); }} class PdfReport extends Report {  body(data) {    // typesets the table into PDF  }} class HtmlReport extends Report {  body(data) {    // writes the table out as HTML  }} new PdfReport().create(data);new HtmlReport().create(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.
  • Poradie krokov drží rodič, takže ho potomok nemá ako obísť ani omylom.
  • Rovnaký kód sa opakuje vo viacerých triedach a líši sa uprostred.
  • Zasiahnuť sa smie len tam, kde rodič metódu nechal nedokončenú.

Pasce

  • Zamieňa sa so Strategy: tu sa správanie mení dedením napevno, tam zložením a za behu.
  • Dedenie je väzba na celý život a jednu triedu možno rozšíriť len raz.
  • Rodič volá potomka, beh preskakuje medzi triedami a postup nie je nikde vidieť naraz.
  • Keď je nedokončená polovica metód, z rodiča sa stane zoznam prianí.
  • Potomok môže prekryť aj tú metódu, ktorá mala byť pevná — a pravidlo ticho padne.
  • Zmena v rodičovi sa prejaví u všetkých potomkov: dá sa tak vylepšiť aj pokaziť naraz.