všetky vzory

Delegation

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

class Motor {  stoc() {    // roztočí kolesá  }} class Radio {  zapni(stanica) {    // naladí a hrá  }} class Auto {  constructor() {    this.motor = new Motor();    this.radio = new Radio();  }   // Auto nejazdí samo. Prácu prenechá motoru, ale navonok za ňu ručí ono.  jazdi() {    this.motor.stoc();  }   hraj(stanica) {    this.radio.zapni(stanica);  }} const auto = new Auto(); auto.jazdi();auto.hraj('FM 90.6');   // vodič o motore ani rádiu nevie

Celý priebeh v texte (9 krokov)
  1. Auto 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. Auto nejazdí samo. Prácu pošle ďalej motoru — ale navonok za ňu ručí ono.
  4. Motor 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. Auto sa nestalo rádiom, len mu ju prenechalo.
  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. Auto 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 viacerých. Prácu prenechá pomocníkom a volajúcemu stačí poznať ju jedinú.
  • Dedenie by zobralo priveľa. Delegovanie vezme z cudzej triedy len to, čo naozaj treba, a nezdedí pri tom aj všetko ostatné.
  • Pomocníka treba vymeniť bez toho, aby sa to dotklo volajúceho. Je to súkromná vec triedy, takže ho môže vystriedať iný a navonok sa nezmení nič.
  • Cudzia trieda robí presne to, čo potrebujete, ale s iným rozhraním alebo v inom kontexte. Obalíte ju vlastnou metódou a používate ju po svojom.

Pasce

  • Zamieňa sa s Proxy. Zástupca má rovnaké rozhranie ako to, čo zastupuje, a volajúci si myslí, že hovorí priamo s ním. Pri delegovaní žiadne spoločné rozhranie nie je — auto sa za motor nevydáva, len ho používa.
  • Zamieňa sa s dedením. Potomok je tým, z čoho dedí; delegujúci nie je tým, komu prácu prenecháva. Auto nie je motor a nikdy ním nebude.
  • Zodpovednosť sa prenechať nedá. Keď pomocník zlyhá, volajúci sa obráti na toho, koho pozná — a to je stále delegujúci, nie ten, kto prácu naozaj robil.
  • Metódy, ktoré len posúvajú volanie ďalej, sa nakopia. Trieda plná jednoriadkových preposielaní pridáva vrstvu, ktorá nič nerieši — vtedy treba priznať, že volajúci má hovoriť priamo s pomocníkom.
  • Chyba z pomocníka vyletí v jeho jazyku. Keď ju delegujúci neprepíše do svojho, presiakne cez rozhranie práve to, čo malo zostať skryté.
  • Pomocník sa dostane von cez getter. Stačí jedna metóda, ktorá ho vráti, a celé skrytie je zbytočné — volajúci si ho odloží a začne ho volať priamo.