際際滷

際際滷Share a Scribd company logo
Tehniko veleuili邸te u Zagrebu
Vrbik 8, Zagreb
Seminar
OBLIKOVNI OBRASCI U PROGRAMIRANJU
Student: Petar Marijanovi
Zagreb, 25.10.2015
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 2 od 36
Sadr転aj
1. Dnevnik promjena dokumentacije ......................................................................................3
2. Opis seminarskog rada ........................................................................................................4
3. Pojmovnik ...........................................................................................................................5
4. Uvod....................................................................................................................................6
5. Obrazac Strategija (Strategy pattern) ..................................................................................7
6. Obrazac Promatra (Observer pattern)..............................................................................10
7. Obrazac Stanje (State pattern)...........................................................................................14
8. Obrazac Naredba (Command pattern)...............................................................................19
9. Obrazac Jedini (Singleton pattern)...................................................................................23
10. Obrazac Adapter (Adapter pattern) ...............................................................................27
11. Obrazac Tvornica (Factory pattern) ..............................................................................30
12. Zakljuak .......................................................................................................................34
13. Reference.......................................................................................................................35
14. Popis slika......................................................................................................................36
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 3 od 36
1. Dnevnik promjena dokumentacije
Rev. Opis promjene/dodatka Autor Datum
0.1 Napravljen sadr転aj i opi oblik seminara Marijanovi 18.09.2015.
0.2
Promijenjeni nazivi poglavlja, raspisano poglavlje O
oblikovnim obrascima, dodane pripadajue reference
Marijanovi 21.09.2015.
0.3
Napisana poglavlja Strategija i Promatra, dodana
tablica sa popisom slika, a転uriran Pojmovnik
Marijanovi 08.10.2015.
0.4
Napisana poglavlja Stanje, Naredba i Jedini, a転uriran
Pojmovnik
Marijanovi 24.10.2015.
0.5. Napisana poglavlja Adapter i Tvornica Marijanovi 25.10.2015.
0.6. Napisan Zakljuak i ureen Uvod Marijanovi 25.10.2015.
0.7. Prilagoena forma seminara Marijanovi 25.10.2015.
0.8. A転uriran popis slikovnog materijala Marijanovi 25.10.2015.
0.9. Ispravljene gre邸ke u seminaru Marijanovi 25.10.2015.
1.0. Gotova prva verzija seminara Marijanovi 25.10.2015.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 4 od 36
2. Opis seminarskog rada
Ovaj seminarski rad e pokriti openite i najkori邸tenije oblikovne obrasce u programiranju
(Design Patterns). Cilj je 邸to jednostavnije prikazati neke od tih oblikovnih obrazaca kako bi
se, navedeni, vrlo lako mogli poeti koristiti u praksi. Programski jezik u kojem e biti
primjeri je Java.
Skup programera koji bi mogli biti zainteresirani za itanje ovog seminarskog rada su svi
oni programeri koji programiraju u nekom objektno orijentiranom jeziku.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 5 od 36
3. Pojmovnik
Bug  Gre邸ka u izvornom kodu programa
Default  Podrazumijevano
Design Patterns  Oblikovni obrasci o kojima je ovaj seminar pisan
Flag  Zastavica, slu転i za oznaavanje stanja
Garbage collector  Oblik automatskog upravljanja memorijom
Java  Programski jezik
Output  Izlaz, tj. rezultat programa
Runtime  Program u trenutku izvoenja
Use case  Sluaj u kojem se ne邸to koristi
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 6 od 36
4. Uvod
U programskom in転enjerstvu, oblikovni obrazac je ope, ponovno upotrebljivo rije邸enje
za naje邸e javljane probleme unutar odreenog konteksta u softverskom dizajnu. Oblikovni
obrasci nisu gotovi dizajni koji se mogu pretvoriti u izvorni ili strojni kod. To je ideja ili
predlo転ak za kako rije邸iti problem koji se mo転e koristiti u mnogim razliitim situacijama.
Oblikovni obrasci su formalizirane najbolje prakse koje se mogu koristiti za rije邸avanje
naje邸ih problema pri izradi programa ili sustava.
Programsko in転enjerstvo je te邸ko iz vi邸e razloga, a neki od njih su:
 algoritamska sofisticiranost,
 postizanje adekvatne brzine izvoenja programa,
 ogranieni materijalni i vremenski resursi,
 slo転enost interakcije meu komponentama programa
Oblikovni obrasci rije邸avaju problem slo転enosti interakcije meu komponentama
programa, koji je slo転en iz vi邸e razloga. Postoji jako puno naina za organiziranje sustava, a
ponekad je i prekasno vidljiva prikladnost neke koncepcije programiranja (naje邸e nakon
implementacije). Organiziranje interakcije meu komponentama je kljuni zadatak
programskog oblikovanja i zato koristimo oblikovne obrasce.
Kori邸tenje oblikovnih obrazaca omoguuju da program korektno, sa zadovoljavajuim
perfomansama, obavlja svoj posao, a najbitnije od svega da je lako odr転iv i da je fleksibilan,
tj. otporan na promjene.
Oblikovni obrasci su stekli popularnost u raunalnim znanostima nakon izlaska knjige
Design Patterns: Elements of Reusable Object-Oriented Software (1994.). Iste godine
odr転ala se prva konferencija Patterns Languages of Programming , a sljedee godine je
Portland Pattern Repository odabran za dokumentiranje oblikovnih obrazaca.
Iako se oblikovni obrasci koriste u praksi ve du転e vrijeme, formalizacija koncepta je
zaostajala par godina.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 7 od 36
5. Obrazac Strategija (Strategypattern)
Obrazac Strategija je vjerovatno najkori邸teniji oblikovni obrazac jer ga razni programeri
koriste, a da ni ne znaju da je on definiran kao oblikovni obrazac. On se koristi tako 邸to se
definiraju razliiti algoritmi, enkapsulira se svaki od njih i omogui se njihova lagana
zamjena. Koristi se u sluajevima kada vi邸e klasa mora imati nekakvo specifino pona邸anje,
ali mogu imati svoju verziju implementacije tog pona邸anja.
Mo転emo za primjer uzeti klasu Patka. Ta klasa je apstraktna i u njoj se nalazi sve 邸to je
zajedniko svim patkama tj. 邸to svaka patka mora imati da bi ona mogla biti patka. U njoj
smo naveli atribut NacinLeta odnosno metodu izvrsiLet koja izvr邸ava nekakvu akciju na tom
atributu i jednu apstraktnu metodu opis:
1. Dijagram Strategije
Dakle, sada kada bilokoja klasa naslijedi klasu Patka, ona mora imati nekakav
NacinLeta, ali te implementacije mogu biti potpuno razliite. U sljedeem primjeru smo
napravili klasu DivljaPatka, napisali njenu implementaciju metode opis i u konstruktor joj
postavili njenu implementaciju NacinLeta, a to je klasa DugiLet.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 8 od 36
2. Klasa DivljaPatka
U nastavku, uz pomo StrategijaSimulatora mo転emo vidjeti kako koristiti oblikovni
obrazac strategiju i 邸to nam to tono on omoguava i olak邸ava. Napravili smo objekt
divljaPatka i odmah pozvali metode opis i izvrsiLet, za sada znamo da se automatski u
konstruktoru po defaultu postavlja kao nain leta DugiLet. Nakon toga smo uz pomo metode
postaviNacinLeta postavili tom objektu KratkiLet kao NacinLeta, i opet pozvali metode opis
i izvrsiLet.
3. Simulator Strategije
Oekivani output programa je da u oba sluaja metoda opis vrati isti rezultat, a to je da
je poruka na ekranu Ja sam divlja patka, dok iako se zvala ista metoda izvrsiLet, oekuju se
dva razliita rezultata zato 邸to smo nakon prvog poziva metode promijenili atribut nacinLeta
iz DugiLet u KratkiLet. Kao 邸to mo転emo vidjeti, i dobili smo taj output.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 9 od 36
4. Rezultat simulatora strategije
Zakljuak je da, kao 邸to je prikazano, razne implementacije nekih algoritama mo転emo
enkapsulirati u zasebne klase i mjenjati ih u runtime-u. Takoer, vrlo bitna prednost Strategija
obrasca, je ta da se za dodavanje novog naina leta ne treba mijenjati niti jedna druga klasa,
nego samo kreirati nova koja naslijeuje apstraktnu klasu NacinLeta. Na taj nain se
enkapsulacijom stvara vi邸e manjih i urednijih klasa kojih netreba izmjenjivati umjesto jedne
velike i neitke u kojoj treba implementirati sve verzije algoritama. Upotrebom Strategija
oblikovnog obrasca uvelike se smanjuje mogunost nastanka programske pogre邸ke tj. bug-a,
ali u vremena koje je potrebno za pronai isti ukoliko postoji.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 10 od 36
6. Obrazac Promatra (Observerpattern)
Uzmimo za primjer da 転elimo isprogramirati program koji nam prikazuje trenutno
vrijeme na klijentu, bio on raunalo ili mobilni ureaj. Trebali bi imati jednu verziju
aplikacije na klijentu koja bi slu転ila za primanje informacija o vremenu i njegovo
prikazivanje, ali i neku serversku aplikaciju koja bi na svaku promjenu vremena poslala
svojim klijentima informacije o tom vremenu. Dolazimo do problema kako obavijestiti
klijenta da server ima nove informacije, tj. kako da server zna koje sve klijente treba
obavijestiti. Oblikovni obrazac Promatra je stvoren za to i uz pomo njega je takva
komunikacija izuzetno jednostavna za implementirati.
Imati emo dvije vrste suelja:
1. Promatra - 邸to je u na邸em sluaju klijentska aplikacija, koja promatra i oslu邸kuje
promjene na serveru
2. Subjekt  邸to je u na邸em sluaju serverska aplikacija, koja obavije邸tava svoje
promatrae kada je do邸lo do promjene informacija
5. Dijagram Promatraa
Dakle klasa koja naslijeuje suelje Subjekt ima listu klasa koje naslijeuju suelje
Promatrac. Uz pomo metode registrirajPromatraca dodaju se promatrai koji 転ele biti
obavije邸teni kada doe do promjene informacija koje ih zanimaju. Uz pomo metode
izbrisiPromatraca se ti promatrai bri邸u tj. subjekt vi邸e nee znati za njih i nee ih obavijestiti
kada doe do novih informacija. Na kraju nam je ostala metoda obavijestiPromatrace koja
iterira po internoj listi promatraa od subjekta i na njima poziva metodu azuriraj tj.
obavije邸tava ih da je do邸lo do novih informacija i 邸alje im iste.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 11 od 36
U sljedeem primjeru mo転emo vidjeti kako koristiti oblikovni obrazac Promatra.
Napravili smo instancu klase Server koja nasljeuje suelje Subjekt, instance klase Klijent_1 i
Klijent_2 koje obje naslijeuju suelje Promatrac i njima smo kao parametar u konstruktor
proslijedili razliita imena kako bi u ispisu rezultata bilo jasnije 邸to se dogaa. U objektu
server smo registrirali objekt klijent_1 kao promatraa i nakon toga smo promijenili poruku
na serveru, tj. simulirali smo dolazak novih informacija. U outputu vidimo da je klijent_1
automatski obavije邸ten, ali klijent_2 oekivano nije. U nastavku programa smo registrirali i
drugog klijenta, te nakon toga promijenili informacije na serveru i vidimo da su sada oboje
primili te promijenjene informacije. Za kraj smo izbrisali oba promatraa sa servera i a転urirali
podatke. Niti jedan od promatraa nije obavije邸ten o a転uriranim podatcima.
6. Simulator Promatraa
Ispis programa iz simulatora je toan i oekivan. U nastavku su jo邸 implementacije
nekih klasa kako bi bilo jasnije 邸to, kako i za邸to se dogodilo.
7. Rezultat Simulatora Promatraa
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 12 od 36
Klase Klijent_1 i Klijent_2 imaju istu implementaciju pa je ovdje kao primjer
pokazana sam jedna. One slu転e samo da bi se potvrdilo da dvije razliite klase mogu biti
promatrai, samo tako 邸to implementiraju suelje Promatrac. U metodi azuriraj se ispisuje
primljena poruka na konzolu.
8. Klasa Klijent_1
U klasi Server mo転emo primjetiti da smo u metodu setPoruka, nakon 邸to se postavi nova
poruka, odmah pozvali metodu obavijestiPromatrace koja iterira po listi Promatraca i na
svima poziva metodu azuriraj, a kao parametar 邸alje novu poruku. Time smo dobili to da
svaki put kada doe nova poruka na server se svi promatrai a転uriraju.
9. Klasa Server
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 13 od 36
Zakljuak je da oblikovni obrazac Promatra definira vezu jedan prema vi邸e izmeu
objekata i da kada taj jedan objekt promijeni svoje stanje obavijesti svoje objekte koji su
vezani za njega o toj promjeni i oni automatski a転uriraju sve po potrebi. Subjekti ne znaju na
koji su nain implementirani promatrai, a ni promatrai ne znaju na koji su nain
implementirani subjekti i zbog toga mo転emo rei da je takav kod lak邸e itati i a転urirati.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 14 od 36
7. Obrazac Stanje (State pattern)
Dobili smo zadatak isprogramirati program za automat sa lopticama. Glavni use case
aparata je: ubacite 5 kn, stisnete gumb, dobijete lopticu. Jo邸 se moraju podr転avati sluajevi
kada nema vi邸e loptica i povrat novca.
Kada se malo bolje zadubimo u problematiku mo転emo vidjeti da zapravo postoje vi邸e
stanja automata, a to su:
 Nisu ubaeni novci
 Ubaeni su novci
 Nema vi邸e loptica
 Uspje邸na prodaja
