The document discusses the flyweight pattern, which uses sharing to efficiently support large numbers of fine-grained objects. An application may use many objects, but most objects' state can be made extrinsic. By removing extrinsic state and replacing groups of objects with relatively few shared objects, storage costs can be reduced. The flyweight pattern defines an interface for flyweights to receive extrinsic state, with concrete flyweights implementing storage for intrinsic state. A flyweight factory manages the shared flyweight objects.
The Flyweight pattern allows for efficient sharing of objects to save space when there are many instances but only a few different types. It is used when an application uses a large number of objects that have common properties. The Flyweight pattern shares these common properties instead of creating new objects, reducing memory usage. Shared objects are stored externally via a FlyweightFactory which creates and manages flyweights. Intrinsic states are stored in flyweights while extrinsic states are stored externally by the client.
Agile Project Management (APM) ili agilno upravljanje projektima je ponavljajui pristup planiranju i voenju projektnih procesa putem funkcionalnog samoorganiziranja multi-funkcionalnih mje邸ovitih timova, poticanjem fleksibilnog i brzog odgovora na uoenu promjenu u proizvodu/usluzi kao i u potrebama klijenata
Projektna dokumentacija za Mob Ellposs, mobilni informacijski sustav za skladi邸no poslovanje. Mob Ellpos je zajedniko rje邸enje tvrtki KORIS d.o.o. i Ellabo d.o.o. te je u svakodnevnoj uporabi u skladi邸nom poslovanju Ellaba. Ova projektna dokumentacija je ogledni primjer kako KORIS d.o.o. "obavlja posao" projektiranja informacijskog sustava radi daljnjega razvoja. Dokumentacija se mo転e smatrati kao jedan od isporuenih dokumenata - "deliverable" - prema TOGAF paradigmi. Po ovoj dokumentaciji razvijeno je mobilno rje邸enje za skladi邸no poslovanje temeljeno na Android aplikaciji, dotnet Core REST web-servisima i MSSQL bazi podataka.
lan Bosnia Agile tima Ned転ad Junuzovi je u prostorijama Networksa odr転ao predavanje na temu ,,Uvod u agilni razvoj proizvoda prema agendi: Osnovni pojmovi, Uvod u Scrum i Adaptiranje razvojnog 転ivotnog ciklusa prema zahtjevima konkretnog projekta. Meetup je organizovan za polaznike trosedminog kursa, u organizacij CGP tima (http://cgp.ba/bs/), u okviru kojeg su studenti imali priliku u CAD alatu dizajnirati, te na 3D printeru realizovati, potpuno funkcionalnu robotsku IoT ruku. ,,CGP design team je tim mladih in転injera ma邸instva, elektrotehnike i programera prvenstveno formiranih radi pru転anja podr邸ke mlaim kolegama. Navedenu pod邸ku CGP tim realizuje organizovanjem strunih obuka sa namjerom preno邸enja steenog iskustva kroz razne projekte.
U Srcu razvijamo, odr転avamo i dajemo podr邸ku za veliki broj sustava, gdje se svaki sastoji od niza servisa i aplikacija, broj aktivnih korisnika ide i preko 150.000 (uglavnom iz akademske zajednice), a ti sustavi rade na raznim platformama (Java, .Net, PHP, ...). Potrebe i 転elje korisnika za doradama, nadogradnjama i pro邸irenjima sustava konstantno rastu kako rastu i sami sustavi. Kako bi i dalje uspje邸no pratili potrebe korisnika smatramo da nam treba Platform as a service (PaaS) kao temelj za daljnji razvoj i odr転avanje na邸ih sustava. U prezentaciji je prezentirano u kojim segmentima rada nam PaaS mo転e pomoi.
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9. Stipe Predanic
油
Predavanje iz Dinamikih web aplikacija, 9. predavanje
Video: https://www.youtube.com/watch?v=NIMP-02mPvM&index=10&list=PLYqeapOP_CtS0kbdbo_GXFgnS81JGAd8L
Tema: Templete i framework (MVC)
Datum snimanja: 5.5.2016
Agile Project Management (APM) ili agilno upravljanje projektima je ponavljajui pristup planiranju i voenju projektnih procesa putem funkcionalnog samoorganiziranja multi-funkcionalnih mje邸ovitih timova, poticanjem fleksibilnog i brzog odgovora na uoenu promjenu u proizvodu/usluzi kao i u potrebama klijenata
Projektna dokumentacija za Mob Ellposs, mobilni informacijski sustav za skladi邸no poslovanje. Mob Ellpos je zajedniko rje邸enje tvrtki KORIS d.o.o. i Ellabo d.o.o. te je u svakodnevnoj uporabi u skladi邸nom poslovanju Ellaba. Ova projektna dokumentacija je ogledni primjer kako KORIS d.o.o. "obavlja posao" projektiranja informacijskog sustava radi daljnjega razvoja. Dokumentacija se mo転e smatrati kao jedan od isporuenih dokumenata - "deliverable" - prema TOGAF paradigmi. Po ovoj dokumentaciji razvijeno je mobilno rje邸enje za skladi邸no poslovanje temeljeno na Android aplikaciji, dotnet Core REST web-servisima i MSSQL bazi podataka.
lan Bosnia Agile tima Ned転ad Junuzovi je u prostorijama Networksa odr転ao predavanje na temu ,,Uvod u agilni razvoj proizvoda prema agendi: Osnovni pojmovi, Uvod u Scrum i Adaptiranje razvojnog 転ivotnog ciklusa prema zahtjevima konkretnog projekta. Meetup je organizovan za polaznike trosedminog kursa, u organizacij CGP tima (http://cgp.ba/bs/), u okviru kojeg su studenti imali priliku u CAD alatu dizajnirati, te na 3D printeru realizovati, potpuno funkcionalnu robotsku IoT ruku. ,,CGP design team je tim mladih in転injera ma邸instva, elektrotehnike i programera prvenstveno formiranih radi pru転anja podr邸ke mlaim kolegama. Navedenu pod邸ku CGP tim realizuje organizovanjem strunih obuka sa namjerom preno邸enja steenog iskustva kroz razne projekte.
U Srcu razvijamo, odr転avamo i dajemo podr邸ku za veliki broj sustava, gdje se svaki sastoji od niza servisa i aplikacija, broj aktivnih korisnika ide i preko 150.000 (uglavnom iz akademske zajednice), a ti sustavi rade na raznim platformama (Java, .Net, PHP, ...). Potrebe i 転elje korisnika za doradama, nadogradnjama i pro邸irenjima sustava konstantno rastu kako rastu i sami sustavi. Kako bi i dalje uspje邸no pratili potrebe korisnika smatramo da nam treba Platform as a service (PaaS) kao temelj za daljnji razvoj i odr転avanje na邸ih sustava. U prezentaciji je prezentirano u kojim segmentima rada nam PaaS mo転e pomoi.
[TVZ raunarstvo] Dinamike web aplikacije, predavanje 9. Stipe Predanic
油
Predavanje iz Dinamikih web aplikacija, 9. predavanje
Video: https://www.youtube.com/watch?v=NIMP-02mPvM&index=10&list=PLYqeapOP_CtS0kbdbo_GXFgnS81JGAd8L
Tema: Templete i framework (MVC)
Datum snimanja: 5.5.2016
Organizacija razvoja u internacionalnom development teamuLuka 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