Vystavený návrhový vzor: strategický vzor



V tomto blogu odhalíme Strategy Design Pattern, ktorý sa používa na vytvorenie vymeniteľnej skupiny algoritmov, ktoré je možné zvoliť dynamicky.

'

Vitajte pri prvom príspevku zo série „Dizajnové vzory vystavené“. V tejto sérii ideme odhaliť každý dizajnový vzor od nuly.





Jednoduchá znalosť programovacieho jazyka a jeho konštrukcií z vás neurobí lepšieho programátora alebo vývojára. Na vytvorenie softvéru, ktorý bude fungovať dnes aj v budúcnosti, je potrebná znalosť návrhových vzorov.

Mnoho vývojárov už narazilo na problémy s dizajnom, ktorým teraz alebo v budúcnosti čelíte. Stanovili štandardný spôsob riešenia tohto problému. Použitím návrhových vzorov teda získate výhodu použitia osvedčených techník.



Každý návrhový vzor slúži na riešenie konkrétneho druhu situácie, môžu nastať situácie, kedy je možné použiť viac ako jeden návrhový vzor.

Väčšina programátorov sa pokúša vyriešiť problém, s ktorým sa stretávajú, bez obťažovania o návrhové vzory, nadbytočný kód alebo dokonca tesné spojenie. Dobrí programátori však začínajú inak. Myslia na dnešné požiadavky, budúce požiadavky, údržbu kódu a opätovné použitie kódu.

Dobrí programátori sa neponáhľajú s programovaním hneď, ako splnia príslušné požiadavky. Sedia a premýšľajú nad problémom, či bude ich dizajn fungovať. Ak áno, či to bude fungovať po 6 mesiacoch, kedy sa zmenia požiadavky.



Dobrí programátori vezmú pero a papier a začnú navrhovať svoje triedy a vzťah medzi triedami. Snažia sa vo svojom dizajne uvoľniť väzbu a vysokú súdržnosť, pričom pri tom všetkom majú v mysli objektovo orientované princípy. Nejdú okamžite do kódu nízkej úrovne. Pri navrhovaní flexibilného a opakovane použiteľného softvéru by ste sa mali riadiť týmto prístupom, inak sa vždy ocitnete v úprave kódu, ktorý ste napísali skôr.

Existuje iba jedna vec, ktorá je v softvérovom priemysle konštantná, a to je Zmena. Požiadavky sa budú určite stále meniť. Ako teda navrhneme softvér, ktorý sa váš kód dá ľahko prispôsobiť budúcim požiadavkám? Musíte začať včas a navrhnúť to tak, aby budúce požiadavky neporušili váš predchádzajúci kód.

Ako to môžem spraviť?

Dá sa to dosiahnuť dodržaním princípov návrhu a vzorov návrhu založených na týchto princípoch.

Poďme sa teraz venovať programovaniu a začnime cestou lepšej programátorky. V tomto príspevku odhalíme jeden z najdôležitejších vzorov - Strategický vzor .

Keď poviem to najdôležitejšie, odráža to to na bežnom probléme, ktorý rieši Strategy Pattern.

Čo je strategický vzor?

Tu je definícia priamo z knihy „Gang štyroch“: „Stratégický vzor sa používa na vytvorenie zameniteľnej skupiny algoritmov, z ktorých sa za behu zvolí požadovaný proces“.

V prípade, že stenie sme schopní pochopiť, nebojte sa, vysvetlíme to v ajednoduchšiespôsobompre tebarozumieť.

Poďme najskôr pochopiť problém a potom uvidíme, ako to Strategický vzor dokáže vyriešiť.

Vo vyššie uvedenom UML diagrame máme zvieraciu abstraktnú triedu a dve konkrétne triedy, Dog a Bird, ktoré vychádzajú zo super triedy Animal.

Definujme si teda abstraktnú triedu zvierat a dve konkrétne triedy, pes a vták.

Čo si myslíte o vyššie uvedenom dizajne? V našom dizajne je jedna veľká chyba.

Všetky zvieratá nemôžu lietať, ako v uvedenom prípade pes nemôže lietať. Ale stále to má „lietajúce“ správanie.

Urobili sme chybu, keď sme do triedy Animal napísali metódu abstract fly (). Tento dizajn prinúti každého podkategória Dog, Bird, Penguin, Crocodile, Goose atď., Aby implementovali metódu fly ().

Mali by sme pochopiť, že lietanie je schopnosť, ktorú nebudú mať všetky zvieratá. Poskytnutím metódy fly () v triede abstraktov zvierat sme nastavili schopnosť lietať vo všetkých podtriedach, čo nie je správne pre všetky podtriedy zvierat.

Možno si pomyslíte, aký je problém pri implementácii metódy fly v podtriedach. Aj keď v podtriedach nelietajúcich zvierat môžete implementovať metódu fly (), stačí vytlačiť „Nemôžem lietať“. Ale problém je v tom, že stále dávate správanie mušky nelietavým zvieratám. To nie je správne.

Aký je to pocit zavolať dog.fly () alebo crocodile.fly ().

Teraz sme teda pochopili, že náš návrh nie je správny, a preto by sme mali z podtriedy Zviera odstrániť metódu fly ().

Aký je iný spôsob navrhovania našich tried tak, aby náš návrh nevynucoval všetky podtriedy Zvieratá, aby mali chovanie za letu.

