všetky vzory

Delegation

Prenechá prácu inému objektu, no navonok za ňu ručí sám.

class Engine {  spin() {    // spins the wheels  }} class Radio {  turnOn(station) {    // tunes in and plays  }} class Car {  constructor() {    this.engine = new Engine();    this.radio = new Radio();  }   // The car does not drive itself. It hands the work to the engine, but answers for it.  drive() {    this.engine.spin();  }   play(station) {    this.radio.turnOn(station);  }} const car = new Car(); car.drive();car.play('FM 90.6');   // the driver knows nothing about the engine or the radio

Celý priebeh v texte (9 krokov)
  1. Car si drží dvoch pomocníkov: motor a rádio. Ani jeden s ním nezdieľa rozhranie — sú to iné triedy s inou prácou, nie jeho podoby.
  2. Vodič povie autu, nech ide. Volá auto — nič iné na scéne nepozná.
  3. Car nejazdí sám. Prácu pošle ďalej motoru — ale navonok za ňu ručí ono.
  4. Engine roztočí kolesá. O vodičovi nevie nič a ani nemusí.
  5. Vodič si zapne hudbu. Volá zase auto, nie rádio.
  6. Táto práca ide druhému pomocníkovi. Car sa nestal rádiom, len mu ju prenechal.
  7. Rádio hrá.
  8. Z vodiča nevedie dráha ani k motoru, ani k rádiu. O oboch sa nikdy nedozvie — pozná auto a auto mu za obe veci ručí.
  9. A tu je rozdiel oproti zastupovaniu aj oproti dedeniu: na scéne nie je ani jedna abstraktná trieda. Car sa za motor nevydáva a ani ním nie je — len prácu prenecháva a zodpovednosť si necháva.

Kedy použiť

  • Trieda má navonok jednu zodpovednosť, ale vnútri ju skladá z pomocníkov.
  • Delegovanie vezme z cudzej triedy len to, čo treba; dedenie by zobralo aj zvyšok.
  • Pomocník je súkromná vec triedy — môže ho vystriedať iný a navonok sa nezmení nič.
  • Cudzia trieda robí, čo treba, ale s iným rozhraním; obalí ju vlastná metóda.

Pasce

  • Zamieňa sa s Proxy: zástupca má rovnaké rozhranie ako zastupovaný, auto sa za motor nevydáva.
  • Zamieňa sa s dedením: potomok je tým, z čoho dedí, ale auto motorom nikdy nebude.
  • Zodpovednosť sa prenechať nedá — keď zlyhá pomocník, volajúci sa obráti na delegujúceho.
  • Trieda plná jednoriadkových preposielaní je vrstva navyše, ktorá nič nerieši.
  • Chyba z pomocníka vyletí v jeho jazyku a presiakne von to, čo malo zostať skryté.
  • Stačí getter, ktorý pomocníka vráti, a skrytie je zbytočné — volajúci ho začne volať priamo.