všetky vzory

Servant

Vyčlení spoločné chovanie do objektu, ktorý ho vykoná pre viac tried.

class Movable {  position() { throw new Error('abstraktná metóda'); }  setPosition(x, y) { throw new Error('abstraktná metóda'); }} class Circle extends Movable {  position() {    return this.center;  }   setPosition(x, y) {    this.center = { x, y };  }} class Rectangle extends Movable {  position() {    return this.topLeft;  }   setPosition(x, y) {    this.topLeft = { x, y };  }} // The servant. Moving is neither in the circle nor in the rectangle — it is here.class Mover {  move(shape, dx, dy) {    const p = shape.position();    shape.setPosition(p.x + dx, p.y + dy);  }} const mover = new Mover();mover.move(circle, 10, 0);mover.move(rectangle, 10, 0);

Celý priebeh v texte (9 krokov)
  1. Movable je abstraktný: vie povedať svoju polohu a nastaviť novú. Kruh aj obdĺžnik ho dedia — inak spolu nemajú nič spoločné.
  2. Ani v jednom z nich ale nie je napísané, ako sa posunúť o vektor. Tú prácu nemá v sebe ani kruh, ani obdĺžnik.
  3. Je v sluhovi. Ten ju vie spraviť pre čokoľvek, čo dedí Movable — a sám nemá žiadny stav.
  4. Klient povie sluhovi: posuň tento kruh. Tvar mu podá ako parameter.
  5. Sluha zavolá kruh — spýta sa ho na polohu a nastaví novú. Robí to zvonku, cez rozhranie, do vnútra kruhu nesiaha.
  6. Teraz obdĺžnik. Klient volá to isté.
  7. A sluha robí to isté. Rovnaký kód, iná trieda — jediné, na čom mu záleží, je spoločné rozhranie.
  8. Všimni si smer. Sluha volá tvary, tvary nevolajú jeho — nemajú naň ani odkaz a o jeho existencii nevedia. Keby zmizol, nezmenil by sa v nich ani znak.
  9. Spoločné chovanie je na jednom mieste a nie je v ani jednej z tried, ktorých sa týka. Cena je v tom, že tvary musia zo seba vydať dosť na to, aby sa dali obslúžiť zvonku — a kto číta triedu Circle, sa už nedozvie, čo všetko sa s ňou dá robiť.

Kedy použiť

  • To isté chovanie potrebuje viac nesúvisiacich tried — vyčlení sa do sluhu.
  • Sluha pracuje zvonku cez rozhranie, takže cudziu knižnicu meniť netreba.
  • Circle vie, kde je; posúvanie o vektor je operácia nad ním, nie jeho vlastnosť.
  • Operácií pribúda: každá je nový sluha a obsluhované triedy zostanú, aké boli.

Pasce

  • Zamieňa sa s delegovaním: kto deleguje, volá pomocníka; sluha volá sám a obsluhované triedy oň ani nezavadia.
  • Sluha potrebuje čítať aj meniť cudzí stav, takže rozhranie sa rozšíri a zapuzdrenie trpí.
  • Bez spoločného rozhrania sa sluha rozpadne na sériu podmienok podľa typu.
  • Sluha bez stavu sa ľahko zvrhne na zberňu nesúvisiacich funkcií.
  • Kto číta triedu Circle, nezistí, čo všetko sa s ňou dá robiť — je to po sluhoch.