Izloženi obrazac dizajna: Strateški obrazac



Na ovom ćemo blogu otkriti Uzorak dizajna strategije koji se koristi za stvaranje zamjenjive obitelji algoritama koji se mogu dinamički birati.

'

Dobrodošli u prvi post serije 'Izloženi uzorci dizajna'. U ovoj ćemo seriji otkriti svaki obrazac dizajna od nule.





Jednostavno poznavanje programskog jezika i njegovih konstrukcija neće vas učiniti boljim programera ili programera. Potrebno je znanje o dizajnerskim uzorcima za stvaranje softvera koji će raditi danas, a također i u budućnosti.

Mnogi programeri već su naišli na probleme s dizajnom s kojima se trenutno suočavate ili ćete se susretati u budućnosti. Naveli su standardni način rješavanja tog problema. Dakle, pomoću dizajnerskih uzoraka dobivate prednost korištenja provjerenih tehnika.



Svaki obrazac dizajna služi za rješavanje određene vrste situacije, može biti situacija u kojima se može koristiti više od jednog uzorka dizajna.

Većina programera samo pokušava riješiti problem s kojim se suočava ne trudeći se oko dizajnerskih obrazaca, suvišnog koda ili čak uskog spajanja. Ali dobri programeri započinju drugačije. Razmišljaju o današnjim zahtjevima, budućim zahtjevima, održavanju koda i ponovnoj upotrebljivosti koda.

Dobri programeri ne žure se početi kodirati kad dobiju zahtjeve. Sjede i razmišljaju o problemu hoće li njihov dizajn uspjeti. Ako je odgovor da, hoće li raditi nakon 6 mjeseci, kada će se zahtjevi promijeniti.



Dobri programeri uzimaju olovku i papir i počinju dizajnirati nastavu i odnos između klasa. Pokušavaju postići labavu spregu i visoku koheziju u svom dizajnu, a radeći sve to imaju u vidu Objektno orijentirane principe. Ne ulaze odmah u kod niske razine. Da biste dizajnirali fleksibilni softver za višekratnu uporabu, trebali biste slijediti ovaj pristup, jer ćete u suprotnom uvijek naći modifikaciju koda koji ste ranije napisali.

Samo je jedna stvar konstantna u industriji softvera, a to je Promijeniti. Zahtjevi će se sigurno mijenjati. Pa kako dizajnirati softver koji se vaš kod može lako prilagoditi budućim zahtjevima? Za to morate započeti rano i dizajnirati ga tako da budući zahtjevi ne naruše vaš prethodni kôd.

Kako to mogu učiniti?

Pa, to se može učiniti slijedeći principe dizajna i uzorke dizajna koji se temelje na tim principima.

Sada, zaronimo u kodiranje i krenimo na putovanje kako bismo postali bolji programer. U ovom ćemo postu otkriti jedan od najvažnijih uzoraka - Strateški obrazac .

Kad kažem najvažnije, to se odražava na zajednički problem koji se rješava Strateškim uzorkom.

što je java ide

Što je obrazac strategije?

Evo definicije izravno iz knjige 'Banda četvorke': 'Uzorak strategije koristi se za stvaranje zamjenjive obitelji algoritama iz kojih se u vrijeme izvođenja odabire traženi postupak'.

U slučaju da jestene mogu razumjeti, ne brinite, objasnit ćemo to u ajednostavnijeputza vasrazumjeti.

Prvo shvatimo problem, a zatim ćemo vidjeti kako Strateški obrazac to može riješiti.

U gornjem UML dijagramu imamo sažetak klase Animal i dvije konkretne klase, Dog i Bird, koje se protežu od super klase Animal.

Pa definirajmo apstraktnu klasu životinja i dvije konkretne klase, pas i ptica.

Što mislite o gore navedenom dizajnu? U našem dizajnu postoji jedna velika pogreška.

Sve životinje ne mogu letjeti, kao u gore navedenom slučaju pas ne može letjeti. Ali ipak ima ponašanje 'muhe'.

Pogriješili smo napisavši apstraktnu metodu fly () unutar klase Animal. Ovaj će dizajn prisiliti svaku podklasu Pas, Ptice, Pingvin, Krokodil, Guska itd. Da primijeni metodu fly ().

Trebali smo shvatiti da je letenje sposobnost koju neće imati sve životinje. Pružajući metodu fly () u apstraktnoj klasi životinja, postavili smo sposobnost letenja u sve podklase, što nije točno za sve podklase životinja.

Možda mislite kako je problem u primjeni metode letenja u podrazredima. Iako možete primijeniti metodu fly () u ne-letećim podrazredima životinja kako biste samo ispisali 'Ne mogu letjeti'. Ali problem je u tome što još uvijek ponašate muhu prema životinjama koje ne lete. To nije točno.

Kakav je osjećaj nazvati dog.fly () ili crocodile.fly ().

Dakle, sada smo shvatili da naš dizajn nije točan i trebali bismo ukloniti metodu fly () iz podklase Animal.

Koji je drugi način dizajniranja naših klasa na način da naš dizajn ne nameće sve podrazrede životinja da se ponašaju mušice.

