DRŽAVNI UNIVERZITET U NOVOM PAZARU
DEPARTMAN ZA TEHNIČKE NAUKE RAČUNARSKA TEHNIKA PROJEKAT IZ PREDMETA OBJEKTNO PROGRAMIRANJE
Student: Adel Zeo!"#$ %&'%(()(&
Mentor: Pro*+dr Br,t"-l,! M"r"# No!" P,.,r$ /ul &%(0+
Sadržaj 1. Uvod............................................................................................2 2. Osnove Osnove o paterni paternima... ma......... ............ ............. ............. ............. ........................................2 .................................2 2.1 Svrha Svrha paterna paterna?..... ?........... ............ ............ ............ .................. ..........................................2 ..............................2 2.2 Šta je patern? patern?...... ............ ............ ............. ............. ............ .................................. .................................... ........2 2 2.3 Prednosti Prednosti korišćenja korišćenja dizajn paterna...... paterna............. .............. .............. ............... ............ .....3 .3 2.4 Opšti Opšti obik obik paterna..... paterna........... ............ ............ ......................... ..........................................! .......................! 3. "ok#menta$ija projekta...............................................................! 4. %asi&ka$ija i ista........................................................................' 4.1 Uzor$i kreiranja....................................................................... kreiranja....................................................................... ( 4.2 Uzor$i str#kt#re............................................. str#kt#re..................................................... ............... .............. .......... ...( ( 4.3 Uzor$i Uzor$i ponašanj ponašanja.... a.......... ............. ............. ............ ....................................... ....................................... ......) ) !. Probem.......................................................................................* '. Unikat..........................................................................................* +ešenje probema +ešenje probema , kod................................................ kod....................................................... .............. ....... 11 (. "ekorat "ekorater... er......... ............ ............ ............ ............ ............ ........................... ...........................................13 ......................13 +ešenje probema - dijaram.......................................................1( +ez#tat +ez#tat izvršavanja prorama.....................................................1( prorama..................................................... 1( +ešenje probema , kod...............................................................1) ). Strateija...................................................................................22 +ešenje probema - dijaram/......................................................24 +ez#tat +ez#tat izvršavanja prorama.....................................................2! prorama..................................................... 2! +ešenje +eš enje probema probema , kod................................................ kod....................................................... .............. ....... 2! *. 0akj#ak...................................................................................31
Sadržaj 1. Uvod............................................................................................2 2. Osnove Osnove o paterni paternima... ma......... ............ ............. ............. ............. ........................................2 .................................2 2.1 Svrha Svrha paterna paterna?..... ?........... ............ ............ ............ .................. ..........................................2 ..............................2 2.2 Šta je patern? patern?...... ............ ............ ............. ............. ............ .................................. .................................... ........2 2 2.3 Prednosti Prednosti korišćenja korišćenja dizajn paterna...... paterna............. .............. .............. ............... ............ .....3 .3 2.4 Opšti Opšti obik obik paterna..... paterna........... ............ ............ ......................... ..........................................! .......................! 3. "ok#menta$ija projekta...............................................................! 4. %asi&ka$ija i ista........................................................................' 4.1 Uzor$i kreiranja....................................................................... kreiranja....................................................................... ( 4.2 Uzor$i str#kt#re............................................. str#kt#re..................................................... ............... .............. .......... ...( ( 4.3 Uzor$i Uzor$i ponašanj ponašanja.... a.......... ............. ............. ............ ....................................... ....................................... ......) ) !. Probem.......................................................................................* '. Unikat..........................................................................................* +ešenje probema +ešenje probema , kod................................................ kod....................................................... .............. ....... 11 (. "ekorat "ekorater... er......... ............ ............ ............ ............ ............ ........................... ...........................................13 ......................13 +ešenje probema - dijaram.......................................................1( +ez#tat +ez#tat izvršavanja prorama.....................................................1( prorama..................................................... 1( +ešenje probema , kod...............................................................1) ). Strateija...................................................................................22 +ešenje probema - dijaram/......................................................24 +ez#tat +ez#tat izvršavanja prorama.....................................................2! prorama..................................................... 2! +ešenje +eš enje probema probema , kod................................................ kod....................................................... .............. ....... 2! *. 0akj#ak...................................................................................31
(+U!od Dizajniranje objektno-orijentisanog softvara je kompleksan i naporan proces, dok je dizajniranje reupotrebljivog objektno-orijentisanog objektno-orijentisanog softvera, to još i više. Potrebno je prepoznati odgovarajuće objekte, grupisati ih u klase sa odgovarajućom granularnošću, definisati interfejse klasa kao i klasnu hijararhiju i uspostaviti osnovne relacije medju klasama. Dizajn budućeg softvera bi trebalo da bude specifičan za sam problem kojim se bavi, ali i dovoljno uopšten kako bi se uklopio u buduće probleme i zahteve. !ivotnom ciklusu softvera, koliko god je to moguće, !elimo da izbegnemo potrebu za redizajniranjem temelja arhitekture sistema, pogotovo u fazama odr!avanja softvera. softvera. koliko to nije moguće, potrebno je da intervencije nad osnovom arhitekture, barem svedemo na minimum, iz razloga što su takve intervencije skupe i nezahvalne. skladu sa ovim postulatima, jako je bitno da od samog početka sistem postavimo tako da bude lako proširiv. Pravilan i efikasan način za postizanje ovog cilja nalazi se u korišćenju objektnoorjentisanih dizajn paterna, kako pojedinačno tako i u sekvencama.
&+ O-no!e o 1,tern"2, 1,tern"2, &+( S!r3, 1,tern,4 Paterni odnosno uzori imaju cilj da nam pomognu u odr!avanju i nadogradnji softverskih sistema.
&+& 5t, /e 1,tern4 1,tern4 "ešenje nekog problema, u nekom kontekstu, koje se mo!e ponovi iskoristiti za rešavanje nekih novih problema. #z toga sledi da u definisanju paterna učestvuju tri elementa$ • • •
Problem Rešenje Kontekst
Paterni, odnosno uzori projektovanja su "-u-t!, u projektovanju objektno orijentisanih softvera. %edno od osnovnih svojstava paterna jeste njegova mogućnost da se mo!e primeniti u rešavanju različitih problema.
&o su gotova rešenja koja se primenjuju u projektovanju softvera. ' ni predstavljaju opise komunikacija izme(u objekata,klasa, koji su prilago(eni da reše generalni problem u posebnom kontekstu. )ada se desi neki problem i na(e nejgovo rešenje, potrebno je ulo!iti još dodatnog napora i vremena i od specifičnog rešenja napraviti generičko rešenje koje se mo!e primeniti na različite probleme koji se dešavaju u !ivotu. Paterni poma!u u imenovanju i opisu generičkih rešenja koja se mogu primeniti u različitim problemskim situacijama. Pored toga, paterni identifikuju klase i pojavljivanja, njihove uloge i saradnju i raspodelu odgovornosti. *ajbolji način da koristimo softverske paterne jeste da se što bolje upoznamo sa njima, da počnemo da prepoznajemo mesta u našim aplikacijama gde mo!emo da ih upotrebimo. mesto da se mučimo ili kopiramo kod , uz pomoć paterna mi kopiramo tu(a iskustva. +a uspešno razmatranje i rešavanje bilo kakvog problema, neophodno je prvo razumeti njegovu suštinu, pa tek onda preći na projektovanje i implementaciju rešenja.ko se !eli fleksibilnost i mogućnost dinamičke izmene funkcionalnosti programa, paterni su idealni, ali oni pak povećavaju slo!enost sistema. vaki patern ima: ime, problem, rešenje i posledice. Ime paterna se koristi da bi se u nekoliko reči opisao problem, njegova rešenja i njegove
posledice. Problem opisuje situaciju u kojoj koristimo patern. 'pisuje se problem i njegov kontekst. Rešenje opisuje elemente koji čine dizajn, njihove odnose, raspodelu odgovornosti kao i
pravila saradnje. 'no ne opisuje odre(en konkretan projekat ili implementaciju, pošto je patern šablon koji se mo!e primeniti u mnogim različitim situacijama. Dakle, patern daje apstraktan opis problema projektovanja kao i smernice kako se on rešava opštim ure(enjem elemenata. Posledice su rezultati i ocene primene uzorka koje su bitne za procenu alternativa i za
razumevanje gubitaka i dobitaka od primene uzorka.
&+6 Predno-t" or"7#en/, d".,/n 1,tern, #deja za pisanje ovog teksta potekla je iz !elje da se programerima predoče prednosti korišćenja dizajn paterna, kao i da se motivišu da počnu da uče i koristite dizajn paterne, ukoliko to već ne čine. *avešćemo neke od ovih prednosti korišćenja dizajn paterna$ )valitetnije postavljanje temelja budućem sistemu i predvi(anje u kojim delovima će se softver kojeg programiramo najverovatnije menjati kroz svoji zivotni cikljus počev od preuzivanja zahteva, projektovanja, kodiranja i testiranja pa sve do procesa odr!avanja/.
)valitetnije postavljanje temelja budućem sistemu i predvi(anje u kojim delovima će se softver kojeg programiramo najverovatnije menjati kroz svoji zivotni cikljus počev od preuzivanja zahteva, projektovanja, kodiranja i testiranja pa sve do procesa odr!avanja/. 'vo je mo!da i najbitnija prednost korišćenja dizajn paterna. ko programiramo na dovoljno apstraktnom nivou, ne mo!e nam se desiti hardkodiranje u ugao iz koga je, pri pojavi novih zahteva za promenom platforme, operativnog sistema i slično, skoro nemoguće izaći. 'vakvi problemi su relativno česta pojava pa se treba na vreme zaštititi, a zaštititi se mo!e kroz inicijalno postavljanje arhitekture sistema, tako da kada nastanu, svaku od navedinih promena u zahtevima mo!emo implementirati u roku od nekoliko nedelja. +ajednički vokabular sa ostalim kolegama iz branše koji doprinosi lakšem razumevanju i komunikaciji u timu. )ada se komunicira na nivou paterna, ne komunicira se samo o paternu i njegovom imenu, već o suštini koju to ime implicitno podrazumeva i nizu karakteristika i ograničenja koji odre(eni dizajn patern donosi. 'vo, sa svoje strane znači i mogućnost da se više vremena provode baveći se problemom i arhitekturom sistema na višem nivou paterna, nego na ni!em nivou objekata i klasa. Paterni nam omogućavaju da ka!emo više kada ustvari govorimo manje. Poznavanje ovog specifičnog, zajedničkog vokabulara doprinosi ubrzanju rada i efikasnosti članova tima, kao i boljem i preciznijem izra!avanju i razumevanju me(u softver developerima. 0akše uklapanje u timove koji već uveliko rade na nekom projektu, jer će se takve situacije veoma često dešavati u radnom veku svakog developera. Paterni pru!aju mogućnost da se prepozna arhitektura u već postojećem sistemu. #sto tako omogućavaju i refaktorisanje bad small -ovakod koji je loše napisan, a koji treba proširiti/. Pouzdanost rešenja 1 još jedna dobra strana primene dizajn paterna je i to što su već mnogo puta testirani od strane drugih developera i svakako donose neku vrstu sigurnosti da je rešenje optimalno za odre(en domen primene. *e treba gubiti vremena i ponovo rešavati već rešene probleme. *aravno, postoje i loše strane korišćenja dizajn paterna, a va!no je i izbegavati preterivanja u njihovom korišćenju. Preterivanje u korišćenju paterna mo!e u odre(enim situacijama dovesti do nepotrebnih uslo!njavanja. Postoje situacije u kojima paterni čine više štete nego što doprinose u rešavanju problema. 'vo su takozvani antipaterni, rešenja koja na prvi pogled deluju zadovoljavajuće ali to nisu. ntipaterni su najčešće, pored paterna obra(eni u knjigama koje se bave ovom tematikom. em toga, paterni često rezultiraju višeslojnim aplikacijama koje pored dodatnih klasa i kompleksnosti uvode i dodatnu neefikasnost u pogledu performansi.
2
&+8O17t" o9l" 1,tern, truktura koja omogućava da softverski s3stem bude odr!iv, i koja postoji kod 45 od 46 7'87ang 'f 8our/ paterna projektovanja, je ključni mehanizam ili svojstvo paterna projektovanja i ona omogućava lako odr!avanje programa, njegovu nadogradnju i prilago(avanje korisničkim zahtevima.
)lijent nije vezan za konkretni server, već se uvodi apstraktni server. *eodr!iva struktura se prevodi u odr!ivu. )lijent je vezan za apstraktni server, iz koga su nasle(ivanjem, odnosno implementacijom, izvedeni konkretni server. pstraktni server mo!e biti apstraktna klasaabstract class/ ili interfejsinterface/. )lijent se u vreme kompajliranja vezuje za apstraktni server, a tek u vreme izvršavanja zna koji konkretni server će da realizuje njegov zahtev. pravo ovo kasno povezivanje late binding/ u vreme izvršavanja programa, a ne u vreme kompajliranja, daje samom programu fleksibilnost, da jedan klijentski zahtev mo!e biti realizovan na različite načine, preko različitih konkretnih server. Dodavanje novog konkretnog server ne zahteva promenu klijenta, što je još jedna velika prednost ove strukture.
6+ Dou2ent,"/, 1ro/et, Dokumentacija projektnog uzorka opisuje kontekst u kome se uzorak koristi, problematiku koje uzorak treba da reši i predlo!eno rešenje. *e postoji jedan standardni format za dokumentovanje projektnih uzoraka. 9taviše, postoji dosta različitih formata koje su koristili različiti autori uzoraka. #pak, prema :artinu 8auleru, neke forme za opisivanje projektnih uzoraka su postale poznatije od drugih, a samim tim i postale osnova za opisivanje novih projektnih uzoraka. %edan od češće korišćenih formata dokumentacije je onaj koji su koristili ;rih 7ama i ostali <7ang of 8our=/ pri pisanju knjige
#me uzorka i klasifikacija$ %edinstveno opisno ime uzorka koje slu!i da se on identifikuje. *amera$ 'pis cilja koji stoji iza uzorka i razlozi za njegovo korišćenje. Poznat i kao$ 'stala imena uzorka. :otivacija$ 'pis problema i kontekst gde je uzorak primenljiv. Primenljivost$ ituacije u kojima je uzorak primenljiv? kontekst uzorka. truktura$ 7rafička predstava uzorka. ovu svrhu se mogu koristiti dijagrami klasa i@ili ostali dijagrami. česnici$ pisak klasa i objekata korišćenih u uzorku i njihovih uloga u dizajnu. )olaboracija$ 'pis kako klase i objekti korišćeni u uzorku komuniciraju me(usobno. )onsekvence$ 'pis rezultata i posledica primene uzorka, kao i razumevanje cene i dobiti primene uzorka. #mplementacija$ 'pis implementacije uzorka. Primeri koda$ #lustrativni primer kako se uzorak mo!e upotrebiti u izvornom kodu. Primeri upotreba$ Primeri upotreba uzorka iz stvarnog !ivota. Povezani ili slični uzorci$ 'stali uzorci koji su na neki način u vezi sa ovim uzorkom. Diskusija izme(u ovog i ostalih sličnih uzoraka.
8+ Kl,-"*","/, " l"-t, Paterni su podeljeni u tri grupe$
U.or" ., re"r,n/e o9/e,t, apstrahuju proces instancijalizacije, tj. kreiranja objekata. Daju veliku prilagodljivost u tome šta će biti kreirano, ko će to kreirati, kako i kada će biti kreirano. 'ni poma!u da se izgradi sistem nezavisno od toga kako su objekti kreirani, komponovani ili reprezentovani. Struturn" u.or" opisuju slo!ene strukture me(usobno povezanih klasa i objekata.
A
U.or" 1on,7,n/, opisuju način na koji klase ili objekti sara(uju i raspore(uju odgovornosti. )onkretno, u ovom primeru, biće prikazano 6 paterna, a to su$ ingleton, Decorator i trateg3.
(+Kre,"on" A9-tr,t;,tor< Bu"lder ;,torleton
&+ Struturn" dapter Bridge Composite Decorator 8asade 8l3eight Pro?
6+U.or" 1on,7,n/, =3,"n O* Re-1on-"9"l"t< =o22,nd Med",tor Me2ento O9-er!er St,te Te2 l,te
8+( U.or" re"r,n/, nikat 'bezbe(uje da klasa ima samo jednu instancu i daje globalni pristup toj instanci. Prototip pecificira vrste objekata koji se kreiraju korišćenjem prototipske instance i kreira nove objekte kopiranjem prototipa. 8abrički metod Definiše interfejs za kreiranje objekata, ali ostavlja potklasama da odluče čije objekte kreiraju. zorak dopušta klasi da delegira stvaranje objekta potklasi. pstraktna fabrika 'bezbe(uje interfejs za kreiranje familija povezanih ili zavisnih objekata bez specificiranja konkretnih klasa familije objekata. 7raditelj "azdvaja konstrukciju kompleksnog objekta od njegove reprezentacije tako da isti proces mo!e da kreira različite reporezentacije. 0enja inicijalizacija &aktički odla!e stvaranje objekta, izračunavanje neke vrednosti ili drugi skup proces dok on prvi put ne bude potreban. Pul konekcija #zbegava skupe operacije višestrukog konektovanja i diskonektovanja. Pul objekata #zbegava skupa dohvatanja i otpuštanja resursa ponovo upotrebljavajući objekte koji se više ne koriste.
8+& U.or" -truture )ompozicija )omponuje objekte u strukturu stabla hijerarhija celina-deo/. )ompozicija omogućava klijentima da uniformno tretiraju i individualne objekte i njihove kompozicije. Dekorater Dinamički dodaje mogućnosti nekom objektu. Dekorater predstavlja fleksibilnu alternativu izvo(enju za proširivanje funkcionalnosti. :uva Deljenje malih objekata objekata bez stanja/ da bi se izbegla hiperprodukcija objekata. E
dapter )onvertuje interfejs klase u drugi interfejs koji klijenti očekuju. dapter omogućava rad zajedno klasa koje inače to ne bi mogle zbog različitog interfejsa. 8asada Pru!a jedinstven interfejs skupu različitih interfejsa nekog podsistema. 8asada definiše interfejs višeg nivoa da bi se podsistem lakše koristio. Proksi "ealizuje zamenu surogat/ drugog objekta koji kontroliše pristup originalnom objektu. :ost "azdvaja apstrakciju od njene implementacije da bi se mogle nezavisno menjati.
8+6 U.or" 1on,7,n/, Posmatrač Definiše zavisnost F$* izme(u objekata, takvu da kada jedan objekat promeni stanje svi zavisni objekti budu obavešteni i automatski se a!uriraju. #terator 'bezbe(uje sekvencijalni pristup elementima nekog agregatnog objekta bez eksponiranja unutrašnje strukture tog agregata. trategija Definiše familiju algoritama, enkapsulirajući svaki i čini ih me(usobno zamenjivim. trategija omogućava jednostavnu promena algoritma u vreme izvršenja. 9ablonski metod Definiše kostur nekog operacionog algoritma, delegirajući pojedine korake potklasama. 9ablonski metod omogućava potklasama da redefinišu odre(ene korake algoritma bez izmene njegove strukture. tanje 'mogućava objektu da menja svoje ponašanje kada se menja njegovo unutrašnje stanje. #zgleda kada da objekat menja svoju klasu. Podsetnik Bez narušavanja enkapsulacije snima i eksternalizuje stanje nekog objekat, tako da omogući da se objekat kasnije mo!e vratiti u dato stanje. Posrednik Definiše objekat koji enkapsulira kako skup objekata interaguje. Posrednik omogućava slabo sprezanje objekata što posti!e čuvanjem objekata koji se me(usobno referišu, a to dozvoljava da im se interakcija menja nezavisno. )omanda ;nkapsulira zahtev u jedan objekat, omogućavajući da se klijenti parametrizuju različitim zahtevima, da se zahtevi isporučuju kroz red čekanja, da se pravi dnevnik zahteva i da se efekti izvršenog zahteva ponište. 0anac odgovornosti #zbegava neposredno vezivanje pošiljaoca zahteva sa primaocem zahteva, dajući šansu većem broju objekata da obrade zahtev. 0anac odgovornosti povezuje objekte primaoce zahteva u lanac i prosle(uje zahtev niz lanac dok ga neki objekat ne obradi. Da *e Posetilac "eprezentuje jednu operaciju koju treba primeniti na elemente jedne objektne strukture. Posetilac omogućava definisanje nove operacije bez izmene klasa elemenata nad kojim se izvršava. #nterpreter +a dati jezik definiše reprezentaciju njegove gramatike, kao i interpeter koji koristi tu reprezentaciju da interpretira iskaze jezika.
G
0+ Pro9le2 &emu na koju sam zasnovao razvoj i rešavanje problema jeste automobilska industrija, tačnije kompanija udi. *aime, kao i svaka kompanija, i udi ima svoje razne modele koje prezentuje kupcima, pored onog osnovnog, fabričkog modela. zavisnosti od !elje kupca, slu!ba kompanije formira samu ponudu o kojoj kupac kasnije razmišlja i odlučuje da li će i koji model odabrati. ovom slučaju, udi prezentuje dva modela, sportski tip svog fabričkog modela kao i model sa mat bojom farbom/. *aravno, sve je ovo nadogradnja na sami fabrički model, što znači da će se i cena povećati. Paterni koji su zadati, a koristiću ih radi rešavanja ovog problema su$ • • •
nikat engl. ingleton/ Dekorator Decorator/ trategija trateg3/
@+ Un",t #me i klasifikacija$ 1 nikat Singleton/ 1 objektni uzorak kreiranja *amena$ 1 obezbe(uje da klasa ima samo jedan objekat i daje globalni pristup tom objektu :otivacija$ 1 za neke klase je va!no obezbediti da imaju samo po jedan objekat 1 na primer, u sistemu treba da postoji samo jedan dispečer štampe spooler / 1 globalna promenljiva obezbe(uje da je objekat pristupačan, ali ne brani više objekta 1 bolje rešenje je da klasa sama bude odgovorna za jedinstvenost njenog objekta Primenljivost$ 1 nikat uzorak treba koristiti kada$ H mora postojati tačno jedan objekat klase i ona mora biti pristupačna klijentima preko svima poznate tačke pristupa I
H
klasa treba da bude proširiva izvo(enjem, a da klijenti mogu da koriste objekat izvedene klase bez potrebe da modifikuju svoj kod
truktura$
česnici$ 1 nikat H
H
definiše operaciju primerak/ kao operaciju klase statički metod/ koja daje klijentima pristup do jedinstvenog objekta mo!e biti odgovorna za kreiranje vlastitog jedinstv enog objekta
aradnja$ 1 klijenti pristupaju objektu klase nikat isključivo kroz njenu operaciju primerak/ H Posledice$ dobre strane 1 kontrolisani pristup do jedinog objekta H pošto klasa kapsulira jedini objekat, ona mo!e imat i striktnu kontrolu nad tim kako i kada klijenti pristupaju objektu 1 rasterećenje prostora imena H uzorak Unikat je bolji koncept od globalne promenljive, jer izbegava opterećivanje prostora imena globalnom promenljivom koja čuva jedini objekat 1 dozvoljeno doterivanje operacija i reprezentacije H iz klase nikat se mo!e izvoditi H aplikaciju je lako konfigurisati objektom izvedene klase, čak i u vreme izvršenja 1 dozvoljava kontrolisano povećanje broja objekata H uzorak omogućava projektantu da se po maloj ceni predomisli i poveća broj dozvoljenih objekata 1 fleksibilnost u odnosu na operacije klase H drugi način za realizaciju funkcionalnosti Unikata je uslu!na utility / klasa H sa uslu!nom klasom je komplikovano promeniti broj o bjekata F5
statičke funkcije na CJJ nisu virtuelne, pa potklase ne mogu da ih polimorfno redefinišu Poznate primene$ 1 u aplikacijama sa jednim dokumentom single-document / klasa Dokument je unikat 1 u Smalltalk jeziku svaka metaklasa klasa čiji su primerci klase/ ima samo jedan objekat Povezani uzorci$ 1 mnogi uzorci koriste Unikat Apstraktna fabrika, raditelj , Prototip, !asada/ *otacija$
Re7en/e 1ro9le2, od KincludeLiostreamM KincludeLstring.hM Kinclude Lstdio.hM using namespace std? class udiN public$ int Omodeli? virtual void ispisi/5? FF
static udiO instanca? static udiO instanciranjecharO tip/? udi/N Q Q? class udi:at$public udiN public$ udi:at/N modeline intR22S? Q void ispisi/N coutLLTudi udi:at ima 22.TLLendl? Q Q? class udiport$public udiN public$ udiport/N modeline intRA4S? Q void ispisi/N coutLLTudi udiport ima A4 modela.TLLendl? Q Q? udiO udi$$instanca*00? udiO udi$$instanciranjecharO tip/N ifinstanca*00/N ifstrcmptip,TaudisportT/*00/ instancane udiport? else F4
instancane udi:at? Q return instanca? Q class :odeliN public$ void predstavi:odelechar Otip/N udiO fudi$$instanciranjetip/? f-Mispisi/? Q Q? int main/N :odeli k? k.predstavi:odeleTudiportT/? k.predstavi:odeleTaudimatT/? Q
+ Deor,ter H
#me i klasifikacija$ 1 Dekorater engl. "ecorator / 1 objektni uzorak strukture
H
*amena$ 1 dinamički dodaje odgovornosti mogućnosti/ nekom objektu 1 predstavlja fleksibilnu alternativu izvo(enju za proširivanje funkcionalnosti
H
Druga imena$ 1 Dopuna, 'motač engl. #rapper /
H
:otivacija$ 1 alati za 7# podr!avaju dodavanje =ukrasaU na razne komponente H klizači, okviri sa raznim efektima,V 1 jedan način za dodavanje mogućnosti 1 nasle(ivanje sa proširivanjem H nasle(ivanje je nefleksibilno, jer bi se ukrasi birali statički F6
-
klijent ne mo!e da bira kada da se iscrtava okvir, na primer H opasnost od eksplozije broja izvedenih klasa kada se kombinuju ukrasi 1 fleksibilniji pristup je da se komponenta obuhvati drugom komponentom H komponenta koja obuhvata osnovnu dodaje ukras okvir, klizače/ H proširenja mogu biti specifična stanja ili ponašanja H odgovornosti se dodaju pojedinom objektu, a ne celoj klasi 1 komponenta koja obuhvata osnovnu se naziva H dekoraterom, omotačem ili dopunom 1 dekorater prosle(uje zahteve klijenta obuhvaćenoj komponenti i mo!e da obavi dodatne akcije H kao što je crtanje okvira ili dodavanje klizača za pomeranje 1 dekorater nasle(uje interfejs komponente koju ukrašava 1 prisustvo dekoratera je transparentno za klijente komponente H transparentnost omogućava neograničen broj dodataka uvedenih posebnim dekoraterima 1 primer$ H &ekst)omponenta prikazuje tekst u prozoru i nema klizače za W@X pomeranje sadr!aja, ni okvir H ako su potrebni klizači - dodajemo objekat klase Dopuna)lizacem koji ih dodaje H ako se !eli i okvir - dodajemo i objekat klase Dopuna'kvirom koji crta okvir H sledeći dijagram prikazuje objektnu kompoziciju i interakciju$ H 1 sledeći dijagram prikazuje opisanu klasnu strukturu$
H
Primenljivost$ 1 kada je potrebno dinamički dodavati odgovornosti objektima na transparentan način 1 kada proširenje izvo(enjem nije praktično kada je moguć veliki broj nezavisnih proširenja, pri čemu se ona mogu kombinovati, što vodi eksploziji broja klasa/ F2
H
:0 notacija$
H
aradnja$ 1 objekat )onkretnaDopunaY H prosle(uje zahteve obuhvaćenom objektu klase )omponenta/ H izvršava dodatne operacije pre i@ili posle prosle(ivanja zahteva H H truktura$
H H
česnici$ 1 )omponenta klasa Xizuelna)omponenta/ H definiše interfejs za objekte kojima se mogu dinamički dodavati odgovornosti 1 ubjekat klasa &ekst)omponenta/ H definiše objekat kojem se dodaju odgovornosti 1 Dopuna klasa Dopuna/ H odr!ava referencu na objekat klase )omponenta i nasle(uje interfejs klase )omponenta 1 )onkretnaDopunaY klase Dopuna)lizacem, Dopuna'kvirom / F>
H H H
dodaje odgovornost objektu klase )omponenta
Posledice$ 1 prednosti H veća fleksibilnost od statičkog nasle(ivanja - dinamičko dodavanje odgovornosti H izbegavanje bogato parametrizovanih klasa visoko u hijerarhiji H izbegavanje eksplozije potklasa koje kombinuju ukrase 1 mane H identitet dekoratera i dekorisanog objekta su različiti H objekti se ne razlikuju po klasi već po načinu povezivanja - potencijalan problem kod razumevanja i odr!avanja s istema H nasle(eni atributi komponente, ako postoje duplikat/ - dobro je da apstraktna komponenta nema atribute
H H
Povezani uzorci$ 1 "ekorater zadr!ava interfejs, a Adapter menja interfejs 1 )ompozicija ima sličnu strukturu H "ekorater je po strukturi degenerisana Kompo$icija Sastav , Sklop/ - objekat Dopuna sadr!i samo jednu komponentu, a objekat )ompozicija više H po nameni je "ekorater sasvim različit, jer dodaje odgovornosti i nije namenjen grupisanju 1 "ekorater i Strategija su alternative za promenu ponašanja objekta H "ekorater menja spoljašnjost objekta, a Strategija unutrašnjost.
FA
Re7en/e 1ro9le2, ' d"/,>r,2
Re.ult,t ".!r7,!,n/, 1ro>r,2,
FE
Re7en/e 1ro9le2, od C"nlude -tr"n> C"nlude "o-tre,2 u-"n> n,2e-1,e -tdF l,-- Auto
1roteted: -tr"n> -trF
1u9l": Auto !"rtu,l -tr"n> O1"- return -trF !"rtu,l dou9le en, L %F !"rtu,l Auto out nH!,l,nF
F l,-- Deor,tor : 1u9l" Auto
1u9l": FG
!"rtu,l -tr"n> O1"- L %F !"rtu,l Deor,tor out ' ' ' ' ' ' ' ' 'F F l,-- ;,9r""Model: 1u9l" Auto
1u9l": ;,9r""Model -tr L Aud"F !"rtu,l dou9le en, return 6(%%%F
;,9r""Model
out;,9r""ModelnF
F l,-- Aud"S1ort-": 1u9l" Deor,tor Auto Q9F
1u9l": Aud"S1ort-"Auto Q9 FI
9 L 9F -tr"n> O1"- return 9'O1"- 2odel SPORTF dou9le en, return 6 9'en,F
Aud"S1ort-" out nI.9or /e !,-nF
F l,-- Aud"M,t: 1u9l" Deor,tor Auto Q9F
1u9l": Aud"M,tAuto Q9 9 L 9F -tr"n> O1"- return 9'O1"- 2odel MATF 45
dou9le en, return (@%% 9'en,F F l,-- AutoDeor,tor
1u9l": !"rtu,l !o"d 1red-t,!"Ponudu Auto Q9 L ne ;,9r""ModelF
out ;,9r"" 2odel 2,re 9'O1"- o-t,: 9'en, nF 9 L ne Aud"M,t9F out 9'O1"- o-t, dod,tn"3 (@%%$ uu1no: 9'en, nF 9 L ne ;,9r""ModelF 9 L ne Aud"S1ort-"9F out 9'O1"- o-t, dod,tn"3 6$ uu1no: 9'en, nF delete b? Q Q? int main/ N utoDekorator b? 4F
b.predstaviPonudu/? return 5?
Q
+ Str,te>"/, #me i klasifikacija$ 1trategija engl. trateg3/ 1 objektni uzorak ponašanja *amena$ 1definiše familiju algoritama, kapsulirajući svaki, i čini ih me(usobno zamenjivim 1omogućava jednostavnu promenu algoritma u vreme izvršenja Drugo ime$ 1Politika Polic3/ :otivacija$ 1postoji više algoritama za prelom teksta u linije 1ugra(ivanje tih algoritama u klase koje ih zahtevaju nije dobro iz više razloga$klase postaju kompleksnije i te!e za odr!avanjerazličiti algoritmi su odgovarajući u razli čitim trenucima, a teško ih je menjatiteško je dodati novi algoritam i varirati postojeći 1ni izvo(enje iz klase teksta nije dobro rešenje jer je statičko 1alternativa - kapsulirani algoritam u posebnu klasu koja se naziva strategija
1klasa &ekstje odgovorna za prikaz i izmenu teksta 1prilikom prikaza treba a!urirati prelom izmenjenog teksta 1strategije preloma nisu implementirane u klasi &ekst#mplementirane su u potklasama Prelom 1klasa &ekstsadr!i referencu na objekat tipa Prelom 1kada se &ekst izmeni, da bi se prikazao, treba da se reformatira objekat klase &ekst prosle(uje tu odgovornost objektu klase Prelom 1klijent klase &ekstspecificira objekat Prelominstalirajući ga u &ekst 44
Primenljivost$ 1kada bi se više srodnih klasa razlikovalo samo po nekom ponašanjuuzorak omogućava konfigurisanje jedne klase jednim od više ponašanja 1kada su potrebne različite varijante nekog algoritma 1kada algoritam koristi podatke o kojima klijenti netreba ništa da znaju izbegava se eksponiranje kompleksnih struktura podataka 1te strukture su specifične za algoritam, klijent ne treba da ih bude svesanpotrebno je kapsuliranje algoritma i strukture poda taka 1kada klasa konteksta definiše više ponašanja koja se pojavljuju kao grane uslovne naredbe u raznim operacijamagrane uslovne naredbe treba kapsulirati u odgovarajuće strategijejedna strategija u svojim operacijama izvršava samoodgovarajuću granu truktura$
česnici$ 1trategijaklasa Prelom/deklariše zajednički interfejs za sve podr!ane algoritme 1)onkretnatrategijaYklase %ednostavanPrelom, &eYPrelom/implementira konkretan algoritam tako da odgovara interfejsu klase trategija 1)onktekst klasa &ekst/konfigurisan je objektom)onkretnatrategijaYposeduje referencu na objekat tipa trategijamo!e da pru!i interfejs koji omogućava objektu strategije da pristupi njegovim podacima aradnja$ 1interaguju)onteksti)onkretnatrategijaY 1)ontekstmo!e da pošalje sve podatke koje zahteva algoritam pri pozivu objekta trategijareferencu na sebe i tako omogući povratni poziv callback/ 1)ontekstprosle(uje zahteve svojih klijenata svom objektutrategijaklijenti obično kreiraju i prosle(uju objekte )onkretnatrategijaYobjektu)ontekstkasnije klijenti interaguju samo sa objektom )ontekst.
46
:0 notacija$
Posledice$ 1familije srodnih algoritama definisanih kao hijerarhija klasa trategija 1fleksibilna alternativa izvo(enju iz klase )ontekstkad bi )ontekst implementirao algoritam 1strategije eliminišu potrebu za uslovnim naredbama u klijentskom kodu 1izbor implementacija klijent bira implementaciju da postigne performanseu vremenu@prostoru 1nedostatak - klijenti moraju biti svesni strategije kojom parametrizuju kontekst 1)ontekst kreira nepotrebne parametre za neke )onkretnatrategijaY 1povećava se broj objekata u aplikaciji zbog objekata)onkretnatrategijaY
Re7en/e 1ro9le2, ' d"/,>r,2:
42
Re.ult,t ".!r7,!,n/, 1ro>r,2,
Re7en/e 1ro9le2, od Kinclude LiostreamM using namespace std? class uto:odel N public$ virtual void model/ 5? Q? @@ :'D;0# class udi:at $ public uto:odel N public$ void model/ N cout LL T:odel$ udi :&T LL endl? Q Q? 4>
class udiport $ public uto:odel N public$ void model/ N cout LL T:odel$ udi P'"&T LL endl? Q Q? @@ D'DC# class utoDodatak N public$ virtual void dodatak/ 5? Q? class :atBoja $ public utoDodatak N public$ void dodatak/ N cout LL TDodatak$ :at bojaT LL endl? Q Q? class portski $ public utoDodatak N public$ 4A
void dodatak/ N cout LL TDodatak$ portskiT LL endl? Q Q? class 'zvucenje $ public utoDodatak N public$ void dodatak/ N cout LL TDodatak$ 'zvucenjeT LL endl? Q Q? @@ C;*; class utoCena N public$ virtual void cena/ 5? Q? class Cenaudi:at $ public utoCena N public$ void cena/ N cout LL TCena$ FFA55T LL endl? Q Q? 4E
class Cenaudiport $ public utoCena N public$ void cena/ N cout LL TCena$ F>655T LL endl? Q Q? @@ &' class uto N public$ uto:odel Oauto:odel? utoDodatak OautoDodatak? utoCena OautoCena? void :odel/ N auto:odel-Mmodel/? Q void Dodatak/ N autoDodatak-Mdodatak/? Q void Cena/ N 4G
autoCena-Mcena/? Q virtual void displa3/ 5? Q? @@ D#:& class udi: $ public uto N public$ udi:/ N auto:odel ne udi:at/? autoDodatak ne :atBoja/? autoCena ne Cenaudi:at/? Q void displa3/ N cout LL TZn----------D#----------T LL endl? Q Q? @@ D#P'"& class udi $ public uto N public$ udi/ 4I
N auto:odel ne udiport/? autoDodatak ne portski/? autoCena ne Cenaudiport/? Q void displa3/ N cout LL TZn----------D#----------T LL endl? Q Q? int main/ N uto Oa ne udi:/? a-Mdispla3/? a-M:odel/? a-MDodatak/? a-MCena/? cout LL TT LL endl? uto Ob ne udi/? b-Mdispla3/? b-M:odel/? b-MDodatak/? b-MCena/? return 5?
65