všetky vzory

Strategy

Vloží zameniteľný algoritmus do objektu, ktorý sa dá podsunúť za behu.

class Route {  find(from, to) { throw new Error('abstraktná metóda'); }} class ByCar extends Route {  find(from, to) {    // along roads, shortest time  }} class OnFoot extends Route {  find(from, to) {    // through parks and stairs too  }} class Navigation {  #route;   // The client supplies the strategy. Navigation never swaps it itself.  setRoute(route) {    this.#route = route;  }   find(from, to) {    return this.#route.find(from, to);  }} const navigation = new Navigation(); navigation.setRoute(new ByCar());navigation.find(home, work); navigation.setRoute(new OnFoot());navigation.find(home, work);

Celý priebeh v texte (10 krokov)
  1. Route je abstraktná a dva algoritmy ju dedia. Navigation pozná len ju — o aute ani chodcovi nevie nič.
  2. Klient povie Navigation, ako má hľadať. Toto volanie je celý rozdiel oproti vzoru State: stratégiu podáva on.
  3. Navigation si ju odloží. Sama by si ju nikdy nevybrala — nemá podľa čoho.
  4. Klient si vypýta trasu.
  5. Navigation sa nerozhoduje — pošle dopyt tomu, koho práve drží.
  6. Teraz sa klient rozhodne inak a podá druhú stratégiu. Všimni si, že výmenu opäť spustil on — Navigation ju sama neurobila a ani nemá ako.
  7. Odkaz v komore sa vymenil. ByCar a OnFoot o sebe navzájom nevedia — nie sú prepojené, sú to len dva nezávislé algoritmy.
  8. Ten istý dopyt ako pred chvíľou.
  9. Ten istý kód Navigation, iný algoritmus. Trasa vyjde celkom inak, hoci sa v nej nezmenilo nič.
  10. Navigation sa nezmenila a stratégiu si nikdy nevymenila sama — každú výmenu priniesol klient. Keby sa vymieňala sama ako dôsledok volania a algoritmy o sebe vedeli, bol by to State.

Kedy použiť

  • Tú istú úlohu treba riešiť viacerými spôsobmi a voľba padá až za behu.
  • Každá vetva podmienky sa stane triedou a rozhodovanie zmizne z miesta výpočtu.
  • Algoritmus ako objekt sa dá otestovať bez kontextu, ktorý ho inak používa.
  • Variantov pribúda: nový spôsob je nová trieda a do starého kódu sa nesiaha.
  • Volajúci vidí len rozhranie; detaily výpočtu ho nemusia zaujímať.

Pasce

  • Zamieňa sa so State. Stratégiu podá klient zvonku, stav sa vymieňa sám ako dôsledok volania.
  • Vzor skryje algoritmus pred kontextom, nie pred klientom, ktorý ho volí.
  • Rozhranie sa nafúkne podľa najnáročnejšieho variantu a väčšina vstupy nepoužije.
  • Pri dvoch krátkych variantoch je podmienka lacnejšia.
  • Stratégia, ktorá si pamätá medzi volaniami, sa nedá zdieľať ani vymeniť bez straty.
  • Zamieňa sa s Command: príkaz hovorí, čo sa má stať, a dá sa odložiť; stratégia ako, a hneď.