všetky vzory

Bridge

Oddelí abstrakciu od implementácie, aby sa dali meniť nezávisle.

class Channel {  send(text) { throw new Error('abstraktná metóda'); }} class EmailChannel extends Channel {  send(text) {    // over SMTP  }} class SmsChannel extends Channel {  send(text) {    // through the carrier gateway  }} class Message {  constructor(channel) {    this.channel = channel;  }   dispatch(text) { throw new Error('abstraktná metóda'); }} class PlainMessage extends Message {  dispatch(text) {    this.channel.send(text);  }} class UrgentMessage extends Message {  dispatch(text) {    this.channel.send('ALERT: ' + text);  }} const a = new PlainMessage(new EmailChannel());const b = new PlainMessage(new SmsChannel());const c = new UrgentMessage(new EmailChannel());

Celý priebeh v texte (12 krokov)
  1. Vľavo hierarchia správ. Message je abstraktná a hovorí len to, že správa sa dá odoslať.
  2. Vpravo druhá, úplne samostatná hierarchia: kanály. Channel je tiež abstraktný a s hierarchiou správ ho nespája žiadne dedenie — sú to dva nezávislé stromy.
  3. A tu je most: správa si drží referenciu na kanál. Jedno lanko — jediné miesto, kde sa tie dve hierarchie stretávajú.
  4. PlainMessage sa odosiela. Zavolá send() na tom, čo drží, a netuší, či je to e-mail alebo niečo iné.
  5. Skončilo to v EmailChannel.
  6. Teraz vymeníme, čo je za mostom. Tá istá trieda správy, iná referencia — dedenie by sa takto prehodiť nedalo.
  7. To isté odoslanie, ten istý kód v PlainMessage.
  8. A tentoraz to skončilo v SmsChannel. V triede správy sa nezmenilo nič.
  9. Teraz tá druhá strana mosta. UrgentMessage je iný druh správy — a drží si vlastnú referenciu, hoci na ten istý kanál ako predtým bežná.
  10. Odosiela sa po svojom — text si najprv označí ako urgentný — ale posiela ho cez rovnaký kanál.
  11. Znova EmailChannel, a ten sa kvôli urgentnej správe nemusel meniť ani o písmeno.
  12. Dva druhy správ a dva kanály dávajú štyri kombinácie — a stálo to štyri triedy, nie štyri podtriedy pre každú dvojicu. Keď pribudne tretí kanál, pribudne jedna trieda vpravo a vľavo sa nezmení nič.

Kedy použiť

  • Objekt sa mení v dvoch nezávislých smeroch naraz — druh správy a spôsob doručenia.
  • Tri druhy a štyri kanály sú dvanásť podtried; s mostom sedem tried a ľubovoľná kombinácia.
  • Referencia sa dá prehodiť za behu, zdedený spôsob nie.
  • Kanály môže dodávať niekto iný než správy a ani jedna strana nesleduje rast tej druhej.
  • Klient drží abstrakciu a to, čo je za mostom, sa dá vymeniť bez neho.

Pasce

  • Zamieňa sa s Adaptérom: ten rieši nesúlad, ktorý už vznikol, most sa navrhuje dopredu.
  • Zamieňa sa so Strategy: tá vymieňa algoritmus vnútri triedy, most oddeľuje dve rastúce hierarchie.
  • Pri jedinej implementácii most nič neoddeľuje a je len réžia navyše.
  • Keď do rozhrania implementácie presakujú potreby jednotlivých abstrakcií, prestane byť spoločné.
  • Len čo sa abstrakcia rozhoduje podľa konkrétneho typu implementácie, väzba je späť.