všetky vzory

Adapter

Prekladá rozhranie jednej triedy na rozhranie, ktoré klient očakáva.

// Third-party code. We cannot rewrite it — it has run in production for years.class LegacyGateway {  sendPaymentXml(xml) {    return '<response><status>OK</status></response>';  }} // The interface the client knows how to use.class Payment {  pay(amount) { throw new Error('abstraktná metóda'); }} class GatewayAdapter extends Payment {  constructor(gateway) {    super();    this.gateway = gateway;  }   pay(amount) {    const xml = '<payment><amount>' + amount + '</amount></payment>';    const response = this.gateway.sendPaymentXml(xml);    return { status: response.includes('<status>OK</status>') ? 'ok' : 'error' };  }} const payment = new GatewayAdapter(new LegacyGateway());payment.pay(25);   // { status: 'ok' }

Celý priebeh v texte (9 krokov)
  1. Payment je rozhranie, ktoré klient vie použiť. GatewayAdapter ho spĺňa — čiara k nemu vedie.
  2. LegacyGateway ho nespĺňa a k rozhraniu od nej žiadna čiara nevedie. Prepísať ju nemôžeme — je to cudzí kód, ktorý beží roky. Presne preto tu adaptér je.
  3. Klient zavolá pay() — jedinú metódu, ktorú pozná. O starej bráne nevie nič.
  4. Adaptér ďalej pay() nevolá. Stará brána takú metódu nemá — vie len sendPaymentXml(), takže adaptér volá tú.
  5. Stará brána odpovie po svojom: XML. Tvar odpovede je tu štvorec — takto by ju klient použiť nevedel.
  6. Odpoveď sa vracia adaptéru. Odtiaľto už neletí volanie, ale objekt.
  7. A tu je celý vzor: adaptér preloží odpoveď do tvaru, ktorý klient očakáva. Ten istý údaj, iný tvar.
  8. Takto preloženú ju pošle klientovi.
  9. Klient dostal presne to, čo čakal. Že za tým je XML a dvadsať rokov stará brána, sa nedozvedel — a to je zmysel adaptéra: nezmenil ani jednu z tých dvoch strán, len ich spojil.

Kedy použiť

  • Cudzia trieda robí presne to, čo treba, ale hovorí iným jazykom — a prepísať sa nedá.
  • Výmena knižnice za inú je potom práca na jednom mieste, nie naprieč kódom.
  • Niekoľko rôznych zdrojov sa má tváriť rovnako — tri platobné brány, tri formáty importu.
  • Adaptér sa dá nahradiť atrapou a zvyšok kódu o tom nevie.

Pasce

  • Adaptér prekladá rozhranie, nie schopnosti — čo pôvodná trieda nevie, to zamlčí alebo predstiera.
  • Zamieňa sa s Decoratorom: ten rozhranie zachováva a pridáva chovanie, adaptér ho mení a chovanie nechá tak.
  • Výnimka pôvodnej knižnice prepustená von rozvlečie jej meno po kóde, ktorý ju nemal poznať.
  • Preklad sa robí pri každom volaní a pri veľkých dávkach je jeho cena zrazu vidieť.
  • Cudzia knižnica sa mení pod rukami; bez vlastných testov adaptéra to ohlásia až používatelia.