Mogli bi definirati 4 konstante za svaki od stanja automata i onda pratiti u kojem je stanju
trenutno aparat i u metodi stisniGumb() to provjeravati sa if-else ili switch-case. Takav kod,
iako bi radio, ja jako nepregledan i kada bi htjeli dodati novo stanje automata onda bi to bilo
vrlo komplicirano i metode bi nam imale vi邸e stotina redaka.
Kako bi izbjegli takav kod i takav nain rada, defnirati emo suelje Stanje koje e imati
sve metode tj. podr転avati e sve akcije koje se mogu pozvati/odraditi na automatu. Napraviti
emo 4 klase koje e implementirati to suelje, a svaka od tih klasa e biti jedno stanje
automata.
10. Dijagram Stanja
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 15 od 36
Za primjer, umjesto sve 4 klase prikazana je samo klasa ImaNovca zbog toga 邸to su druge
tri vrlo sline. U njoj mo転emo vidjeti da ima refenencu na automat i da je se ona sama brine,
ovisno o pozvanoj metodi, da odradi 転eljenu akciju i postavi sljedee stanje na automat. I to
stanje ima svoje implementacije metoda. Na ovaj nain smo odlino enkapsulirali nain
razliita pona邸anja automata ovisno o stanju u kojem je i ne treba nam puno if-else funkcija
jer se svako stanje brine za sebe.
11. Klasa ImaNovca
Klasa Automat ima reference na sva stanja u kojima ona mo転e biti i ima atribut
trenutnoStanje u koji sadr転i referencu na trenutno stanje koje je postavljeno na automat i na
tom stanju se izvr邸avaju metode. Automat u runtime-u ne zna u kojem je stanju, ali ga nije ni
briga. On samo zna da se dogodila nekakva akcija, kao npr. gumb je stisnut, i onda on pozove
tu metodu na atributu trenutnoStanje i zna da svako stanje ima svoju implementaciju potrebne
metode.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 16 od 36
12. Klasa Automat
U simulatoru smo napravili instancu klase Automat i postavili u nju dvije loptice. Nakon
toga smo izvr邸ili par naredbi na instanci. Nismo se morali brinuti o stanjima niti ni邸ta
provjeravati. Za sve to se brine oblikovni obrazac Stanje. Prvo smo samo ubacili novac i
stisnuli gumb, te oekivano, dobili lopticu. Sada ima jo邸 samo jedna loptica u automatu.
Nakon toga smo ubacili novac, zatra転ili povrat i onda stisnuli gumb. Nismo dobili lopticu jer
je automat bio u stanju nemaNovca nakon 邸to smo tra転ili povrat, jo邸 uvijek je jedna loptica
ostala. Ubacili smo ponovno novac i stisnuli gumb, nakon ega smo dobili lopticu i, po邸to
vi邸e nema loptica, automat se je prebacio u nemaLoptica stanje. U tom stanju smo probali
izvr邸iti par naredbi, ali bez uspjeha.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 17 od 36
13. Simulator Stanja
Sve gore navedeno mo転emo vidjeti u outputu simulatora. Automat se sam brinuo o
stanjima u kojima je i uvijek je imao pravu akciju na svaku metodu.
14. Rezultat Simulatora Stanja
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 18 od 36
Oblikovni obrazac Stanje omoguuje objektu da mijenja svoje pona邸anje ovisno o
njegovom internom stanju. Korisnici tog objekta ne znaju da postoje njegova razliita stanja,
oni samo pozivaju metode koje im trebaju, a objekt se brine da ih izvr邸i 邸to bolje mo転e. Kod
je puno i邸i, pregledniji, itljiviji i vrlo ga je lagano promijeniti. Ako trebamo promijeniti
pona邸anje neke metode u nekom stanju, odmah znamo gdje to treba promijeniti. Takoer ako
trebamo izbacini neko stanje jednostavno pobri邸emo njegovu referencu iz klase Automat, a
ako 転elimo dodati neko novo stanje, samo kreiramo novu klasu, implementiramo potrebno
su邸elje, implementacije njegovih metoda i gotovi smo.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 19 od 36
8. Obrazac Naredba (Command pattern)
Programiramo upravlja za pametnu kuu. Sa tim upravljaem mo転emo upravljati
roletama, grijanjem, kuanskim aparatima i gara転nim vratima. Dakle upravlja mo転e
upravljati sa vi邸e razliitih ureaja, ali na tim ureajima mo転e imati samo dvije akcije, a to su
upali/ugasi. Naredbe se na upravljau moraju moi mjenjati i u runtime-u. Znai brisati stare i
dodavati nove. Klase ureanja ne mo転emo mijenjati jer njih mo転e napraviti njihov
proizvoa. Mi moramo imati samo neki jednostavan nain za kori邸tenje tih razliitih klasa.
Kreirajmo instancu klase Svjetlo koje ima metode upali() i ugasi(). Napravili smo i suelje
Naredba koje ima samo jednu metodu izvrsi(). Sada kako bi kreirali naredbu koja bi palila
svjetlo moramo napraviti novu klasu koja implementira suelje Naredba. Nazovimo tu klasu
UpaliSvjetloNaredba. Ta klasa ima referencu na svjetlo koje pali i poziva na njemu tu
pripadajuu metodu. Na isti nain smo napravili klase za ga邸enje svjetla, podizanje i spu邸tanje
gara転nih vrata.
15. Dijagram Naredbe
Upravljau smo u konstruktoru postavili da mo転e primiti samo dvije naredbe, ali to je
proizvoljno. On ima metode za pozivanje naredbi ovisno o njihovom rednom broju, ali i za
njihovo postavljanje, odnosno micanje. Ima dvije odvojene liste. Jedna sadr転i sve upali
naredbe, a druga sve ugasi. Postavljanje naredbi je napravljeno tako da se uvijek moraju
postaviti obje naredbe. Jo邸 uz sve to u klasi Upravljac postoji i intanca objekta
PraznaNaredba. Ona se postavlja po defaultu na sve pozicije u obje liste.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 20 od 36
16. Klasa Upravljac
Klasa PraznaNaredba je takozvani null objekt. On je koristan kada nemamo neki smislen
objekt za vratiti, ali ne 転elimo vratiti null vrijednost kako klijen nebi trebao paziti na to. U
na邸em sluaju je to prazna naredba koja, kada se pozove metoda izvrsi() na njoj, samo ispi邸e
da jo邸 niti jedna naredba nije dodijeljena tom rednom broju (iako zapravo ona je). Inae bi na
klijentu trebali provjeravati da li je vraen null i ako je onda to podr転ati. Ovako je kod na
klijentu puno i邸i i pregledniji. Null objekti su 邸iroko kori邸teni i smatraju se dobrom
praksom. U metodi makniNaredbe() se mo転e vidjeti da se zapravo me uklanjaju naredbe iz
lista nego se ba邸 na邸 null objekt postavlja na tu poziciju umjesto prija邸njih naredbi.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 21 od 36
17. Simulator Naredba
U simulatoru napravimo instancu klase Upravljac i odmah nakon toga pozivamo
upali/ugasi metode na oba mjesta u upravljacu. U konstruktoru je postavljeno da ima samo
dva slobodna mjesta. Nakon toga kreiramo naredbe za upaliti/ugasiti svjetlo i dignuti/spustiti
gara転na vrata. Naredbe za svjetlo postavljamo na prvu poziciju, a za gara転na vrata na drugu.
Nakon toga opet pozivamo sve upali/ugasi metode. Za kraj digni/spusti naredbe postavljamo
na prvu poziciju (gdje su prije bile naredbe za upali/ugasi svjetlo), a naredbe na drugoj
poziciji uklanjamo. Zadnji puta pozivamo upali/ugasi metode na upravljau. U nastavku
vidimo rezultat simulatora Naredba.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 22 od 36
18. Rezultat Simulatora Naredba
Kao 邸to mo転emo primjetiti odmah nakon instanciranja klase Upravljac sve naredbe su
postavljene kao PrazneNaredbe. Nakon toga postavljamo naredbe za svjetlo i garazna vrata i
vidimo da nakon 邸to ih pozovemo dobijemo oekivane rezultate. Moramo podr転avati
mjenjanje naredbi u runtime-u, ali i njihovo uklanjanje, 邸to vidimo u zadnjem primjeru da
radi. Ovdje su uzeti lagani primjeri gdje se naredba sastoji od samo jedne linije koda, npr.
upali svjetlo. Ali mo転emo kreirati puno kompleksnije naredbe, kao na primer za upravljanje
CD playerom. Na upravljau mo転emo imati naredbu sviraj(), a u toj naredbi bi se na klasi
CDPlayer izvr邸ile naredbe kao 邸to su: upali(), postaviCD(), pokreni().
Oblikovni obrazac Naredba enkapsulira zahtjev u jedan zasebni objekt i sa time
omoguava parametriziranje drugih objekata sa razliitim zahtjevima. Omoguuje i to da
klijent ne treba znati za implementacije klasa proizvoaa, nego on zna samo da postoji klasa
koja radi 転eljeni posao i da ta klasa sigurno ima metodu izvrsi() koju je naslijedila iz
kreiranog suelja.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 23 od 36
9. Obrazac Jedini (Singleton pattern)
Kako bi rad sa nekim zahtjevnijim programima bio ugodan i brz koristi se vi邸e dretvi. Ali
prilikom kori邸tenja vi邸e dretvi mogu se dogoditi razne gre邸ke. Na primjer mo転emo imati
jednu klasu koja e nam simulirati tvornicu okolade. Ta klasa se spaja na prave ureaje u
tvornici. U tvornici sigurno postoje neki spremnici koji dr転e tu okoladu i oni se prazne/pune
preko te klase. Pa tako se mo転e dogoditi da jedna dretva ima svoju instancu klase Tvornica i
pozove funkciju koja e napuniti te spremnike do vrha, prije toga provjerava neki flag da li je
spremnik prazan koji je prilikom kreiranja instance klase postavljen na to da je spremnik
prazan. Kada zavr邸i sa punjenjem, postavi taj flag da je spremnik pun. Ali u meuvremenu,
druga dretva sa svojim instancom klase Tvornica isto poziva tu metodu punjenja spremnika, i
po邸to je kreirala svoju instancu ona takoer misli da su spremnici prazni iako ih prva dretva
trenutno puni. Pa je i druga dretva poela sa punjenjem spremnika i do邸lo je do prepunjenja i
pucanja spremnika.
Kako bi se sprijeili takvi problemi koristimo oblikovni obrazac jedini. U ovom sluaju
emo imati dva simulatora. Prvi simulator e simulirati kori邸tenje dvije dretve bez kori邸tenja
oblikovnog obrasca Jedini, a drugi sa kori邸tenjem navedenog oblikovnog obrasca.
19. Klasa Tvornica
U klasi Tvornica imamo metodu napuniSpremnike() koja provjerava da li je punjenje
spremnika ve u tijeku i ispisuje pripadajuu poruku. U konstruktor smo poslali jednu int
vrijednost koja nam samo slu転i za detaljniji ispis.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 24 od 36
20. Simulator bez oblikovnog obrasca Jedini
Simuliramo kreiranje prve instance klase Tvornica u prvoj dretvi. Nakon toga pozivamo dva
puta metodu napuniSpremnike(). U ovom sluaju je sve dobro. Prilikom prvog pozivanja se
spremnici ponu puniti, a kada se opet pozove ta metoda se ispi邸e da su spremnici ve u
procesu punjenja. Ali problem nastupa kada simuliramo kreiranje druge instance klase
Tvornica sa drugom dretvom gdje opet pozivamo dva puta metodu napuniSpremnike().
21. Rezultat bez oblikovnog obrasca Jedini
Kao 邸to vidimo bez problema smo ponovno pokrenuli proces punjenja spremnika iako je
proces ve bio u tijeku i zbog tog propusta bi do邸lo do velikog i skupog o邸teenja ureaja
tvornice.
U drugom simulatoru simuliramo kori邸tenje oblikovnog obrasca Jedini. Da bi neka klasa
koristila taj oblikovni obrazac ona ne smije imati niti jedan javno dostupan konstruktor, tj.
mora imati privatne konstruktore. To bi sprijeilo da bilo tko kreira instancu klase. Mora imati
i metodu koja, prvi put kada je pozvana, poziva taj privatni konstuktor i u atribute klase
postavi tu instancu. A svaki drugi put jednostavno vrati tu jednu i istu instancu klase. Taj
atribut je statian tako da se ne moramo bojati da e nestati iz memorije.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 25 od 36
22. Klasa JedinaTvornica
U simulatoru kreiramo kreiranje instance klase uz pomo metode novaInstanca(). Nakon
toga pozivamo sva puta metodu napuniSpremnike(). Kao i u prvom simulatoru, prvi put se
pokrene punjenje, a drugi put ka転e da je punjenje u ve tijeku. Nakon toga ponovo pozivamo
metodu novaInstanca() kako bi simulirali poziv iz druge dretve.
23. Simulator sa oblikovnim obrascem Jedini
Nakon 邸to pozovemo metodu napuniSpremnike() na instanci iz druge dretve vidimo da,
iako smo zatra転ili novu instancu smo dobili staru koja je svjesna da je punjenje ve u tijeku i
ne dozvoljava nam ponovno pokretanje punjenja i time smo rije邸ili taj problem. Isto tako smo
mogli imati i vi邸e dretvi koje bi uvijek bile u toku sa stanjem tvornice.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 26 od 36
24. Rezultat sa oblikovnim obrascem Jedini
Oblikovni obrazac Jedini brine se da ta klasa ima samo jedu instancu i pru転a njezinu
globalnu pristupnu metodu. Instanca je statina 邸to znai da ju garbage collector, koji se brine
za i邸enje radne memorije od objekata koji se vi邸e ne koriste, nee uni邸titi. Sa privatnim
konstruktorom je postavila pravilo, da ako netko 転eli tu instancu klase mora pozvati metodu u
kojoj se provjerava da uvijek postoji samo jedna instanca.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 27 od 36
10. Obrazac Adapter (Adapter pattern)
Napravili smo program u dogovoru sa jednim proizvoaem gara転nih vrata koji nam je
samo dao suelja preko kojih komuniciramo, tj. 邸aljemo naredbe za otvaranje/zatvaranje vrata
itd. Naravno, nakon nekog vremena, uvijek mora doi do nekakve promjene. U ovom sluaju
promijenili smo proizvoaa, a on za rad sa njegovim gara転nim vratima nam daje totalno
nova suelja, drugaija od pro邸lih.
25. Bez adaptera
Bez kori邸tenja oblikovnog obrasca Adapter, trebali bismo proi kroz cijeli na邸 postojei
program i izmjeniti kod kako bi radio sa novim sueljima. To zahtjeva puno posla, a i otvara
mogunost raznim bugovima. Kako bismo izbjegli pisanje koda u na邸 ve postojei sustav
koji provjereno radi, napisati emo samo adapter klasu i uz pomo nje spojiti sustav u
cijelinu.
26. Sa adapterom
Postojei program se nije promijenio, nova suelja od proizvoaa niti ne mo転emo
mjenjati. Napisali smo klasu Adapter koja nam je pomogla natrag spojiti te dvije komponente.
Va転no je da adapter slu転i samo tome, delegiranju starih poziva metoda novima i
prilagoavanju podataka po potrebi.
Na邸 postojei
program
Nova
suelja
AdapterNa邸 postojei
program
Nova
suelja
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 28 od 36
27. Dijagram Adaptera
Iz dijagrama vidimo da klijent jo邸 uvijek samo zna za StaroSucelje i nastavlja ga koristiti
kako ga je i koristio. Klasa Adapter je implementirala to staro suelje, ali unutar
implementacije te metode ona poziva novu klasu, tj. novo suelje. Klijent niti ne zna da je
do邸lo do promjene modela i suelja i koristi sve kako je prije i koristio.
28. Klasa Adapter
Klasa Adapter implementira StaroSucelje, ali ima referencu na novu klasu NovaGaraza.
U metodama koje je nasljedila od starog suelja prilagoava podatke za novu implementaciju
i poziva sve potrebne metode na novoj klasi da bi izvr邸ila 転eljenu akciju.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 29 od 36
29. Simulator Adapter
U simulatoru smo napravili instancu klase StaraGaraza koja predstavlja klasu starog
proizvoaa, te instancu klase NovaGaraza koju smo dobili od novog proizvoaa. Napravili
smo adapter u koji smo poslali novu implementaciju gara転e, ali dobili staru implementaciju
suelja. Dalje, pozvali smo metodu otvoriVrata() na starom objektu i istu tu metodu na
adapteru.
30. Rezultat Simulatora Adaptera
U outputu simulatora mo転emo vidjeti da, iako smo mi pozvali dva puta istu metodu
otvoriVrata(), dobili smo dva razliita rezultata zbog toga 邸to je prvi poziv metode bio na
starom objektu, a drugi na novom.
Oblikovni obrazac Adapter pretvara suelje klase u drugaije suelje, tj. ono suelje koje
klijent oekuje i sa kojim zna raditi. Adapter omoguava klasama, koje inae nebi mogle
funkcionirati zajedno zbog razliitih suelja, da rade zajedno.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 30 od 36
11. Obrazac Tvornica (Factorypattern)
Uz pomo oblikovnog obrasca Tvornica enkapsuliramo cijeli postupak kreiranja nekog
objeka i tako dobijemo i邸i i uredniji kod, ali jo邸 bitnije je to 邸to imamo kreaciju objekata na
jednom mjestu, pa tako ako ikad doe do promjene kreacije te posebne instance klase, taj kod
promijenimo samo na jednom mjestu, a ne po cijelom kodu na邸e aplikacije.
31. Dijagram Tvornica
Iz dijagrama vidimo da klijent ne treba znati kako kreirati instancu klase Pizza, tonije ni
njenu implementaciju, ve samo ka転e tvornici koju vrstu 転eli i ona se brine da se u suelje
instancira potrebna klasa i da se naprave svi potrebni koraci kreiranja objekta.
Tvornica ne vraa tonu implementaciju klase ve implementaciju suelja koje ima sve
potrebne metode za manipulaciju objektom. Klijent uz minimalno truda ili znanja o koracima
koji su potrebni kako bi kreirao tu instancu klase, dobije garantirano dobro kreirani objekt sa
jednom linijom koda.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 31 od 36
32. Klasa Tvornica Pizza
Klasa PizzaTvornica ima samo jednu metodu napraviPizzu() koja prima parametar ovisno
o tome koju pizzu 転elimo kreirati. Na osnovi tog parametra kreira 転eljenu pizzu, a nakon toga
odradi dodatne korake koji su potrebni kako bi se pizza dobro napravila. U sluaju da se ikad
priprema pizze promijeni, mi trebamo samo ovdje a転urirati kod. Pa tako i ako dodamo novu
vrstu pizze ili maknemo staru, ovdje su sve promjene koje su potrebne. Tako smo smanjili
dupliciranje koda i mogunost buga.
Bolje prakticiranje koda bi bilo da smo jo邸 napravili enum svih vrsta pizze koje mo転emo
kreirati umjesto da samo prosljeujemo String, ali za demonstraciju oblikovnog obrasca nije
bilo potrebno pa je napravljeno da je 邸to jednostavnije i lak邸e za razumjeti.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 32 od 36
33. Simulator Tvornica
U simulatoru prvo prikazujemo kako bi izgledalo kreiranje Pizza instanca klase bez
oblikovnog obrasca Tvornica. Kod je repetitivan i ima puno mjesta za napraviti gre邸ku. Ako
ikad doe do promjene izrade pizze trebamo na svakom ovom mjestu mjenjati i prilagoavati
taj kod, 邸to iziskuje puno vremena i koncentracije.
U nastavku su napravljene dvije pizze sa oblikovnim obrascem Tvornica. Nakon potrebne
inicijalizacije tvornice, jednostavno pozivamo metodu napraviPizzu() i prosljeujemo 転eljenu
vrstu pizze. Kod od nekoliko linija smo sveli na svega jednu i uspje邸no enkapsulirali kreaciju
pizza objekata.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 33 od 36
34. Rezultat Simulatora Tvornice
U outputu vidimo da su odraeni svi isti koraci kreiranja pizze i u jednom i u drugom
sluaju, ali u simulatoru vidimo da se je kod uvelike smanjio, te da je pregledniji, i邸i i
najbitnije od svega lagano ga je promijeniti. Kod ovog oblikovnog obrasca je super to 邸to
mo転emo imati vi邸e tvornica za jedan objekt, ako on zahtjeva razliite pripreme i postupke
inicijalizacije.
Oblikovni obrazac Tvornica definira suelje za kreaciju pojedinog objekta, ali omoguava
podklasama da odlue koju e klasu instancirati. Takoer nam omoguava laganu izmjenu
koda po potrebi, sve kreacije objekata dr転imo na jednom mjestu i s time smo izbacili
mogunost krivog kreiranja objekta.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 34 od 36
12. Zakljuak
Oblikovni obrasci nisu direktno rije邸enje nekog problema ve su to naini kako 邸to vi邸e
smanjiti mogunost gre邸ke, omoguiti laganu nadogradnju ili izmjenu postojeeg
programskog koda, enkapsulirati sve zajednike sposobnosti i osobine na jedno mjesto.
Oblikovni obrasci su rije邸enja problema u kontekstu, tj. oni su akumulirano znanje o estim
problemima u programiranju.
U programiranju je repetitivnost i neitki kod znak da bi implementacija i rije邸enje istog
problema bilo lak邸e i urednije sa nekim oblikovnim obracem. Oblikovne obrasce je relativno
lagano primijeniti, ali programer treba biti sposoban uoiti obrazac tamo gdje on prirodno
lije転e. Takoer treba je bitno i vrijeme kada se uoi potreba za nekim oblikovnim obrascem.
Naje邸e se uoi potreba kada se ve napravi lo邸a implementacija, 邸to ne znai da je kasno, ali
ote転ava uvoenje specifinog oblikovnog obrasca.
U ovom seminaru su svi oblikovni obrasci prikazani kroz programski jezik Java, zato 邸to
je tako kod itljiv i lako razumljiv, ali oni su primjenijivi na gotovo sve objektno orijentirane
jezike.
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 35 od 36
13. Reference
1 https://www.fer.unizg.hr/predmet/ooup
2 https://en.wikipedia.org/wiki/Software_design_pattern
3 Head First Design Patterns, O'Reilly, 2004
4 https://sourcemaking.com/design_patterns
5 http://www.tutorialspoint.com/design_pattern/
6 http://www.oodesign.com/
Napredne tehnike programiranja web servisa (.open-source) Seminarski rad
Stranica 36 od 36
14. Popis slika
Str. Naziv slike
7 Dijagram Strategije
8 Klasa DivljaPatka, Simulator Strategije
9 Rezultat Simulatora Strategije
10 Dijagram Promatraa
11 Simulator Promatraa, Rezultat Simulatora Promatraa
12 Klasa Klijent_1, Klasa Server
14 Dijagram Stanja
15 Klasa ImaNovca
16 Klasa Automat
17 Simulator Stanja, Rezultat Simulatora Stanja
19 Dijagram Naredbe
20 Klasa Upravljac
21 Simulator Naredba
22 Rezultat Simulatora Naredba
23 Klasa Tvornica
24 Simulator bez oblikovnog obrasca Jedini, Rezultat bez oblikovnog obrasca Jedini
25 Klasa JedinaTvornica, Simulator sa oblikovnim obrascem Jedini
26 Rezultat sa oblikovnim obrascem Jedini
27 Bez Adaptera, Sa adapterom
28 Dijagram Adaptera, Klasa Adapter
29 Simulator Adapter, Rezultat Simulatora Adapter
30 Dijagram Tvornica
31 Klasa TvornicaPizza
32 Simulator Tvornica
33 Rezultat Simulatora Tvornica

