Professional Documents
Culture Documents
obrazac dizajna je opće, višekratno upotrebljivo rješenje za generički i uobičajeni problem. U stvarnosti to nije gotovo
rješenje za implementaciju, već je to obrazac za rješavanje određenog problema koji se može koristiti u mnogim
različitim scenarijima.
prednost
Dizajnerski uzorci imaju mnogo prednosti. Evo nekoliko njih:
Gotovo svi obrasci dizajna su objektno orijentirani i stoga se mogu ponovo koristiti u više projekata
Uz unaprijed definirani tok, oni pružaju veću tačnost i transparentnost arhitekturi i dizajnu projekta
Dizajnerski obrasci su se pokazali kao jedino rješenje za neke zahtjeve projekta
ograničenja
Uz toliko prednosti, postoje i neka ograničenja i kritike dizajnerskih obrazaca. Evo nekoliko njih:
Obrasci dizajna pomažu koderu da upiše čist, učinkovit i neponovljiv kod s manje povezivanja ili ovisnosti
između pojedinih radnih jedinica. Kad god koder analizira zahtjev koji je prikazao klijent, tada se prvo vodi
računa o prikladnom dizajnerskom obrascu za implementaciju koda, na kojem će se kôd kasnije skalirati,
mogu se uključiti i neka dodatna ograničenja.
Odlučujemo se za predloške kad ih tražimo da ispunimo pomoću određenih implementacija, koje se zovu
predloške.
Scenarij 1 -
Vi bi trebali dizajnirati web-bazirano rješenje za Predložak na Javi gdje se od vas traži da implementirate
karakteristična svojstva vozila poput njegove formule za izračunavanje brzine, izračuna zakretnog momenta
itd. Dakle, za bicikl bi bilo drugačije od onoga što bi bilo za automobil, a ako vidimo perspektivu
skalabilnosti, tada dodamo osnovni predložak koji upravo ima vanjski kostur ovih metoda povezanih s
proračunom, a zatim smo u naš kod dodali samo varijante tih implementacija, čime ćemo napraviti
fleksibilan dizajn. Vidjevši samo ovaj predložak, korisnik bi stekao predodžbu o funkcionalnostima koje
nude i može se radovati samo u srodnim klasama.
2. scenarij -
Drugi slučaj može biti generiranje zajedničkog predloška za klase baza podataka koje ćete pozivati u svom
projektu, možda koristite Oracle, MySQL ili DB2, a vjerojatno se u različitim scenarijima kodiranja veselite
povezivanju s njima u različitim instancama vremena, tako da u predložak možete unijeti korisničko ime,
lozinku, dobiti vezu i sl. svojstva, a klase koje se proširivaju davale bi detalje implementacije dok tražite.
Java programer zna kako implementirati ovu funkciju !! Da, apstraktna klasa je pravi odgovor, nadam se da
znate da kad god imamo scenarije gdje se usko povezani entiteti trebaju staviti u rješenje, tada biramo
apstraktne klase (u suprotnom sučelja također rješavaju našu svrhu).
1. Osnovnu klasu učinite apstraktnom koja uključuje i metode obrasca, kao i apstraktne metode.
3. Apstraktne metode su neophodne za primjenu podržavanjem koda poslovne logike u razredima provedbe.
4. Metoda bi mogla biti apstraktna u dječjim razredima ako se ne mora primijeniti samo na njoj.
6. Ispravan izbor onoga što mora biti označeno apstraktno, a što ne.
Metode s tijelima u osnovnom razredu izrađuju se kao konačne vrste, jer ih se ne može preglasiti, kao i za
izračun broja okretaja u vozilu može biti isti.
Ispod ovdje definirali smo primjer temeljen na predložaku java, a on uključuje primjerak istog uzorka -
(
try
(
return distance/time;
)
Catch(Exception e)
(
System.out.println(e.printStackTrace());
)
)
@Override
public abstract double calcTorque() throws Exception
(
try
(
return radialLength * force;
)
Catch(Exception e)
(
System.out.println(e.printStackTrace());
)
)
)
public car extends Vehicle
(
Int doorCount; // door doesn't exist in all vehicles so has been added here
@Override
public abstract double calcSpeed() throws Exception
(
try
(
return distance/time;
)
Catch(Exception e)
(
System.out.println(e.printStackTrace());
)
)
@Override
public abstract double calcTorque() throws Exception
(
try
(
return radialLength * force;
)
Catch(Exception e)
(
System.out.println(e.printStackTrace());
)
)
)
Možete koristiti eclipse ili druge mrežne platforme za sastavljanje da biste provjerili ovu implementaciju
vlastitim implementacijama.
3. Također je potreban IDE poput pomrčine koji automatski provjerava sintaktičke pogreške.
6. Alati za pridruživanje dijagrama klasa znati odnos nasljeđivanja više razine između klasa koje ste
napravili u implementaciji uzorka predloška.
1. Sprječava dupliciranje koda, budući da se opće stvari mogu implementirati samo u apstraktnoj klasi,
potrebne varijacije mogu se provesti u potklasama.
2. Promjenljivi obrasci mogu se implementirati u potklase na temelju nasljednog odnosa
implementacije. Taj se postupak naziva prevladavanjem metoda.
3. Glavni predložak može imati apstraktne i ne-apstraktne metode, što pojednostavljuje i fleksibilno
sprovodi.
4. Duljina koda ostaje ograničena.
5. Kôd izgleda čist i učinkovit.
6. Lako za uklanjanje pogrešaka, čime je život programera lakši.
Koristite slučajeve
1. Implementacije veza-has.
2. Implementacije baze podataka
3. Implementacija inačica vozila.
4. Prikupljanje voća i primjena vitaminskih učinaka.
5. Implementacija metode radnih tijekova.
Od tada su svi uzorci dizajna postali poznati kao „ Banda od četiri uzorka dizajna '.
Uzorci dizajna neovisni su o bilo kojem programskom jeziku, jer se koriste za rješavanje uobičajenih
objektno orijentiranih problema s dizajnom, a nisu ograničeni samo na određeni programski jezik. Dakle, u
osnovi je to ideja, a ne provedba.
Tako pomoću dizajnerskih obrazaca možemo razviti programe koji su učinkovitiji, fleksibilniji, održiviji i
mogu se ponovno koristiti.
Uobičajeno koristimo obrazac dizajna tijekom početne faze analize i zahtjeva SDLC (životni ciklus razvoja
softvera). Kada se koristi tijekom faze analize i zahtjeva SDLC-a, pruža više informacija o ovoj fazi. Java
interno podržava obrasce dizajna.
Drugim riječima, jednokračni uzorak ograničava instanciranje klase. Singleton obrazac koristi se u provedbi
zapisnika za aplikacije. Također se koristi u implementaciji spremišta niti ili u predmemoriji.
Java satovi, java.awt.Desktop i java.lang.runtime također upotrijebite jednokračni uzorak.
Prednosti
Kao što je već spomenuto, jednokračni uzorak dizajna ograničava klasu samo s jednom instancom i ovoj
instanci se daje globalna točka pristupa. Sve su se to klase iznova odnosile na isti objekt.
Kao što pokazuje gornji UML dijagram, singleton klasa ima definiranu jednu instancu i pristupamo joj metodom
getInstance (). Dakle, tvornica pojedinca koja je odgovorna za stvaranje objekata koristi metodu getInstance za
vraćanje istog objekta (koji je tamo u klasi) iznova i iznova.
Izrađujemo singleton klasu i imamo njen konstruktor kao 'private' tako da klasa ne može biti instancirana.
Zatim kreiramo privatnu instancu ove singleton klase unutar same klase. Tada imamo posebnu javnu metodu
getInstance () koja vraća singleton objekt u vanjski svijet.
Ova implementacija ove singleton klase kako je gore objašnjeno prikazana je u donjem Java
programu.
Sada ako provjerimo glavnu metodu, imajte na umu da ako pokušavamo stvoriti objekt klase singleton
pomoću novog operatora, kompajler će dati pogrešku u kompilaciji (vidi komentirani kôd u glavnoj metodi).
Objekt klase singleton dobivamo metodom getInstance (), a zatim ga možemo koristiti kao i obično za
pristup metodama.
Prednosti
Dakle, ako klasa koja implementira tvornički obrazac ima metodu za izračunavanje kamatne stope, tada će
konkretne klase implementirati ovu klasu, a također će primijeniti metodu za izračunavanje kamatne stope.
Tada će postojati još jedna klasa koja je tvornička klasa koja će pristupiti tim konkretnim primjerima klase
tako da nismo svjesni kako se implementira logika za izračunavanje kamatne stope. Pozivamo samo metodu
i dobivamo izlaz.
Kada roditeljske klase odluče delegirati stvaranje instanci u svoje podrazrede, tada možemo ići na tvornički
obrazac (Ovo je gore objašnjeno). Također možemo koristiti tvorničku metodu kada klasa ne zna koje
podrazrede treba stvoriti.
Kao primjer, provedimo generičko sučelje oblika. Iz ovog sučelja možemo izvesti razne konkretne klase
poput kruga, pravokutnika itd. Tada ćemo imati klasu shapeFactory koja će pristupiti objektima konkretne
klase. UML za ovaj obrazac prikazan je u nastavku.
Kao što je već objašnjeno, ovo je UML dijagram za tvornički uzorak. Sada ćemo implementirati Java
program koji demonstrira tvornički obrazac.
Dakle, kad god naiđemo na objekt koji se ne može stvoriti u jednom koraku, idemo na obrazac graditelja.
Prednosti
Praktični primjer uzoraka Builder je sustav naručivanja hrane koji je obuhvaćao složene korake prikupljanja
naručenih namirnica, zatim pakiranja, naplate, narudžbe u zgradama i slanja.
U ovom uputstvu implementirat ćemo primjer sustava za naručivanje tableta koji koristi obrazac Builder.
Gornji dijagram prikazuje UML dijagram uzorka Builder. Kao što je prikazano na gornjem dijagramu,
imamo četiri komponente u obrascu Builder.
Proizvod: Ovo predstavlja složeni objekt koji treba izgraditi.
Graditelj sažetak klase: Apstraktna klasa koja sadrži prototipove svih funkcionalnosti potrebnih za
izgradnju složenog objekta.
Klasa ConcreteBuilder: Ovo je konkretna klasa koja nasljeđuje klasu Builder i stvara određeni
složeni objekt. Možemo imati onoliko klasa ConcreteBuilder koliko nam treba.
Klasa redatelja: Ova klasa kontrolira algoritme koji generiraju konačni proizvod.
Izlaz:
U gornjem primjeru izgradili smo cjeloviti sustav naručivanja tableta za dvije marke tableta, tj. Lenovo i
Micromax. To su klase concreteBuilder koje nasljeđuju od apstraktne klase tvrtke. Tada imamo TabBuilder
klasu koja gradi narudžbe za obje klase tableta.
Često postavljana pitanja
Odgovor: Uzorci dizajna najbolja su praksa koja se može koristiti za razvijanje dobro provjerenih rješenja.
Kreativni dizajn: Tvornički uzorak, Sažetak Tvornički uzorak, pojedinačni uzorak, uzorak
graditelja i uzorak prototipa primjeri su kreativnih uzoraka dizajna. Oni su uglavnom uključeni u
stvaranje predmeta.
Uzorak strukturnog dizajna: Uglavnom se koriste za stvaranje strukture klase. Adapter, most i
kompozitni uzorak popularni su uzorci strukturnog dizajna.
Uzorak dizajna ponašanja: Oni pružaju bolju interakciju između objekata zajedno s fleksibilnošću
za jednostavno proširenje implementacije. Uzorci promatrača, strategije, itd. Neki su primjeri
obrazaca ponašanja.
Odgovor: Uzorci dizajna pružaju nam dokazani i provjereni model rješenja koji možemo koristiti za
rješavanje složenih problema. Uzorci dizajna omogućuju nam izgradnju kohezivnih modula s labavom
spojnicom. Uzorci dizajna također čine interakciju između dizajnera učinkovitijom i djelotvornijom.
Odgovor: Primjeri prirodnih obrazaca su vidljive zakonitosti koje se nalaze u prirodi. Prirodni uzorci poput
simetrija, drveća, valova, pjena, pruga, pukotina itd. Neki su primjeri prirodnih uzoraka.
Odgovor: Da, to je vrsta dizajnerskog uzorka pomoću kojeg možemo izgraditi aplikaciju koja se sastoji od
podatkovnog modela, prezentacije ili sloja prikaza i kontrolera. Možemo ga više klasificirati kao
arhitektonski obrazac.
Zaključak
Ovim je završena naša rasprava o uzorcima dizajna u Javi. Iako Java podržava tri vrste obrazaca dizajna,
naime. Kreativni, strukturni i bihevioralni obrasci, više nas zanima uzorak kreativnog dizajna.
Prosto rečeno, projektni obrasci predstavljaju akumulirano iskustvo “starih” i iskusnih programera u
rešavanju nekih osnovnih programerskih problema iz oblasti objektnog programiranja.
Posao softverskih inženjera je pre svega rešavanje softverskih problema. To su problemi koje su drugi
inženjeri verovatno već rešavali veliki broj puta u različitim oblicima. Tokom kreiranja softvera primenom
objektno-orjentisanog pristupa, veliki broj obrazaca, principa i slučajeva najbolje prakse je otkriven,
imenovan i unet u katalog. Poznavanjem ovih obrazaca i uobičajenih rešenja, inženjeri mogu da „razbijaju“
složene probleme i razviju aplikacije sa oprobanim i pouzdanih rešenjima.
Projektni obrasci (design patterns) predstavljaju apstraktne primere rešenja na visokom nivou. Njih treba
posmatrati kao plan u rešavanju problema, a ne kao samo rešenje. Gotovo je nemoguće pronaći okvir
(framework) koji će biti primenjen kako bi se kreirala cela aplikacija. Umesto toga, inženjeri vrše
uopštavanje problema kako bi prepoznali obrasce koje treba da primene. Projektni obrasci imaju za cilj
ponovnu upotrebu postojećih rešenja. Iako nisu svi problemi jednaki, ako je moguće posmatrani problem
„razbiti“ i naći sličnosti sa problemima koji su ranije bili rešavani, onda je moguće primeniti uniformno
rešenje nad njim. Većina problema na koje se nailazi tokom programiranja je već rešena nebrojeno
puta, pa verovatno postoji i obrazac koji može pomoći u implementaciji.
Obrasci su nastali kao rezultat dobre prakse i iskustva programera. Skup najvažnijih i najčešće korišćenih
obrazaca je skupljen i objavljen u knjizi Design Patterns: Elements of Reusable Object-Oriented Software,
koju su napisali Erich Gamma, Richard Helm, Ralph Johnson i John Vlissides, poznati kao Gang of Four.
Obrasci su ključni za dizajn i razvoj softvera. Oni omogućavaju izražavanje namera kroz zajednički
rečnik, kada se problemi rešavaju prilikom projektovanja, tako i tokom kreiranja samog koda. Obrasci
promovišu upotrebu dobrog dizajna objektno-orjentisanog softvera. Oni predstavljaju efikasan način da se
opiše rešenje kompleksnih problema. Sa poznavanjem dizajn paterna, moguća je brza komunikacija unutar
tima bez obraćanja pažnje na detalje implementacije niskog nivoa. Njihova posebna vrednost se nalazi u
činjenici da su to oprobana i testirana rešenja.
Obrasci su nezavisni od korišćenog programskog jezika. Njihova primena je identična u svim objektno-
orjentisanim programskim jezicima.
Međutim, ne zahtevaju svi problemi primenu dizajn paterna. Tačno je da obrasci mogu učiniti da
kompleksni problemi postanu jednostavni, ali oni takođe mogu jednostavne probleme učiniti
kompleksnim. Nakon prvog upoznavanja sa dizajn paternima, mnogi inženjeri upadaju u problem da
pokušavaju da primene obrasce na svaki deo koda. Ovim se postiže suprotan efekat od željenog, odnosno,
sam softver se dodatno komplikuje.
Svaki uzorak je trodijelno pravilo, koje izražava odnos između određenog konteksta, problema i rješenja.
Također nalazimo mnoge obrasce u softverskoj arhitekturi. Stručnjaci u softversko inženjerstvo poznaje ove obrasce
iz praktičnog iskustva i slijedite ih u razvoju aplikacija sa specifičnim svojstvima. Koriste ih za učinkovito i elegantno
rješavanje problema dizajna.
Obrasci za oblikovanje
Obrazac za oblikovanje (engleski design pattern) je apstraktni design. On definira uspjeˇsno rjeˇsenje za
dobro poznati problem koji se ˇcesto pojavljuje u raznim kontekstima. Ukoliko se susretnemo s takvim
problemom, tada ga moˇzemo rijeˇsiti primjenom odgovaraju´ceg obrasca. Na taj naˇcin dolazi do ponovne
upotrebe, ali ne programskog koda nego designa. Rjeˇsenje koje ponovno upotrebljavamo oslobodeno
je implementacijskih detalja, ˇsto moˇze biti prednost budu´ci da detalji stare implementacije mogu biti
neprimjenjivi unutar nove.
Obrasci za oblikovanje nastaju kao pokuˇsaj da se dokumentira skupljena mudrost i iskustvo u rjeˇsavanju
problema. Skupljanje mudrosti prisutno je u gotovo svom granama raˇcunarstva: tradicionalne knjige o
strukturama podataka i algoritmima takoder nastoje opisati provjerena rjeˇsenja za ˇceste programerske
probleme. Ipak, kad govorimo o obrascima za oblikovanje, tada mislimo na noviji pristup (Gamma et
al, 1995) koji je nastao u okviru objektnog oblikovanja, gdje se rjeˇsenje izraˇzava kao objektni model
od nekoliko apstraktnih klasa.
U obrascu za oblikovanje moraju biti prisutna sljede´ca ˇcetiri elementa.
1. Smisleno ime za obrazac.
2. Opis problema, iz kojeg je vidljivo kad se obrazac moˇze primijeniti.
3. Opis rjeˇsenja, koji objaˇsnjava dijelove predloˇzenog designa, te odnose izmedu tih dijelova. Opis
rjeˇsenja obiˇcno se naslanja na dijagram (klase, nasljedivanje, druge vrste veza, . . . ).
4. Opis posljedica, koji nabraja prednosti i mane primjene predloˇzenog obrasca.
Kao primjer obrasca za oblikovanje, navodimo “Observer pattern” u Prilogu 3.36. Ovaj obrazac koristi
se onda kad se traˇze razliˇciti prikazi stanja istog objekta. Obrazac razdvaja objekt i njegove prikaze.
To je ilustirano Prilogom 3.37 gdje vidimo dva grafiˇcka prikaza istog skupa podataka. Rjeˇsenje unutar
“Observer pattern” dano je objektnim modelom u Prilogu 3.38 nacrtanim prema pravilima UML.
Rjeˇsenje je rijeˇcima objaˇsnjeno u polaznom Prilogu 3.36.
Što je mikroservis?
Mikroservisi su softverski arhitektonski obrazac koji strukturira aplikaciju kao skup malih, neovisnih
procesa koji se koriste za određene poslovne sposobnosti. Microservices je pristup modularizaciji softvera
dizajniranog za rješavanje specifičnih sitnih poslovnih funkcionalnosti. Koristi module koji se izvode kao
različiti procesi, što znači da potiče izgradnju softverske aplikacije kao skupa neovisnih usluga. Jednostavno
rečeno, arhitektura Microservicesa odnosi se na ronjenje aplikacije ili sustava na manje, neovisne dijelove
temeljene na načelu jedinstvene odgovornosti. Jedinstvena odgovornost znači da svaki mikroservis ima skup
dobro definiranih značajki i trebao bi se pokrenuti u zasebnom procesu kao usluga.
Arhitektura mikroservisa podrazumijeva razvoj pojedinačne aplikacije kao skupa malih i neovisnih usluga koje se
samostalno razvijaju i implementiraju.
Mikroservisi imaju neovisno spremanje podataka, što znači da će svaki mikroservis biti neovisna usluga i ne dijeli
zajedničko pohranjivanje podataka među sobom. Spremanje podataka donosi svoj niz prednosti i nedostataka.
Komunikacija među mikroservisima trebala bi se odvijati samo putem zajedničkog skupa protokola, kao što je HTTP
Kako su mikroservisi samostalni, svaka promjena mikroservisa može se ispitati i implementirati samostalno. To vam
olakšava koncentraciju na poslovnu sposobnost jedne mikroservise umjesto da razmišljate o cijeloj aplikaciji.
Promjene potrebne za nove značajke ograničene su na pojedinačne mikroservise.
Mikroservisi su s druge strane skloniji kvarovima zbog širenja usluga i njihove inter-servisne mrežne komunikacije.
Dati je program mikroservisa zbirka neovisnih, autonomnih servisa i ako jedan ili više usluga ne moraju srušiti cijelu
aplikaciju.