všetky vzory

Chain of Responsibility

Posúva požiadavku po reťazi spracovateľov, kým ju niekto nevyrieši.

class Approver {  constructor() {    this.next = null;  }   handle(request) {    if (this.canApprove(request)) {      this.approve(request);      return;    }    if (this.next !== null) {      this.next.handle(request);    }  }} class Manager extends Approver {  canApprove(request) {    return request.amount <= 1000;  }} class Director extends Approver {  canApprove(request) {    return request.amount <= 10000;  }} class Board extends Approver {  canApprove(request) {    return true;  }} const manager = new Manager();manager.next = new Director();manager.next.next = new Board(); manager.handle({ amount: 500 });manager.handle({ amount: 8000 });manager.handle({ amount: 200000 });

Celý priebeh v texte (12 krokov)
  1. Approver je abstraktný a všetky tri články ho dedia. Každý vie to isté: buď žiadosť vybaví, alebo ju posunie ďalej.
  2. Reťaz drží sama seba: vedúci má odkaz na riaditeľa, riaditeľ na predstavenstvo. Posledný článok už nedrží nikoho.
  3. Prvá žiadosť: 500 eur. Zamestnanec ju podá na začiatok reťaze a viac o nej nevie.
  4. Vedúci má limit tisíc, takže je to jeho prípad. Vybaví ju sám a ďalej nejde nič — riaditeľ ani predstavenstvo o nej nikdy nepočuli.
  5. Druhá žiadosť: osemtisíc. Zamestnanec ju podáva na to isté miesto ako predtým.
  6. Nad jeho limit. Vedúci nerozhoduje a ani neodmieta — jednoducho ju posunie ďalej.
  7. Riaditeľ má limit desaťtisíc, takže tu sa reťaz zastaví. Predstavenstvo sa o tejto žiadosti nedozvie.
  8. Tretia žiadosť: dvestotisíc. Znova to isté miesto.
  9. Vedúci ju posunie ďalej.
  10. Riaditeľ tiež — a teraz je na rade posledný článok.
  11. Predstavenstvo zvládne všetko, takže reťaz končí tu. Práve preto musí posledný článok zobrať čokoľvek — inak by žiadosť prepadla na koniec a nestalo by sa nič.
  12. Zamestnanec vždy volal to isté miesto a ani raz sa nedozvedel, kto to vybaví. Reťaz sa dá preskladať alebo predĺžiť bez toho, aby o tom vedel — a to je celý zmysel vzoru.

Kedy použiť

  • Odosielateľ pozná len začiatok reťaze; kto požiadavku vybaví, sa ukáže až za behu.
  • Spracovateľov možno pridávať a preskladávať bez zásahu do volajúceho.
  • Namiesto dlhého reťazca vetiev je každá vetva trieda, ktorá vie jediné: či je to jej prípad.
  • Kontrola prístupu, filtrovanie, logovanie — každé miesto má právo požiadavku zastaviť.

Pasce

  • Požiadavka môže prepadnúť na koniec a zmiznúť bez stopy aj bez chyby.
  • Chýbajúci odkaz na nasledujúceho ukončí reťaz ticho uprostred.
  • Celá cesta požiadavky nie je vidieť na jednom mieste, ladí sa článok po článku.
  • Poradie článkov je skryté pravidlo, ktoré nikde nie je napísané ako podmienka.
  • Zamieňa sa s Decoratorom: ten pustí volanie ďalej vždy, článok reťaze ho spravidla zastaví.
  • Dva články, ktoré sa odkazujú navzájom, nechajú požiadavku behať donekonečna.
  • Dlhá reťaz sa prejde celá aj vtedy, keď ju vybaví až posledný článok.