More Related Content

Similar to Oblikovni obrasci (20)

Raunarski praktikum 1 - Razvoj softvera i dizajn
Raunarski praktikum 1 - Razvoj softvera i dizajnRaunarski praktikum 1 - Razvoj softvera i dizajn
Raunarski praktikum 1 - Razvoj softvera i dizajn
Goran Igaly
Goran Krmpoti_Agile_Scrum_Kanban
Goran Krmpoti_Agile_Scrum_KanbanGoran Krmpoti_Agile_Scrum_Kanban
Goran Krmpoti_Agile_Scrum_Kanban
Goran Krmpoti
Dizajn Softvera.pptx
Dizajn Softvera.pptxDizajn Softvera.pptx
Dizajn Softvera.pptx
BojanGrujic4
Komparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapas
Komparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapasKomparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapas
Komparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapas
Tihana Lapas
Mob Ellposs - projektna dokumentacija
Mob Ellposs - projektna dokumentacijaMob Ellposs - projektna dokumentacija
Mob Ellposs - projektna dokumentacija
Slaven Brumec
03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...
03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...
03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...
Ksenija Lonari
UPD (2).pptx.oasfasfccccccccccccccccccccccccccccccccccccccc
UPD (2).pptx.oasfasfcccccccccccccccccccccccccccccccccccccccUPD (2).pptx.oasfasfccccccccccccccccccccccccccccccccccccccc
UPD (2).pptx.oasfasfccccccccccccccccccccccccccccccccccccccc
Brankouljak
Agilni razvoj proizvoda
Agilni razvoj proizvodaAgilni razvoj proizvoda
Agilni razvoj proizvoda
Bosnia Agile
Za邸to nam treba PaaS u Srcu?
Za邸to nam treba PaaS u Srcu?Za邸to nam treba PaaS u Srcu?
Za邸to nam treba PaaS u Srcu?
Denis Kranjec
Upravljanje Web Uslugama u IT okru転enjima
Upravljanje Web Uslugama u IT okru転enjimaUpravljanje Web Uslugama u IT okru転enjima
Upravljanje Web Uslugama u IT okru転enjima
andrea132961
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9.
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9. [TVZ raunarstvo] Dinamike web aplikacije, predavanje 9.
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9.
Stipe Predanic
POSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptx
POSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptxPOSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptx
POSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptx
LarlochLes
Angular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump DayAngular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump Day
NETMedia
cloud computing zavr邸ni
cloud computing zavr邸nicloud computing zavr邸ni
cloud computing zavr邸ni
Tomislav Peji
Rp1 predavanja 01
Rp1 predavanja 01Rp1 predavanja 01
Rp1 predavanja 01
Goran Igaly
Organizacija razvoja u internacionalnom development teamu
Organizacija razvoja u internacionalnom development teamuOrganizacija razvoja u internacionalnom development teamu
Organizacija razvoja u internacionalnom development teamu
Luka Kladaric
Raunarski praktikum 1 - Razvoj softvera i dizajn
Raunarski praktikum 1 - Razvoj softvera i dizajnRaunarski praktikum 1 - Razvoj softvera i dizajn
Raunarski praktikum 1 - Razvoj softvera i dizajn
Goran Igaly
Goran Krmpoti_Agile_Scrum_Kanban
Goran Krmpoti_Agile_Scrum_KanbanGoran Krmpoti_Agile_Scrum_Kanban
Goran Krmpoti_Agile_Scrum_Kanban
Goran Krmpoti
Dizajn Softvera.pptx
Dizajn Softvera.pptxDizajn Softvera.pptx
Dizajn Softvera.pptx
BojanGrujic4
Komparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapas
Komparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapasKomparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapas
Komparativna analiza poslovnih informacijskih sustava otvorenog koda_tlapas
Tihana Lapas
Mob Ellposs - projektna dokumentacija
Mob Ellposs - projektna dokumentacijaMob Ellposs - projektna dokumentacija
Mob Ellposs - projektna dokumentacija
Slaven Brumec
03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...
03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...
03 Loncaric, Ksenija, Analiza modela troskova digitalnog ocuvanja v.2 - prepr...
Ksenija Lonari
UPD (2).pptx.oasfasfccccccccccccccccccccccccccccccccccccccc
UPD (2).pptx.oasfasfcccccccccccccccccccccccccccccccccccccccUPD (2).pptx.oasfasfccccccccccccccccccccccccccccccccccccccc
UPD (2).pptx.oasfasfccccccccccccccccccccccccccccccccccccccc
Brankouljak
Agilni razvoj proizvoda
Agilni razvoj proizvodaAgilni razvoj proizvoda
Agilni razvoj proizvoda
Bosnia Agile
Za邸to nam treba PaaS u Srcu?
Za邸to nam treba PaaS u Srcu?Za邸to nam treba PaaS u Srcu?
Za邸to nam treba PaaS u Srcu?
Denis Kranjec
Upravljanje Web Uslugama u IT okru転enjima
Upravljanje Web Uslugama u IT okru転enjimaUpravljanje Web Uslugama u IT okru転enjima
Upravljanje Web Uslugama u IT okru転enjima
andrea132961
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9.
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9. [TVZ raunarstvo] Dinamike web aplikacije, predavanje 9.
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9.
Stipe Predanic
POSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptx
POSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptxPOSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptx
POSLOVNE PROGRAMSKE APLIKACIJE I MIGRACIJE BAZA.pptx
LarlochLes
Angular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump DayAngular 2 and TypeScript - 2016 Dump Day
Angular 2 and TypeScript - 2016 Dump Day
NETMedia
cloud computing zavr邸ni
cloud computing zavr邸nicloud computing zavr邸ni
cloud computing zavr邸ni
Tomislav Peji
Rp1 predavanja 01
Rp1 predavanja 01Rp1 predavanja 01
Rp1 predavanja 01
Goran Igaly
Organizacija razvoja u internacionalnom development teamu
Organizacija razvoja u internacionalnom development teamuOrganizacija razvoja u internacionalnom development teamu
Organizacija razvoja u internacionalnom development teamu
Luka Kladaric