Jedno rješenje koje nam odmah padne na pamet je da možemo napraviti leteće sučelje koristeći metodu letenja i samo će životinje koje mogu letjeti implementirati to leteće sučelje. Na ovaj način nećemo primijeniti sve podklase Životinje da definiramo ponašanje muhe. Pa kodirajmo ovaj pristup dizajnu.

Sada će naša klasa Animal izgledati poput donjeg koda nakon uklanjanja metode fly iz klase Animal.

razlika između pass by value i pass by reference u javi

Sada definirajmo Leteće sučelje

Sada će se promijeniti klasa pasakaokod ispod i ne mora imati ponašanje muhe.

Pogledajmo neke od naših podrazreda Životinje koje će se ponašati leteće.

Riješili smo svoj prethodni problem, ali upali smo u novu nevolju, a to je 'Umnožavanje koda'.

Recimo, imat ćemo 100 različitih podrazreda letećih životinja. Moramo duplicirati kôd za ponašanje leta jer letačko sučelje ne može pružiti nikakvu implementaciju ponašanja leta, a kasnije, ako želimo promijeniti implementaciju metode fly () u bilo kojoj podklasi, morat ćemo otvoriti tu klasu i promijeniti kôd, što je loše. Nedostaje nam nešto veliko i, to jest, ne možemo promijeniti leteće ponašanje klase u vrijeme izvođenja.

Ali ne brinite, postoji Strateški obrazac koji će vas izvući iz ovog problema.

Dakle, preoblikujmo naš kôd da bismo koristili obrazac strategije.

Leteće sučelje ostat će isto kakvo je. Sada ćemo, umjesto da svaka leteća podklasa koja implementira samo leteće sučelje, definirati zasebne konkretne klase koje će implementirati različito ponašanje letenja. Pogledajmo kako to učiniti.

Pa, kako to sve funkcionira, pogledajmo TestClass

Korištenjem Strateškog uzorka sada smo u mogućnosti promijeniti ponašanje letenja bilo koje životinje u vrijeme izvođenja, a to je bez nametanja bilo kakvih potklasa koje određuju samo ponašanje leta.

Kada koristiti obrazac strategije?

Kada želite dinamično promijeniti ponašanje u vrijeme izvođenja.

Uzmimo još jedan primjer kako bismo bili sigurni da jasno razumijete obrazac strategije.

U gore navedenom razredu zaposlenika određujemo plaću zaposlenika ovisno o njegovoj / njenoj namjeni. Ako je zaposlenik 'pripravnik', dodajemo 10% bonusa na osnovnu plaću kako bismo izračunali stvarnu plaću.

Ako je zaposlenik 'Web programer', dodajemo 20% bonusa na osnovnu plaću za izračunavanje stvarne plaće, a sličan postupak slijedi i za druge vrste zaposlenika. Iako je naš algoritam za izračunavanje stvarne plaće vrlo jednostavan radi lakšeg razumijevanja, ali većinu vremena, uključuje mnoge usporedbe i izračune.

Pa, što nije u redu s kodom klase zaposlenika?

Pa, kod za izračun plaće (getPay ()) je statičan. Pretpostavimo da želim promijeniti bonus za “pripravnika” s 10% na 14%. Morat ću otvoriti kod klase Employee i promijeniti ga.

izuzetak null pokazivača u programu Java primjer

A drugi je problem što ne mogu promijeniti algoritam plaća zaposlenika u vrijeme izvođenja. Pa, kako to učiniti? Obrazac strategije posebno se koristi za rješavanje ove vrste problema.

Preoblikujmo kôd da bismo koristili obrazac strategije.

Definirat ću nekoliko algoritama za izračunavanje plaće. Tada ću moći koristiti bilo koji od ovih algoritama za izračunavanje plaće u toku.

Sad, da vidimo kako će se promijeniti razred zaposlenika.

Bilješka: Uklonio sam logiku izračuna plaća iz klase zaposlenika i stvorio postavljenu metodu PayAlgorithm () putem koje ću postaviti PayAlgoritam koji želim koristiti za izračun plaće.

To će mi dati fleksibilnost za izračun plaće, dinamičkim određivanjem bilo kojeg PayAlgoritma u toku izvođenja. Također, imajte na umu da kasnije, ako moram promijeniti logiku izračuna plaće, mogu stvoriti novi PayAlgoritam i pomoću njega izračunati plaću. Ne trebam mijenjati prethodni kôd, zar nije sjajno?

Pa da vidimo da djeluje.

Nadam se da ste vrlo dobro razumjeli obrazac strategije. Najbolji način da nešto naučite je vježbanje.

U slučaju da imate bilo kakva pitanja koja se odnose na Strateški obrazac ili bilo koji drugi obrazac, ostavite svoje upite u nastavku.

Pripazite na sljedeći post, gdje ćemo otkriti jedan od najpopularnijih dizajnerskih uzoraka, Factory Pattern.

Do tada možete preuzeti kôd koji se poigrava s njim i pobrinite se da u svojoj glavi učvrstite obrazac strategije.

Imate pitanje za nas? Spomenite ih u odjeljku za komentare i javit ćemo vam se.

Vezane objave: