všetky vzory

Bridge

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

class Kanal {  posli(text) { throw new Error('abstraktná metóda'); }} class EmailKanal extends Kanal {  posli(text) {    // cez SMTP  }} class SmsKanal extends Kanal {  posli(text) {    // cez bránu operátora  }} class Sprava {  constructor(kanal) {    this.kanal = kanal;  }   odosli(text) { throw new Error('abstraktná metóda'); }} class BeznaSprava extends Sprava {  odosli(text) {    this.kanal.posli(text);  }} class UrgentnaSprava extends Sprava {  odosli(text) {    this.kanal.posli('POZOR: ' + text);  }} const a = new BeznaSprava(new EmailKanal());const b = new BeznaSprava(new SmsKanal());const c = new UrgentnaSprava(new EmailKanal());

Celý priebeh v texte (12 krokov)
  1. Vľavo hierarchia správ. Sprava je abstraktná a hovorí len to, že správa sa dá odoslať.
  2. Vpravo druhá, úplne samostatná hierarchia: kanály. Kanal 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. BeznaSprava sa odosiela. Zavolá posli() na tom, čo drží, a netuší, či je to e-mail alebo niečo iné.
  5. Skončilo to v EmailKanali.
  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 BeznaSprava.
  8. A tentoraz to skončilo v SmsKanali. V triede správy sa nezmenilo nič.
  9. Teraz tá druhá strana mosta. UrgentnaSprava 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 EmailKanal, 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 spolu nesúvisia — a bez mosta by každá dvojica potrebovala vlastnú triedu.
  • Počet tried rastie súčinom, nie súčtom. Tri druhy a štyri kanály znamenajú dvanásť podtried; s mostom sedem tried a ľubovoľná kombinácia.
  • Implementáciu treba vymeniť za behu. Referencia sa dá prehodiť, dedenie nie — trieda, ktorá si spôsob zdedila, ho už nezmení.
  • Obe strany majú vlastných autorov alebo vlastné tempo. Kanály môže dodávať niekto iný než správy a ani jedna strana nemusí vedieť, ako rastie tá druhá.
  • Klient nemá vidieť implementáciu vôbec. Drží abstrakciu a to, čo je za mostom, sa dá vymeniť bez toho, aby o tom vedel.

Pasce

  • Zamieňa sa s Adaptérom. Adaptér prekladá rozhranie, ktoré už existuje a nesedí — rieši problém, ktorý vznikol. Most sa navrhuje dopredu, kým ešte nič nie je, práve preto, aby taký problém nevznikol.
  • Zamieňa sa so Strategy. Strategy vymieňa jeden algoritmus vnútri triedy; most oddeľuje dve celé hierarchie, ktoré rastú každá po svojom. Keď na druhej strane nikdy nepribudne trieda, nemáte most, ale stratégiu.
  • Pri jednej implementácii je most len réžia navyše. Druhá strana hierarchie musí naozaj existovať, inak ste pridali abstrakciu, ktorá nič neoddeľuje.
  • Rozhranie implementácie sa nafúkne. Keď doň presakujú potreby jednotlivých abstrakcií, prestane byť spoločné — a most drží pohromade dve strany, ktoré sa už rozišli.
  • Abstrakcia sa začne pýtať, čo je za mostom. Akonáhle sa rozhoduje podľa konkrétneho typu implementácie, väzba je späť a oddelenie bolo zbytočné.
  • Cena sa platí hneď, úžitok príde neskôr. Most je dopredná investícia do zmeny, ktorá možno nikdy nepríde — a pri dvoch triedach vyzerá ako komplikácia bez dôvodu.