Jedno riešenie, ktoré nám okamžite príde na myseľ, je to, že môžeme vytvoriť lietajúce rozhranie s metódou lietania a toto lietajúce rozhranie implementujú iba zvieratá, ktoré môžu lietať. Týmto spôsobom nebudeme vynucovať všetky podtriedy zvierat, aby definovali chovanie lietať. Poďme si teda kódovať tento dizajnový prístup.

Teraz bude naša trieda Zvierat po odstránení metódy fly z triedy Zvierat vyzerať ako nižšie uvedený kód.

Teraz definujme lietajúce rozhranie

Teraz sa zmení trieda psovakonižšie uvedený kód a nemusí mať správanie za letu.

Pozrime sa na niektoré z našich podtried zvierat, ktoré budú mať chovanie pri lietaní.

Vyriešili sme náš predchádzajúci problém, ale dostali sme sa do nových problémov, a to je „Duplikácia kódu“.

Povedzme, že budeme mať 100 rôznych podtried lietajúcich zvierat. Kód pre správanie lietania musíme duplikovať, pretože lietajúce rozhranie nemôže poskytnúť žiadnu implementáciu správania lietania, a ak neskôr chceme zmeniť implementáciu metódy fly () v ktorejkoľvek podtriede, budeme musieť túto triedu otvoriť a zmeniť kód, čo je zlé. Chýba nám niečo veľké, to znamená, že nemôžeme zmeniť správanie lietania triedy za behu.

Ale nebojte sa, Strategy Pattern je tu, aby vás dostal z tohto problému.

Poďme teda reformovať náš kód tak, aby používal Strategy Pattern.

Lietajúce rozhranie zostane rovnaké, aké je. Teraz namiesto toho, aby každá lietajúca podtrieda implementovala samotné lietajúce rozhranie, definujeme samostatné konkrétne triedy, ktoré budú implementovať odlišné letové správanie. Pozrime sa, ako na to.

Ako to teda všetko funguje, pozrime sa na TestClass

Použitím Strategy Pattern sme teraz schopní zmeniť správanie lietania ktoréhokoľvek zvieraťa za behu, a to bez toho, aby sme vynucovali akékoľvek podtriedy, aby určili samotné správanie lietania.

Kedy použiť strategický vzor?

Keď chcete mať možnosť dynamicky meniť správanie za behu.

Vezmime si ďalší príklad, aby ste jasne pochopili strategický vzor.

Vo vyššie uvedenej triede Zamestnanci stanovujeme odmenu zamestnanca v závislosti od jeho / jej označenia. Ak je zamestnanec „stážista“, k výpočtu skutočnej mzdy pripočítame 10% bonus k základnej mzde.

Ak je zamestnanec „webový vývojár“, k základnému platu pripočítavame 20% bonus k výpočtu skutočnej mzdy a obdobný postup sa uplatňuje aj pri iných druhoch zamestnancov. Náš algoritmus na výpočet skutočnej mzdy je síce veľmi jednoduchý, aby sme mu ľahšie porozumeli, ale väčšinou obsahuje veľa porovnaní a výpočtov.

Čo sa teda stalo s kódom triedy zamestnancov?

Kód pre výpočet pay (getPay ()) je statický. Predpokladám, že chcem zmeniť bonus za stážistu z 10% na 14%. Budem musieť otvoriť kód triedy zamestnancov a zmeniť ho.

A ďalším problémom je, že nemôžem zmeniť platový algoritmus zamestnanca za behu. Ako na to? Stratégický vzor sa špeciálne používa na riešenie tohto druhu problémov.

Opätovne upravíme kód tak, aby používal Strategy Pattern.

Budem definovať niekoľko algoritmov na výpočet platu. Potom budem môcť použiť ktorýkoľvek z týchto algoritmov na výpočet platby za behu.

Teraz sa pozrime, ako sa zmení trieda zamestnancov.

Poznámka: Logiku výpočtu mzdy som odstránil z triedy Employee a vytvoril som metódu set PayAlgorithm (), pomocou ktorej nastavím PayAlgorithm, ktorý chcem použiť na výpočet platu.

Toto mi dá flexibilitu pri výpočte výplaty zadaním ľubovoľného PayAlgorithmu dynamicky za behu. Tiež si uvedomte, že neskôr, ak budem musieť zmeniť logiku výpočtu platieb, môžem vytvoriť nový PayAlgorithm a použiť ho na výpočet platby. Predchádzajúci kód nemusím meniť, nie je to skvelé?

Tak sa pozrime, ako to funguje.

Dúfam, že ste Vzor stratégie veľmi dobre pochopili. Najlepší spôsob, ako sa niečo naučiť, je cvičiť.

V prípade, že máte akékoľvek otázky týkajúce sa strategického vzoru alebo iného vzoru, nechajte svoje dotazy nižšie.

Dajte si pozor na ďalší príspevok, kde odhalíme jeden z najpopulárnejších dizajnových vzorov, Factory Pattern.

Do tej doby si môžete stiahnuť kód, ktorý si s ním chcete zahrať, a uistite sa, že ste si v hlave zafixovali strategický vzor.

Máte na nás otázku? Uveďte ich v sekcii komentárov a my sa vám ozveme.

Súvisiace príspevky:

ako klonovať objekt v jave