Oblikovni obrasci

  • 1. Tehniko veleuili邸te u Zagrebu Vrbik 8, Zagreb Seminar OBLIKOVNI OBRASCI U PROGRAMIRANJU Student: Petar Marijanovi Zagreb, 25.10.2015
  • 2. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 2 od 36 Sadr転aj 1. Dnevnik promjena dokumentacije ......................................................................................3 2. Opis seminarskog rada ........................................................................................................4 3. Pojmovnik ...........................................................................................................................5 4. Uvod....................................................................................................................................6 5. Obrazac Strategija (Strategy pattern) ..................................................................................7 6. Obrazac Promatra (Observer pattern)..............................................................................10 7. Obrazac Stanje (State pattern)...........................................................................................14 8. Obrazac Naredba (Command pattern)...............................................................................19 9. Obrazac Jedini (Singleton pattern)...................................................................................23 10. Obrazac Adapter (Adapter pattern) ...............................................................................27 11. Obrazac Tvornica (Factory pattern) ..............................................................................30 12. Zakljuak .......................................................................................................................34 13. Reference.......................................................................................................................35 14. Popis slika......................................................................................................................36
  • 3. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 3 od 36 1. Dnevnik promjena dokumentacije Rev. Opis promjene/dodatka Autor Datum 0.1 Napravljen sadr転aj i opi oblik seminara Marijanovi 18.09.2015. 0.2 Promijenjeni nazivi poglavlja, raspisano poglavlje O oblikovnim obrascima, dodane pripadajue reference Marijanovi 21.09.2015. 0.3 Napisana poglavlja Strategija i Promatra, dodana tablica sa popisom slika, a転uriran Pojmovnik Marijanovi 08.10.2015. 0.4 Napisana poglavlja Stanje, Naredba i Jedini, a転uriran Pojmovnik Marijanovi 24.10.2015. 0.5. Napisana poglavlja Adapter i Tvornica Marijanovi 25.10.2015. 0.6. Napisan Zakljuak i ureen Uvod Marijanovi 25.10.2015. 0.7. Prilagoena forma seminara Marijanovi 25.10.2015. 0.8. A転uriran popis slikovnog materijala Marijanovi 25.10.2015. 0.9. Ispravljene gre邸ke u seminaru Marijanovi 25.10.2015. 1.0. Gotova prva verzija seminara Marijanovi 25.10.2015.
  • 4. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 4 od 36 2. Opis seminarskog rada Ovaj seminarski rad e pokriti openite i najkori邸tenije oblikovne obrasce u programiranju (Design Patterns). Cilj je 邸to jednostavnije prikazati neke od tih oblikovnih obrazaca kako bi se, navedeni, vrlo lako mogli poeti koristiti u praksi. Programski jezik u kojem e biti primjeri je Java. Skup programera koji bi mogli biti zainteresirani za itanje ovog seminarskog rada su svi oni programeri koji programiraju u nekom objektno orijentiranom jeziku.
  • 5. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 5 od 36 3. Pojmovnik Bug Gre邸ka u izvornom kodu programa Default Podrazumijevano Design Patterns Oblikovni obrasci o kojima je ovaj seminar pisan Flag Zastavica, slu転i za oznaavanje stanja Garbage collector Oblik automatskog upravljanja memorijom Java Programski jezik Output Izlaz, tj. rezultat programa Runtime Program u trenutku izvoenja Use case Sluaj u kojem se ne邸to koristi
  • 6. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 6 od 36 4. Uvod U programskom in転enjerstvu, oblikovni obrazac je ope, ponovno upotrebljivo rije邸enje za naje邸e javljane probleme unutar odreenog konteksta u softverskom dizajnu. Oblikovni obrasci nisu gotovi dizajni koji se mogu pretvoriti u izvorni ili strojni kod. To je ideja ili predlo転ak za kako rije邸iti problem koji se mo転e koristiti u mnogim razliitim situacijama. Oblikovni obrasci su formalizirane najbolje prakse koje se mogu koristiti za rije邸avanje naje邸ih problema pri izradi programa ili sustava. Programsko in転enjerstvo je te邸ko iz vi邸e razloga, a neki od njih su: algoritamska sofisticiranost, postizanje adekvatne brzine izvoenja programa, ogranieni materijalni i vremenski resursi, slo転enost interakcije meu komponentama programa Oblikovni obrasci rije邸avaju problem slo転enosti interakcije meu komponentama programa, koji je slo転en iz vi邸e razloga. Postoji jako puno naina za organiziranje sustava, a ponekad je i prekasno vidljiva prikladnost neke koncepcije programiranja (naje邸e nakon implementacije). Organiziranje interakcije meu komponentama je kljuni zadatak programskog oblikovanja i zato koristimo oblikovne obrasce. Kori邸tenje oblikovnih obrazaca omoguuju da program korektno, sa zadovoljavajuim perfomansama, obavlja svoj posao, a najbitnije od svega da je lako odr転iv i da je fleksibilan, tj. otporan na promjene. Oblikovni obrasci su stekli popularnost u raunalnim znanostima nakon izlaska knjige Design Patterns: Elements of Reusable Object-Oriented Software (1994.). Iste godine odr転ala se prva konferencija Patterns Languages of Programming , a sljedee godine je Portland Pattern Repository odabran za dokumentiranje oblikovnih obrazaca. Iako se oblikovni obrasci koriste u praksi ve du転e vrijeme, formalizacija koncepta je zaostajala par godina.
  • 7. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 7 od 36 5. Obrazac Strategija (Strategypattern) Obrazac Strategija je vjerovatno najkori邸teniji oblikovni obrazac jer ga razni programeri koriste, a da ni ne znaju da je on definiran kao oblikovni obrazac. On se koristi tako 邸to se definiraju razliiti algoritmi, enkapsulira se svaki od njih i omogui se njihova lagana zamjena. Koristi se u sluajevima kada vi邸e klasa mora imati nekakvo specifino pona邸anje, ali mogu imati svoju verziju implementacije tog pona邸anja. Mo転emo za primjer uzeti klasu Patka. Ta klasa je apstraktna i u njoj se nalazi sve 邸to je zajedniko svim patkama tj. 邸to svaka patka mora imati da bi ona mogla biti patka. U njoj smo naveli atribut NacinLeta odnosno metodu izvrsiLet koja izvr邸ava nekakvu akciju na tom atributu i jednu apstraktnu metodu opis: 1. Dijagram Strategije Dakle, sada kada bilokoja klasa naslijedi klasu Patka, ona mora imati nekakav NacinLeta, ali te implementacije mogu biti potpuno razliite. U sljedeem primjeru smo napravili klasu DivljaPatka, napisali njenu implementaciju metode opis i u konstruktor joj postavili njenu implementaciju NacinLeta, a to je klasa DugiLet.
  • 8. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 8 od 36 2. Klasa DivljaPatka U nastavku, uz pomo StrategijaSimulatora mo転emo vidjeti kako koristiti oblikovni obrazac strategiju i 邸to nam to tono on omoguava i olak邸ava. Napravili smo objekt divljaPatka i odmah pozvali metode opis i izvrsiLet, za sada znamo da se automatski u konstruktoru po defaultu postavlja kao nain leta DugiLet. Nakon toga smo uz pomo metode postaviNacinLeta postavili tom objektu KratkiLet kao NacinLeta, i opet pozvali metode opis i izvrsiLet. 3. Simulator Strategije Oekivani output programa je da u oba sluaja metoda opis vrati isti rezultat, a to je da je poruka na ekranu Ja sam divlja patka, dok iako se zvala ista metoda izvrsiLet, oekuju se dva razliita rezultata zato 邸to smo nakon prvog poziva metode promijenili atribut nacinLeta iz DugiLet u KratkiLet. Kao 邸to mo転emo vidjeti, i dobili smo taj output.
  • 9. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 9 od 36 4. Rezultat simulatora strategije Zakljuak je da, kao 邸to je prikazano, razne implementacije nekih algoritama mo転emo enkapsulirati u zasebne klase i mjenjati ih u runtime-u. Takoer, vrlo bitna prednost Strategija obrasca, je ta da se za dodavanje novog naina leta ne treba mijenjati niti jedna druga klasa, nego samo kreirati nova koja naslijeuje apstraktnu klasu NacinLeta. Na taj nain se enkapsulacijom stvara vi邸e manjih i urednijih klasa kojih netreba izmjenjivati umjesto jedne velike i neitke u kojoj treba implementirati sve verzije algoritama. Upotrebom Strategija oblikovnog obrasca uvelike se smanjuje mogunost nastanka programske pogre邸ke tj. bug-a, ali u vremena koje je potrebno za pronai isti ukoliko postoji.
  • 10. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 10 od 36 6. Obrazac Promatra (Observerpattern) Uzmimo za primjer da 転elimo isprogramirati program koji nam prikazuje trenutno vrijeme na klijentu, bio on raunalo ili mobilni ureaj. Trebali bi imati jednu verziju aplikacije na klijentu koja bi slu転ila za primanje informacija o vremenu i njegovo prikazivanje, ali i neku serversku aplikaciju koja bi na svaku promjenu vremena poslala svojim klijentima informacije o tom vremenu. Dolazimo do problema kako obavijestiti klijenta da server ima nove informacije, tj. kako da server zna koje sve klijente treba obavijestiti. Oblikovni obrazac Promatra je stvoren za to i uz pomo njega je takva komunikacija izuzetno jednostavna za implementirati. Imati emo dvije vrste suelja: 1. Promatra - 邸to je u na邸em sluaju klijentska aplikacija, koja promatra i oslu邸kuje promjene na serveru 2. Subjekt 邸to je u na邸em sluaju serverska aplikacija, koja obavije邸tava svoje promatrae kada je do邸lo do promjene informacija 5. Dijagram Promatraa Dakle klasa koja naslijeuje suelje Subjekt ima listu klasa koje naslijeuju suelje Promatrac. Uz pomo metode registrirajPromatraca dodaju se promatrai koji 転ele biti obavije邸teni kada doe do promjene informacija koje ih zanimaju. Uz pomo metode izbrisiPromatraca se ti promatrai bri邸u tj. subjekt vi邸e nee znati za njih i nee ih obavijestiti kada doe do novih informacija. Na kraju nam je ostala metoda obavijestiPromatrace koja iterira po internoj listi promatraa od subjekta i na njima poziva metodu azuriraj tj. obavije邸tava ih da je do邸lo do novih informacija i 邸alje im iste.
  • 11. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 11 od 36 U sljedeem primjeru mo転emo vidjeti kako koristiti oblikovni obrazac Promatra. Napravili smo instancu klase Server koja nasljeuje suelje Subjekt, instance klase Klijent_1 i Klijent_2 koje obje naslijeuju suelje Promatrac i njima smo kao parametar u konstruktor proslijedili razliita imena kako bi u ispisu rezultata bilo jasnije 邸to se dogaa. U objektu server smo registrirali objekt klijent_1 kao promatraa i nakon toga smo promijenili poruku na serveru, tj. simulirali smo dolazak novih informacija. U outputu vidimo da je klijent_1 automatski obavije邸ten, ali klijent_2 oekivano nije. U nastavku programa smo registrirali i drugog klijenta, te nakon toga promijenili informacije na serveru i vidimo da su sada oboje primili te promijenjene informacije. Za kraj smo izbrisali oba promatraa sa servera i a転urirali podatke. Niti jedan od promatraa nije obavije邸ten o a転uriranim podatcima. 6. Simulator Promatraa Ispis programa iz simulatora je toan i oekivan. U nastavku su jo邸 implementacije nekih klasa kako bi bilo jasnije 邸to, kako i za邸to se dogodilo. 7. Rezultat Simulatora Promatraa
  • 12. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 12 od 36 Klase Klijent_1 i Klijent_2 imaju istu implementaciju pa je ovdje kao primjer pokazana sam jedna. One slu転e samo da bi se potvrdilo da dvije razliite klase mogu biti promatrai, samo tako 邸to implementiraju suelje Promatrac. U metodi azuriraj se ispisuje primljena poruka na konzolu. 8. Klasa Klijent_1 U klasi Server mo転emo primjetiti da smo u metodu setPoruka, nakon 邸to se postavi nova poruka, odmah pozvali metodu obavijestiPromatrace koja iterira po listi Promatraca i na svima poziva metodu azuriraj, a kao parametar 邸alje novu poruku. Time smo dobili to da svaki put kada doe nova poruka na server se svi promatrai a転uriraju. 9. Klasa Server
  • 13. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 13 od 36 Zakljuak je da oblikovni obrazac Promatra definira vezu jedan prema vi邸e izmeu objekata i da kada taj jedan objekt promijeni svoje stanje obavijesti svoje objekte koji su vezani za njega o toj promjeni i oni automatski a転uriraju sve po potrebi. Subjekti ne znaju na koji su nain implementirani promatrai, a ni promatrai ne znaju na koji su nain implementirani subjekti i zbog toga mo転emo rei da je takav kod lak邸e itati i a転urirati.
  • 14. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 14 od 36 7. Obrazac Stanje (State pattern) Dobili smo zadatak isprogramirati program za automat sa lopticama. Glavni use case aparata je: ubacite 5 kn, stisnete gumb, dobijete lopticu. Jo邸 se moraju podr転avati sluajevi kada nema vi邸e loptica i povrat novca. Kada se malo bolje zadubimo u problematiku mo転emo vidjeti da zapravo postoje vi邸e stanja automata, a to su: Nisu ubaeni novci Ubaeni su novci Nema vi邸e loptica Uspje邸na prodaja Mogli bi definirati 4 konstante za svaki od stanja automata i onda pratiti u kojem je stanju trenutno aparat i u metodi stisniGumb() to provjeravati sa if-else ili switch-case. Takav kod, iako bi radio, ja jako nepregledan i kada bi htjeli dodati novo stanje automata onda bi to bilo vrlo komplicirano i metode bi nam imale vi邸e stotina redaka. Kako bi izbjegli takav kod i takav nain rada, defnirati emo suelje Stanje koje e imati sve metode tj. podr転avati e sve akcije koje se mogu pozvati/odraditi na automatu. Napraviti emo 4 klase koje e implementirati to suelje, a svaka od tih klasa e biti jedno stanje automata. 10. Dijagram Stanja
  • 15. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 15 od 36 Za primjer, umjesto sve 4 klase prikazana je samo klasa ImaNovca zbog toga 邸to su druge tri vrlo sline. U njoj mo転emo vidjeti da ima refenencu na automat i da je se ona sama brine, ovisno o pozvanoj metodi, da odradi 転eljenu akciju i postavi sljedee stanje na automat. I to stanje ima svoje implementacije metoda. Na ovaj nain smo odlino enkapsulirali nain razliita pona邸anja automata ovisno o stanju u kojem je i ne treba nam puno if-else funkcija jer se svako stanje brine za sebe. 11. Klasa ImaNovca Klasa Automat ima reference na sva stanja u kojima ona mo転e biti i ima atribut trenutnoStanje u koji sadr転i referencu na trenutno stanje koje je postavljeno na automat i na tom stanju se izvr邸avaju metode. Automat u runtime-u ne zna u kojem je stanju, ali ga nije ni briga. On samo zna da se dogodila nekakva akcija, kao npr. gumb je stisnut, i onda on pozove tu metodu na atributu trenutnoStanje i zna da svako stanje ima svoju implementaciju potrebne metode.
  • 16. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 16 od 36 12. Klasa Automat U simulatoru smo napravili instancu klase Automat i postavili u nju dvije loptice. Nakon toga smo izvr邸ili par naredbi na instanci. Nismo se morali brinuti o stanjima niti ni邸ta provjeravati. Za sve to se brine oblikovni obrazac Stanje. Prvo smo samo ubacili novac i stisnuli gumb, te oekivano, dobili lopticu. Sada ima jo邸 samo jedna loptica u automatu. Nakon toga smo ubacili novac, zatra転ili povrat i onda stisnuli gumb. Nismo dobili lopticu jer je automat bio u stanju nemaNovca nakon 邸to smo tra転ili povrat, jo邸 uvijek je jedna loptica ostala. Ubacili smo ponovno novac i stisnuli gumb, nakon ega smo dobili lopticu i, po邸to vi邸e nema loptica, automat se je prebacio u nemaLoptica stanje. U tom stanju smo probali izvr邸iti par naredbi, ali bez uspjeha.
  • 17. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 17 od 36 13. Simulator Stanja Sve gore navedeno mo転emo vidjeti u outputu simulatora. Automat se sam brinuo o stanjima u kojima je i uvijek je imao pravu akciju na svaku metodu. 14. Rezultat Simulatora Stanja
  • 18. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 18 od 36 Oblikovni obrazac Stanje omoguuje objektu da mijenja svoje pona邸anje ovisno o njegovom internom stanju. Korisnici tog objekta ne znaju da postoje njegova razliita stanja, oni samo pozivaju metode koje im trebaju, a objekt se brine da ih izvr邸i 邸to bolje mo転e. Kod je puno i邸i, pregledniji, itljiviji i vrlo ga je lagano promijeniti. Ako trebamo promijeniti pona邸anje neke metode u nekom stanju, odmah znamo gdje to treba promijeniti. Takoer ako trebamo izbacini neko stanje jednostavno pobri邸emo njegovu referencu iz klase Automat, a ako 転elimo dodati neko novo stanje, samo kreiramo novu klasu, implementiramo potrebno su邸elje, implementacije njegovih metoda i gotovi smo.
  • 19. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 19 od 36 8. Obrazac Naredba (Command pattern) Programiramo upravlja za pametnu kuu. Sa tim upravljaem mo転emo upravljati roletama, grijanjem, kuanskim aparatima i gara転nim vratima. Dakle upravlja mo転e upravljati sa vi邸e razliitih ureaja, ali na tim ureajima mo転e imati samo dvije akcije, a to su upali/ugasi. Naredbe se na upravljau moraju moi mjenjati i u runtime-u. Znai brisati stare i dodavati nove. Klase ureanja ne mo転emo mijenjati jer njih mo転e napraviti njihov proizvoa. Mi moramo imati samo neki jednostavan nain za kori邸tenje tih razliitih klasa. Kreirajmo instancu klase Svjetlo koje ima metode upali() i ugasi(). Napravili smo i suelje Naredba koje ima samo jednu metodu izvrsi(). Sada kako bi kreirali naredbu koja bi palila svjetlo moramo napraviti novu klasu koja implementira suelje Naredba. Nazovimo tu klasu UpaliSvjetloNaredba. Ta klasa ima referencu na svjetlo koje pali i poziva na njemu tu pripadajuu metodu. Na isti nain smo napravili klase za ga邸enje svjetla, podizanje i spu邸tanje gara転nih vrata. 15. Dijagram Naredbe Upravljau smo u konstruktoru postavili da mo転e primiti samo dvije naredbe, ali to je proizvoljno. On ima metode za pozivanje naredbi ovisno o njihovom rednom broju, ali i za njihovo postavljanje, odnosno micanje. Ima dvije odvojene liste. Jedna sadr転i sve upali naredbe, a druga sve ugasi. Postavljanje naredbi je napravljeno tako da se uvijek moraju postaviti obje naredbe. Jo邸 uz sve to u klasi Upravljac postoji i intanca objekta PraznaNaredba. Ona se postavlja po defaultu na sve pozicije u obje liste.
  • 20. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 20 od 36 16. Klasa Upravljac Klasa PraznaNaredba je takozvani null objekt. On je koristan kada nemamo neki smislen objekt za vratiti, ali ne 転elimo vratiti null vrijednost kako klijen nebi trebao paziti na to. U na邸em sluaju je to prazna naredba koja, kada se pozove metoda izvrsi() na njoj, samo ispi邸e da jo邸 niti jedna naredba nije dodijeljena tom rednom broju (iako zapravo ona je). Inae bi na klijentu trebali provjeravati da li je vraen null i ako je onda to podr転ati. Ovako je kod na klijentu puno i邸i i pregledniji. Null objekti su 邸iroko kori邸teni i smatraju se dobrom praksom. U metodi makniNaredbe() se mo転e vidjeti da se zapravo me uklanjaju naredbe iz lista nego se ba邸 na邸 null objekt postavlja na tu poziciju umjesto prija邸njih naredbi.
  • 21. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 21 od 36 17. Simulator Naredba U simulatoru napravimo instancu klase Upravljac i odmah nakon toga pozivamo upali/ugasi metode na oba mjesta u upravljacu. U konstruktoru je postavljeno da ima samo dva slobodna mjesta. Nakon toga kreiramo naredbe za upaliti/ugasiti svjetlo i dignuti/spustiti gara転na vrata. Naredbe za svjetlo postavljamo na prvu poziciju, a za gara転na vrata na drugu. Nakon toga opet pozivamo sve upali/ugasi metode. Za kraj digni/spusti naredbe postavljamo na prvu poziciju (gdje su prije bile naredbe za upali/ugasi svjetlo), a naredbe na drugoj poziciji uklanjamo. Zadnji puta pozivamo upali/ugasi metode na upravljau. U nastavku vidimo rezultat simulatora Naredba.
  • 22. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 22 od 36 18. Rezultat Simulatora Naredba Kao 邸to mo転emo primjetiti odmah nakon instanciranja klase Upravljac sve naredbe su postavljene kao PrazneNaredbe. Nakon toga postavljamo naredbe za svjetlo i garazna vrata i vidimo da nakon 邸to ih pozovemo dobijemo oekivane rezultate. Moramo podr転avati mjenjanje naredbi u runtime-u, ali i njihovo uklanjanje, 邸to vidimo u zadnjem primjeru da radi. Ovdje su uzeti lagani primjeri gdje se naredba sastoji od samo jedne linije koda, npr. upali svjetlo. Ali mo転emo kreirati puno kompleksnije naredbe, kao na primer za upravljanje CD playerom. Na upravljau mo転emo imati naredbu sviraj(), a u toj naredbi bi se na klasi CDPlayer izvr邸ile naredbe kao 邸to su: upali(), postaviCD(), pokreni(). Oblikovni obrazac Naredba enkapsulira zahtjev u jedan zasebni objekt i sa time omoguava parametriziranje drugih objekata sa razliitim zahtjevima. Omoguuje i to da klijent ne treba znati za implementacije klasa proizvoaa, nego on zna samo da postoji klasa koja radi 転eljeni posao i da ta klasa sigurno ima metodu izvrsi() koju je naslijedila iz kreiranog suelja.
  • 23. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 23 od 36 9. Obrazac Jedini (Singleton pattern) Kako bi rad sa nekim zahtjevnijim programima bio ugodan i brz koristi se vi邸e dretvi. Ali prilikom kori邸tenja vi邸e dretvi mogu se dogoditi razne gre邸ke. Na primjer mo転emo imati jednu klasu koja e nam simulirati tvornicu okolade. Ta klasa se spaja na prave ureaje u tvornici. U tvornici sigurno postoje neki spremnici koji dr転e tu okoladu i oni se prazne/pune preko te klase. Pa tako se mo転e dogoditi da jedna dretva ima svoju instancu klase Tvornica i pozove funkciju koja e napuniti te spremnike do vrha, prije toga provjerava neki flag da li je spremnik prazan koji je prilikom kreiranja instance klase postavljen na to da je spremnik prazan. Kada zavr邸i sa punjenjem, postavi taj flag da je spremnik pun. Ali u meuvremenu, druga dretva sa svojim instancom klase Tvornica isto poziva tu metodu punjenja spremnika, i po邸to je kreirala svoju instancu ona takoer misli da su spremnici prazni iako ih prva dretva trenutno puni. Pa je i druga dretva poela sa punjenjem spremnika i do邸lo je do prepunjenja i pucanja spremnika. Kako bi se sprijeili takvi problemi koristimo oblikovni obrazac jedini. U ovom sluaju emo imati dva simulatora. Prvi simulator e simulirati kori邸tenje dvije dretve bez kori邸tenja oblikovnog obrasca Jedini, a drugi sa kori邸tenjem navedenog oblikovnog obrasca. 19. Klasa Tvornica U klasi Tvornica imamo metodu napuniSpremnike() koja provjerava da li je punjenje spremnika ve u tijeku i ispisuje pripadajuu poruku. U konstruktor smo poslali jednu int vrijednost koja nam samo slu転i za detaljniji ispis.
  • 24. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 24 od 36 20. Simulator bez oblikovnog obrasca Jedini Simuliramo kreiranje prve instance klase Tvornica u prvoj dretvi. Nakon toga pozivamo dva puta metodu napuniSpremnike(). U ovom sluaju je sve dobro. Prilikom prvog pozivanja se spremnici ponu puniti, a kada se opet pozove ta metoda se ispi邸e da su spremnici ve u procesu punjenja. Ali problem nastupa kada simuliramo kreiranje druge instance klase Tvornica sa drugom dretvom gdje opet pozivamo dva puta metodu napuniSpremnike(). 21. Rezultat bez oblikovnog obrasca Jedini Kao 邸to vidimo bez problema smo ponovno pokrenuli proces punjenja spremnika iako je proces ve bio u tijeku i zbog tog propusta bi do邸lo do velikog i skupog o邸teenja ureaja tvornice. U drugom simulatoru simuliramo kori邸tenje oblikovnog obrasca Jedini. Da bi neka klasa koristila taj oblikovni obrazac ona ne smije imati niti jedan javno dostupan konstruktor, tj. mora imati privatne konstruktore. To bi sprijeilo da bilo tko kreira instancu klase. Mora imati i metodu koja, prvi put kada je pozvana, poziva taj privatni konstuktor i u atribute klase postavi tu instancu. A svaki drugi put jednostavno vrati tu jednu i istu instancu klase. Taj atribut je statian tako da se ne moramo bojati da e nestati iz memorije.
  • 25. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 25 od 36 22. Klasa JedinaTvornica U simulatoru kreiramo kreiranje instance klase uz pomo metode novaInstanca(). Nakon toga pozivamo sva puta metodu napuniSpremnike(). Kao i u prvom simulatoru, prvi put se pokrene punjenje, a drugi put ka転e da je punjenje u ve tijeku. Nakon toga ponovo pozivamo metodu novaInstanca() kako bi simulirali poziv iz druge dretve. 23. Simulator sa oblikovnim obrascem Jedini Nakon 邸to pozovemo metodu napuniSpremnike() na instanci iz druge dretve vidimo da, iako smo zatra転ili novu instancu smo dobili staru koja je svjesna da je punjenje ve u tijeku i ne dozvoljava nam ponovno pokretanje punjenja i time smo rije邸ili taj problem. Isto tako smo mogli imati i vi邸e dretvi koje bi uvijek bile u toku sa stanjem tvornice.
  • 26. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 26 od 36 24. Rezultat sa oblikovnim obrascem Jedini Oblikovni obrazac Jedini brine se da ta klasa ima samo jedu instancu i pru転a njezinu globalnu pristupnu metodu. Instanca je statina 邸to znai da ju garbage collector, koji se brine za i邸enje radne memorije od objekata koji se vi邸e ne koriste, nee uni邸titi. Sa privatnim konstruktorom je postavila pravilo, da ako netko 転eli tu instancu klase mora pozvati metodu u kojoj se provjerava da uvijek postoji samo jedna instanca.
  • 27. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 27 od 36 10. Obrazac Adapter (Adapter pattern) Napravili smo program u dogovoru sa jednim proizvoaem gara転nih vrata koji nam je samo dao suelja preko kojih komuniciramo, tj. 邸aljemo naredbe za otvaranje/zatvaranje vrata itd. Naravno, nakon nekog vremena, uvijek mora doi do nekakve promjene. U ovom sluaju promijenili smo proizvoaa, a on za rad sa njegovim gara転nim vratima nam daje totalno nova suelja, drugaija od pro邸lih. 25. Bez adaptera Bez kori邸tenja oblikovnog obrasca Adapter, trebali bismo proi kroz cijeli na邸 postojei program i izmjeniti kod kako bi radio sa novim sueljima. To zahtjeva puno posla, a i otvara mogunost raznim bugovima. Kako bismo izbjegli pisanje koda u na邸 ve postojei sustav koji provjereno radi, napisati emo samo adapter klasu i uz pomo nje spojiti sustav u cijelinu. 26. Sa adapterom Postojei program se nije promijenio, nova suelja od proizvoaa niti ne mo転emo mjenjati. Napisali smo klasu Adapter koja nam je pomogla natrag spojiti te dvije komponente. Va転no je da adapter slu転i samo tome, delegiranju starih poziva metoda novima i prilagoavanju podataka po potrebi. Na邸 postojei program Nova suelja AdapterNa邸 postojei program Nova suelja
  • 28. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 28 od 36 27. Dijagram Adaptera Iz dijagrama vidimo da klijent jo邸 uvijek samo zna za StaroSucelje i nastavlja ga koristiti kako ga je i koristio. Klasa Adapter je implementirala to staro suelje, ali unutar implementacije te metode ona poziva novu klasu, tj. novo suelje. Klijent niti ne zna da je do邸lo do promjene modela i suelja i koristi sve kako je prije i koristio. 28. Klasa Adapter Klasa Adapter implementira StaroSucelje, ali ima referencu na novu klasu NovaGaraza. U metodama koje je nasljedila od starog suelja prilagoava podatke za novu implementaciju i poziva sve potrebne metode na novoj klasi da bi izvr邸ila 転eljenu akciju.
  • 29. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 29 od 36 29. Simulator Adapter U simulatoru smo napravili instancu klase StaraGaraza koja predstavlja klasu starog proizvoaa, te instancu klase NovaGaraza koju smo dobili od novog proizvoaa. Napravili smo adapter u koji smo poslali novu implementaciju gara転e, ali dobili staru implementaciju suelja. Dalje, pozvali smo metodu otvoriVrata() na starom objektu i istu tu metodu na adapteru. 30. Rezultat Simulatora Adaptera U outputu simulatora mo転emo vidjeti da, iako smo mi pozvali dva puta istu metodu otvoriVrata(), dobili smo dva razliita rezultata zbog toga 邸to je prvi poziv metode bio na starom objektu, a drugi na novom. Oblikovni obrazac Adapter pretvara suelje klase u drugaije suelje, tj. ono suelje koje klijent oekuje i sa kojim zna raditi. Adapter omoguava klasama, koje inae nebi mogle funkcionirati zajedno zbog razliitih suelja, da rade zajedno.
  • 30. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 30 od 36 11. Obrazac Tvornica (Factorypattern) Uz pomo oblikovnog obrasca Tvornica enkapsuliramo cijeli postupak kreiranja nekog objeka i tako dobijemo i邸i i uredniji kod, ali jo邸 bitnije je to 邸to imamo kreaciju objekata na jednom mjestu, pa tako ako ikad doe do promjene kreacije te posebne instance klase, taj kod promijenimo samo na jednom mjestu, a ne po cijelom kodu na邸e aplikacije. 31. Dijagram Tvornica Iz dijagrama vidimo da klijent ne treba znati kako kreirati instancu klase Pizza, tonije ni njenu implementaciju, ve samo ka転e tvornici koju vrstu 転eli i ona se brine da se u suelje instancira potrebna klasa i da se naprave svi potrebni koraci kreiranja objekta. Tvornica ne vraa tonu implementaciju klase ve implementaciju suelja koje ima sve potrebne metode za manipulaciju objektom. Klijent uz minimalno truda ili znanja o koracima koji su potrebni kako bi kreirao tu instancu klase, dobije garantirano dobro kreirani objekt sa jednom linijom koda.
  • 31. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 31 od 36 32. Klasa Tvornica Pizza Klasa PizzaTvornica ima samo jednu metodu napraviPizzu() koja prima parametar ovisno o tome koju pizzu 転elimo kreirati. Na osnovi tog parametra kreira 転eljenu pizzu, a nakon toga odradi dodatne korake koji su potrebni kako bi se pizza dobro napravila. U sluaju da se ikad priprema pizze promijeni, mi trebamo samo ovdje a転urirati kod. Pa tako i ako dodamo novu vrstu pizze ili maknemo staru, ovdje su sve promjene koje su potrebne. Tako smo smanjili dupliciranje koda i mogunost buga. Bolje prakticiranje koda bi bilo da smo jo邸 napravili enum svih vrsta pizze koje mo転emo kreirati umjesto da samo prosljeujemo String, ali za demonstraciju oblikovnog obrasca nije bilo potrebno pa je napravljeno da je 邸to jednostavnije i lak邸e za razumjeti.
  • 32. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 32 od 36 33. Simulator Tvornica U simulatoru prvo prikazujemo kako bi izgledalo kreiranje Pizza instanca klase bez oblikovnog obrasca Tvornica. Kod je repetitivan i ima puno mjesta za napraviti gre邸ku. Ako ikad doe do promjene izrade pizze trebamo na svakom ovom mjestu mjenjati i prilagoavati taj kod, 邸to iziskuje puno vremena i koncentracije. U nastavku su napravljene dvije pizze sa oblikovnim obrascem Tvornica. Nakon potrebne inicijalizacije tvornice, jednostavno pozivamo metodu napraviPizzu() i prosljeujemo 転eljenu vrstu pizze. Kod od nekoliko linija smo sveli na svega jednu i uspje邸no enkapsulirali kreaciju pizza objekata.
  • 33. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 33 od 36 34. Rezultat Simulatora Tvornice U outputu vidimo da su odraeni svi isti koraci kreiranja pizze i u jednom i u drugom sluaju, ali u simulatoru vidimo da se je kod uvelike smanjio, te da je pregledniji, i邸i i najbitnije od svega lagano ga je promijeniti. Kod ovog oblikovnog obrasca je super to 邸to mo転emo imati vi邸e tvornica za jedan objekt, ako on zahtjeva razliite pripreme i postupke inicijalizacije. Oblikovni obrazac Tvornica definira suelje za kreaciju pojedinog objekta, ali omoguava podklasama da odlue koju e klasu instancirati. Takoer nam omoguava laganu izmjenu koda po potrebi, sve kreacije objekata dr転imo na jednom mjestu i s time smo izbacili mogunost krivog kreiranja objekta.
  • 34. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 34 od 36 12. Zakljuak Oblikovni obrasci nisu direktno rije邸enje nekog problema ve su to naini kako 邸to vi邸e smanjiti mogunost gre邸ke, omoguiti laganu nadogradnju ili izmjenu postojeeg programskog koda, enkapsulirati sve zajednike sposobnosti i osobine na jedno mjesto. Oblikovni obrasci su rije邸enja problema u kontekstu, tj. oni su akumulirano znanje o estim problemima u programiranju. U programiranju je repetitivnost i neitki kod znak da bi implementacija i rije邸enje istog problema bilo lak邸e i urednije sa nekim oblikovnim obracem. Oblikovne obrasce je relativno lagano primijeniti, ali programer treba biti sposoban uoiti obrazac tamo gdje on prirodno lije転e. Takoer treba je bitno i vrijeme kada se uoi potreba za nekim oblikovnim obrascem. Naje邸e se uoi potreba kada se ve napravi lo邸a implementacija, 邸to ne znai da je kasno, ali ote転ava uvoenje specifinog oblikovnog obrasca. U ovom seminaru su svi oblikovni obrasci prikazani kroz programski jezik Java, zato 邸to je tako kod itljiv i lako razumljiv, ali oni su primjenijivi na gotovo sve objektno orijentirane jezike.
  • 35. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 35 od 36 13. Reference 1 https://www.fer.unizg.hr/predmet/ooup 2 https://en.wikipedia.org/wiki/Software_design_pattern 3 Head First Design Patterns, O'Reilly, 2004 4 https://sourcemaking.com/design_patterns 5 http://www.tutorialspoint.com/design_pattern/ 6 http://www.oodesign.com/
  • 36. Napredne tehnike programiranja web servisa (.open-source) Seminarski rad Stranica 36 od 36 14. Popis slika Str. Naziv slike 7 Dijagram Strategije 8 Klasa DivljaPatka, Simulator Strategije 9 Rezultat Simulatora Strategije 10 Dijagram Promatraa 11 Simulator Promatraa, Rezultat Simulatora Promatraa 12 Klasa Klijent_1, Klasa Server 14 Dijagram Stanja 15 Klasa ImaNovca 16 Klasa Automat 17 Simulator Stanja, Rezultat Simulatora Stanja 19 Dijagram Naredbe 20 Klasa Upravljac 21 Simulator Naredba 22 Rezultat Simulatora Naredba 23 Klasa Tvornica 24 Simulator bez oblikovnog obrasca Jedini, Rezultat bez oblikovnog obrasca Jedini 25 Klasa JedinaTvornica, Simulator sa oblikovnim obrascem Jedini 26 Rezultat sa oblikovnim obrascem Jedini 27 Bez Adaptera, Sa adapterom 28 Dijagram Adaptera, Klasa Adapter 29 Simulator Adapter, Rezultat Simulatora Adapter 30 Dijagram Tvornica 31 Klasa TvornicaPizza 32 Simulator Tvornica 33 Rezultat Simulatora Tvornica