všetky vzory

Mediator

Nahradí priame väzby medzi objektmi jedným prostredníkom.

class DialogMediator {  constructor(prepinac, pole, tlacidlo) {    this.prepinac = prepinac;    this.pole = pole;    this.tlacidlo = tlacidlo;  }   // Pravidlá dialógu sú tu, na jednom mieste.  zmeniloSa(kto) {    if (kto === this.prepinac) {      this.pole.odomkni(this.prepinac.zapnuty);      this.tlacidlo.povol(this.prepinac.zapnuty);    }  }} class Prepinac {  constructor(mediator) {    this.mediator = mediator;    this.zapnuty = false;  }   prepni() {    this.zapnuty = !this.zapnuty;    this.mediator.zmeniloSa(this);  }} // Widget pozná prostredníka a nikoho iného.const dialog = new DialogMediator(prepinac, pole, tlacidlo);prepinac.prepni();

Celý priebeh v texte (10 krokov)
  1. Tri widgety, ktoré musia spolupracovať. Bez prostredníka by každý musel poznať ostatné — pri troch je to šesť väzieb, pri piatich už dvadsať.
  2. S prostredníkom pozná každý widget len jeho. Všimni si, že medzi widgetmi nevedie ani jedna dráha — všetky sa stretávajú v strede.
  3. Používateľ zapne prepínač. Ten to oznámi prostredníkovi — a nikomu inému, lebo o nikom inom nevie.
  4. Prostredník pozná pravidlo: pri zapnutom prepínači sa odomkne textové pole.
  5. A povolí sa tlačidlo. Obe rozhodnutia padli v strede, nie u widgetov.
  6. Prepínač o poli ani o tlačidle nevie nič. Keby oba zmizli, nezmenil by sa v ňom ani znak.
  7. Používateľ prepínač vypne. To isté oznámenie ako pred chvíľou — prepínač posiela vždy len „zmenil som sa".
  8. Dôsledok je ale opačný: pole sa zamkne. Pravidlo je v prostredníkovi, takže sa zmenilo správanie a nie widget.
  9. A tlačidlo sa zakáže.
  10. Pravidlá dialógu sú na jednom mieste a widgety sú hlúpe a vymeniteľné. Cena je v tom strede: prostredník vie o všetkých a rastie s každým ďalším — sieť väzieb nezmizla, len sa presťahovala.

Kedy použiť

  • Objekty sa musia navzájom ovplyvňovať a väzieb je priveľa. Pri troch je ich šesť, pri piatich dvadsať — prostredník ich zmení na päť.
  • Pravidlá spolupráce majú byť na jednom mieste. Kto po zmene čoho čo urobí, je logika dialógu, nie logika tlačidla.
  • Účastníci majú zostať použiteľní samostatne. Widget, ktorý nepozná ostatné, sa dá vložiť do iného okna alebo otestovať bez nich.
  • Tie isté prvky majú v inom kontexte spolupracovať inak. Vymení sa prostredník a nie ani jeden z účastníkov.

Pasce

  • Prostredník sa stane božskou triedou. Všetky pravidlá sú v ňom, takže rastie s každým účastníkom aj s každou novou podmienkou — sieť väzieb nezmizla, len sa presťahovala.
  • Zamieňa sa s Observerom. Pri Observerovi vychádza oznámenie vždy zo subjektu a odberatelia sa naň prihlásili sami. Prostredník oznámenie prijíma od účastníka a rozpošle ho ostatným — je to hviezda so stredom, ktorý rozhoduje, nie rozhlas.
  • Účastník musí poznať prostredníka. Väzba nezmizla, len je jedna namiesto mnohých — a bez neho už widget nefunguje samostatne.
  • Reťazenie zmien sa dá zacykliť. Prostredník zmení účastníka, ten sa ohlási znova a bez poistky sa to opakuje donekonečna.
  • Príčinu chyby treba hľadať v strede, nie tam, kde sa prejaví. Účastník, ktorý sa zachoval nesprávne, spravidla len poslúchol pravidlo, ktoré je napísané inde.
  • Pri dvoch účastníkoch je prostredník zbytočná vrstva. Vzor sa začne vyplácať až tam, kde väzieb pribúda rýchlejšie než objektov.