všetky vzory

Mediator

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

class DialogMediator {  constructor(toggle, field, button) {    this.toggle = toggle;    this.field = field;    this.button = button;  }   // The dialog rules live here, in one place.  changed(who) {    if (who === this.toggle) {      this.field.unlock(this.toggle.on);      this.button.enable(this.toggle.on);    }  }} class Toggle {  constructor(mediator) {    this.mediator = mediator;    this.on = false;  }   flip() {    this.on = !this.on;    this.mediator.changed(this);  }} // A widget knows the mediator and nobody else.const dialog = new DialogMediator(toggle, field, button);toggle.flip();

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ť

  • Väzieb je priveľa: pri piatich objektoch dvadsať, s prostredníkom päť.
  • Kto po zmene čoho čo urobí, je logika dialógu, nie logika tlačidla.
  • Widget, ktorý nepozná ostatné, sa dá vložiť do iného okna aj otestovať sám.
  • Iná spolupráca tých istých prvkov znamená vymeniť prostredníka, nie účastníkov.

Pasce

  • Prostredník sa stane božskou triedou — sieť väzieb nezmizla, len sa presťahovala.
  • Zamieňa sa s Observerom: tam ide oznámenie zo subjektu k prihláseným, tu ho stred prijme a rozpošle.
  • Účastník musí poznať prostredníka, takže bez neho už samostatne nefunguje.
  • Prostredník zmení účastníka, ten sa ohlási znova a bez poistky sa to opakuje donekonečna.
  • Chyba sa prejaví u účastníka, ale pravidlo, ktoré poslúchol, je napísané v strede.
  • Pri dvoch účastníkoch je prostredník zbytočná vrstva.