všetky vzory

Facade

Dá jednoduché rozhranie pred zložitý podsystém.

class Sklad {  rezervuj(tovar) {    // zníži dostupné množstvo  }} class Platba {  strhni(suma) {    // zaúčtuje sumu  }} class Doprava {  objednaj(adresa) {    // vytvorí zásielku  }} // Fasáda pozná poradie. Klient ho poznať nemusí.class ObjednavkaFasada {  constructor() {    this.sklad = new Sklad();    this.platba = new Platba();    this.doprava = new Doprava();  }   dokonci(objednavka) {    this.sklad.rezervuj(objednavka.tovar);    this.platba.strhni(objednavka.suma);    this.doprava.objednaj(objednavka.adresa);  }} const fasada = new ObjednavkaFasada();fasada.dokonci(objednavka);   // jedno volanie namiesto troch

Celý priebeh v texte (8 krokov)
  1. Vzadu je podsystém: tri triedy, každá o niečom inom. Aby objednávka prešla, musia sa zavolať všetky tri.
  2. A musia sa zavolať v poradí. Bez fasády by to poradie musel poznať klient — vedieť, že najprv sa rezervuje tovar, potom sa strháva platba a až nakoniec sa objednáva doprava.
  3. S fasádou zavolá klient jedinú metódu: dokonci(). Nič viac o podsystéme nevie a ani vedieť nepotrebuje.
  4. Prvý krok: fasáda rezervuje tovar v sklade.
  5. Druhý krok: strhne platbu. Až teraz, keď je tovar istý — opačné poradie by znamenalo strhnutú platbu za tovar, ktorý medzitým niekto kúpil.
  6. Tretí krok: objedná dopravu.
  7. Klient dal jedno volanie a dostal jednu odpoveď. O troch triedach za fasádou sa nedozvedel a poradie ho nikdy nezaujímalo.
  8. Jedno volanie zvonku, tri dovnútra — a to je celý vzor. Fasáda pritom nič nezakazuje: podsystém zostáva prístupný a kto potrebuje viac, siahne doň priamo.

Kedy použiť

  • Bežný prípad použitia vyžaduje zavolať niekoľko tried v správnom poradí. Fasáda to poradie pozná raz za všetkých a volajúci ho nemusí poznať vôbec.
  • Podsystém je zložitejší, než väčšina volajúcich potrebuje. Deväťdesiat percent z nich chce jednu vec — tá dostane jednu metódu, zvyšok si siahne hlbšie.
  • Cudzia knižnica má presakovať len na jednom mieste. Keď ju raz vymeníte, prepíše sa fasáda a nie tridsať miest v aplikácii.
  • Vrstvy sa majú dať oddeliť. Fasáda je prirodzené miesto, kadiaľ jedna vrstva hovorí s druhou, a jediné, ktoré treba pri zmene hranice sledovať.

Pasce

  • Fasáda nesmie zakazovať. Jej úlohou je uľahčiť bežný prípad, nie zamurovať podsystém — kto potrebuje viac, musí sa vedieť dostať dovnútra priamo.
  • Zamieňa sa s Adaptérom. Adaptér mení tvar rozhrania, aby sedelo do existujúceho očakávania; fasáda tvar nemení, len ho zjednodušuje. Prvý prekladá, druhý ukrýva.
  • Rastie, kým sa z nej nestane božská trieda. Každý ďalší prípad pridá metódu a po roku je vo fasáde viac logiky než v podsystéme, ktorý mala len sprístupniť.
  • Skryté poradie sa stane skrytým pravidlom. Kto zavolá podsystém priamo a poradie nedodrží, dostane chybu, ktorú fasáda dovtedy nenápadne riešila za neho.
  • Vyzerá ako celý podsystém, ale nie je ním. Volajúci si zvykne, že stačí fasáda, a keď mu raz nestačí, zistí, že o vrstve pod ňou nevie vôbec nič.
  • Chyby z troch rôznych svetov vyletia jednou metódou. Bez prekladu volajúci nemá ako rozlíšiť, či zlyhal sklad, platba alebo doprava — a pritom sa každá rieši inak.