Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

42
Univerzitet u Beograd Fakultet organizacionih nauka Seminarski rad Primena softverskih paterna na primeru poslastičarnice Profesor: Student: Dr Siniša Vlajid, doc. Tamara Valok br. indeksa 282/05 Asistenti: Dušan Savid Ilija Antovid Miloš Milid Vojislav Stanojevid Beograd, 2009.

Transcript of Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Page 1: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Univerzitet u Beograd

Fakultet organizacionih nauka

Seminarski rad

Primena softverskih paterna na

primeru poslastičarnice

Profesor: Student:

Dr Siniša Vlajid, doc. Tamara Valok

br. indeksa 282/05

Asistenti:

Dušan Savid

Ilija Antovid

Miloš Milid

Vojislav Stanojevid

Beograd, 2009.

Page 2: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Sadržaj

Problem ......................................................................................................................................................... 4

Šta su paterni? .............................................................................................................................................. 5

Paterni korišdeni u primeru poslastičarnice ................................................................................................. 6

1. Builder patern ................................................................................................................................... 6

2. FactoryMethod patern ...................................................................................................................... 8

3. Adapter patern ................................................................................................................................ 10

4. Flyweight patern ............................................................................................................................. 12

5. Chain of responsibility patern ......................................................................................................... 16

6. Observer patern .............................................................................................................................. 18

7. Command patern ............................................................................................................................ 21

Celokupan programski kod ......................................................................................................................... 23

Poslasticarnica ........................................................................................................................................ 23

Menadzer ................................................................................................................................................ 25

Keks ......................................................................................................................................................... 26

KeksPetitBeure ........................................................................................................................................ 26

KeksPlazma ............................................................................................................................................. 26

Preliv ....................................................................................................................................................... 27

PrelivCokolada ........................................................................................................................................ 27

PrelivVanila ............................................................................................................................................. 27

Voce ........................................................................................................................................................ 27

VoceBanana ............................................................................................................................................ 27

VoceJagoda ............................................................................................................................................. 27

VoceBez ................................................................................................................................................... 28

Kuvar ....................................................................................................................................................... 28

KuvarBrzeTorte ....................................................................................................................................... 28

KuvarEgzoticneTorte ............................................................................................................................... 28

KuvarGlavni ............................................................................................................................................. 28

Page 3: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

3

TortaSastojci ........................................................................................................................................... 28

Torta ........................................................................................................................................................ 29

TortaNova ............................................................................................................................................... 29

Adapter ................................................................................................................................................... 30

FlyweightFactory ..................................................................................................................................... 30

FlyWeight ................................................................................................................................................ 31

UnsharedConcreteFlyweight .................................................................................................................. 31

ConcreteFlyweight .................................................................................................................................. 31

Nagrada ................................................................................................................................................... 32

NagradaZaDekoraciju .............................................................................................................................. 32

NagradaZaJednostavnost ........................................................................................................................ 33

NagradaZaNeobicanSpojSastojaka ......................................................................................................... 33

NagradaZaStil .......................................................................................................................................... 33

NagradaZaUkus ....................................................................................................................................... 34

VocnaTortaSKeksom ............................................................................................................................... 34

CokoladnaKeksTorta ............................................................................................................................... 38

Literatura......................................................................................................................................42

Page 4: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

4

Problem

Poslastičarnica “Moj slatkiš”

Poslastičarnica “Moj slatkiš” nudi svojim klijentima dve vrste torti: vodnu tortu s keksom i cokoladnu

keks tortu. Svaka torta u svom sastojku može imati neku vrstu keksa, preliva ili voda. U kuhinji rade

kuvari sa slededim opisom posla: glavni kuvar, kuvar za brze torte i kuvar za egzoticne torte.

Za svaku tortu mogude je prikazati njen recept. Pošto se dešava da jedna torta može imati različite

recepte s istim sastojcima, samo drugacije iskombinovanim, mogude je prikazati sve te recepte, a da se

ne desi redundansa istih sastojaka u različitim receptima (Flyweight patern).

Poslastičarnica se reklamira na dva načina: putem flajera i putem menija koji se nalazi u samoj poslastičarnici. Na flajeru je ispisan naziv svih torti i njihov glavni sastojak, kako bi upravo on privukao klijente. Na meniju su prikazani nazivi svih torti, kao i svi njihovi sastojci, kako bi mušterije lakše odlučile koju tortu da izaberu. U početku poslovanja, na meniju je bilo prikazano samo to, a kasnije se rodila ideja da je u meni pogodno upisati koja torta može da se naruči s nekim dodacima poput rođendanskih svedica u obliku nekih brojeva, zatim ukrasima za svadbenu tortu… (Adapter patern). Ta ideja je sprovedena u delo, pa se torte u meniju mogu prikazati na neki od ova dva načina, tj. na standardni način ili prikaz sa mogudim dodacima. Što se flajera tiče, sama poslastičarska radnja ih niti kreira niti nadgleda kreiranje, sve se vrši u samoj kuhinji (Factory Method patern). Međutim, kad su u pitanju meniji, u poslastičarnici se nadgleda njihovo ispisivanje (Builder patern).

Poslastičarnica učestvuje na raznim takmičenjima sa svojim specijalitetom-vodnom tortom s keksom, pa

su joj tako pripale neke od slededih nagrada: nagrada za stil, dekoraciju, neobičan spoj sastojaka,

jednostavnost, ukus… (Chain of responsibility patern). Za skupljanje podataka o osvojenim nagradama

zadužen je menadžer poslastičarnice, a nakon prikupljanja podataka, poslastičarnica objavljuje sve

rezultate takmičenja (Observer patern).

Za svako takmičenje na kome se prezentuje vodna torta s keksom, menadžer određuje kuvara za

egzoticne torte da bude predstavnik. Tako se iz poslastičarnice uvek šalje kuvar za egzoticne torte da

prezentuje specijalitet (Command patern).

U ovom primeru je primenjeno sedam različitih paterna:

1. Builder patern

2. Factory method patern

3. Adapter patern

4. Flyweight patern

5. Chain of responsibility patern

6. Observer patern

7. Command patern

Page 5: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

5

Šta su paterni?

Paterni tj. uzori su gotova rešenja koja se primenjuju u projektovanju softvera. „Svaki uzorak opisuje

problem koji se stalno ponavlja u našem okruženju i zatim opisuje suštinu rešenja problema tako da se

to rešenje može upotrebiti milion puta, a da se dva puta ne ponovi na isti način.“(Cristopher Alexander)

Ime uzorka se koristi da bi se u nekoliko reči opisao problem, njegova rešenja i njegove posledice.

Problem je opis situacije u kojoj se uzorak koristi. Opisuje se problem i njegov kontekst. Mogud je i opis

specifičnih problema. Problem može da opisuje strukture klasa ili objekata čije osobine nagoveštavaju

kruto projektovanje. Ponekad problem sadrži spisak uslova potrebnih da bi se primenio taj uzorak.

Rešenje opisuje elemente koji čine dizajn, njihove odnose, odgovornosti i saradnju. Ono ne opisuje

određen konkretan projekat ili implementaciju, pošto je uzorak kao šablon koji se može primeniti u

mnogim različitim situacijama. Dakle, uzorak daje apstraktan opis problema projektovanja i 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. U softveru se posledice

često mere prostorom i vremenom. Pošto je ponovna upotrebljivost u objektno-orijentisanom

projektovanju često važan faktor, posledice uzorka obuhvataju njegov uticaj na fleksibilnost sistema, na

njegovu proširivost ili prenosivost.

Zajednička crta svih uzora korišdenih u primeru koji je opisan u ovom radu je nasleđivanje. Nasleđivanje

klase je u osnovi samo mehanizam za proširivanje funkcionalnosti aplikacije ponovljenim korišdenjem

funkcionalnosti roditeljskih klasa. N a taj način možete brzo da definišete novu vrstu objekata pomodu

stare. Tako se skoro besplatno dolazi do novih implementacija, nasleđujudi vedinu potrebne

funkcionalnosti od postojedih klasa. Ali to je samo pola priče. Mogudnost da se nasleđivanjem definišu

familije objekata sa identičnim interfejsima, obično nasleđivanjem od apstraktne klase, takođe je

značajno, jer od toga zavisi polimorfizam. Sve klase izvedene iz jedne apstraktne klase imade isti

interfejs, pa potklasa samo dodaje ili nadjačava operacije i ne skriva operacije od roditeljske klase. Ako

se objektima rukuje isključivo na osnovu interfejsa definisanih u apstraktnoj klasi, postižu se dve

prednosti:

Klijenti ne moraju biti svesni tipa objekta koji koriste sve dok se objekti drze interfejsa koji klijenti očekuju.

Klijenti ne moraju biti svesni ni klase kojima se implementiraju objekti. Klijenti znaju samo za apstraktnu klasu kojom je definisan interfejs.

Ovo do te mere smanjuje zavisnost od implementacije među podsistemima da dovodi do slededeg

principa višekratno upotrebljivog objektno orijentisanog projektovanja: programirati prema interfejsu, a

ne prema implementaciji. Dakle, ne deklarisati promenljive kao primerke određene konkretne klase, ved

se obradati samo interfejsu definisanom apstraktnom klasom.

Nasleđivanje klasa ima i mane: ne mogu se menjati implementacije nasleđene od roditeljskih klasa u

vreme izvršavanja, jer se nasleđivanje definiše u vreme prevođenja. Takođe, implementacija potklase

postaje toliko uslovljena implementacijom roditeljske klase da svaka promena implementacije roditelja

primorava potklasu da se promeni.

Page 6: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

6

Paterni korišćeni u primeru poslastičarnice

1. Builder patern

Razdvaja izgradnju složenog objekta od njegove reprezentacije da bi isti proces pravljenja mogao da

proizvede različite reprezentacije.

U primeru poslastičarnice korišden je Builder patern koji je predstavljen slededom slikom koja je

analogna prethodnoj:

Page 7: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

7

Metode koje opisuju Builder patern u ovom primeru su: izaberiKeks(), izaberiVoce() i izaberiPreliv() koje

su ustvari metode BuildPart(), zatim metoda dajOpisTorte() koja je analogna GetResult() metodi i najzad

metoda Construct() koja je u ovom primeru IspisiElementStandardno(Torta t). Ova poslednje spometuta

metoda je upravo ta preko koje poslastičarnica vrši nadgledanje ispisivanja menija upravo zbog svog

tela:

static String IspisiElementStandardno(Torta t){

t.IzaberiKeks();

t.IzaberiPreliv();

t.IzaberiVoce();

return t.DajOpisTorte();

}

Kao što se vidi, kao parametar metode prosleđuje se referenca na interfejs Torta, a ne na konkretnu

klasu neke vrste torte. Međutim, kada se metoda poziva, kao parametar se prosleđuje referenca na

konkretnu klasu tj. ili na VocnaTortaSKeksom ili CokoladnaKeksTorta.

Page 8: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

8

2. FactoryMethod patern

Definiše interfejs za pravljenje objekata, ali prepušta potklasi odluku o klasi primerka. Ovaj patern

dozvoljava klasi da prepusti pravljenje primerka potklasi.

U primeru poslastičarnice korišden je FactoryMethod patern koji je predstavljen slededom slikom koja je

analogna prethodnoj:

Page 9: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

9

Za razliku od prethodnog paterna, ovaj patern sadrži neke “samostalne“ metode, tj. u poslastičarnici se

ne nadgleda izvršenje metode slične onoj u prethodno opisanom paternu. Naime, metoda koja vrši

“sastavljanje“ konkretnih vrsta torti je sada premeštena u same klase tipa Torta. Na taj način

poslastičarnica nema nikakvog uticaja na njih, čak ni ne nadgleda njihovo izvršavanje. To izgleda ovako:

static String PrikaziFlajer(){

Torta t;

t = new CokoladnaKeksTorta();

t.Sastavi();

String s1 = t.DajKratakOpis()+"\n";

t = new VocnaTortaSKeksom();

t.Sastavi();

String s2 = t.DajKratakOpis()+"\n";

return s1+s2;

}

Metoda koja se izvršava u samoj klasi tipa Torta je metoda Sastavi(). Ovde je prikazana metoda

implementirana u konkretnoj klasi VocnaTortaSKeksom:

TortaSastojci Sastavi() {

ts = new TortaSastojci();

ts.keks = new KeksPlazma();

ts.preliv = new PrelivCokolada();

ts.voce = new VoceBanana();

return ts;

}

Page 10: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

10

3. Adapter patern

Konvertuje interfejs klase u drugi interfejs koji klijenti očekuju. Adapter omogudava saradnju klasa koje

inače ne bi mogle da sarađuju zbog nekompatibilnih interfejsa.

U primeru poslastičarnice korišden je Adapter patern koji je predstavljen slededom slikom koja je

analogna prethodnoj:

Page 11: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

11

Adapter patern je u ovom primeru uskočio u pomod kada se pojavila potreba izmene neke od postojedih

metoda uz zadržavanje postojede funkcionalnosti i implementacije nove. Ono što je bilo potrebno

izmeniti to je metoda IspisiElementStandardno(Torta t). Zbog ovoga uvedena je nova apstraktna klasa

TortaNova koja sadrži apstraktnu metodu DajOpisTorteSDodacima() koja implementira novu, traženu

funkcionalnost. Zatim je uvedena još jedna klasa Adapter koja nasleđuje klasu TortaNova i implementira

njenu metodu, ali takođe sadrži i referencu na klasu Torta. Dakle, konstruktor klase Adapter izgleda

ovako:

Adapter(Torta torta) {

this.torta = torta;

}

A metoda:

String DajOpisTorteSDodacima() {

return torta.DajOpisTorte() + "\n*****Moguci dodaci: ukrasi za vencanje, svece-brojevi ili konfete";

}

Kao što se vidi, u metodi DajOpisTorteSDodacima() poziva se ranije implementirana metoda

DajOpisTorte() nad objektom tipa Torta i još dodaje nova funkcionalnost.

Dalje, poslastičarnica na slededi način koristi gore opisane klase TortaNova, Adapter i metodu

DajOpisTorteSDodacima():

static String IspisiElementSpecijalno(Torta t){

t.IzaberiKeks();

t.IzaberiPreliv();

t.IzaberiVoce();

TortaNova tortaNova = new Adapter(t);

return tortaNova.DajOpisTorteSDodacima();

}

Page 12: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

12

4. Flyweight patern

Koristi deljenje za efikasnu podršku velikog broja sitnijih detalja.

U primeru poslastičarnice korišden je Flyweight patern koji je predstavljen slededom slikom koja je

analogna prethodnoj:

Page 13: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

13

Kao što je rečeno u uvodu, podržan je prikaz recepata torti. Međutim, jedna od torti, konkretno vona

torta s keksom, može se napraviti na više načina, tj. za tu tortu postoji više recepata. Svi ti recepti sadrže

iste sastojke, tako da je problem nadi rešenje koje de sprečiti redundansu istih sastojaka u različitim

receptima. Da bi se to uspešno rešilo, korišden je Flyweight patern i uvedene su četiri nove klase:

a) Flyweight koja sadrži dve iste metode s različitim potpisom: VratiStanje(String spoljasnjeStanje),

druga metoda je apstraktna – VratiStanje().

b) ConcreteFlyweight klasa nasleđuje klasu Flyweight i kao atribut sadrži unutrasnjeStanje i

implementira i reimplementira obe metode nadređene klase.

c) UnsharedConcreteFlyweight klasa nasleđuje klasu Flyweight i kao atribut sadrži spoljasnjeStanje

i referencu na Flyweight, odnosno ConcreteFlyweight, što se može videti sa slike. Ova klasa, za

razliku od prethodno opisane, samo implementira apstraktnu metodu nadređene klase.

d) FlyweightFactory klasa sadrži niz referenci na Flyweight i jedan atribut brojFlyweight.

Konstruktor ove klase je:

FlyweightFactory() {

fw = new FlyWeight[8];

brojFlyweight = 0;

}

Klasa takođe sadrži jednu metodu DodajFlyweight(String flyweight):

FlyWeight DodajFlyweight(String flyweight){

for(int i=0; i<brojFlyweight; i++){

if(fw[i].VratiStanje().equals(flyweight))

return fw[i];

}

fw[brojFlyweight++] = new ConcreteFlyweight(flyweight);

return fw[brojFlyweight-1];

}

Dalje je potrebno samo još upotrebiti sve ovo u klasi Torta, a kasnije i u konkretnim pojavljivanjima te

klase.

Page 14: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

14

S obzirom na to da je vocna torta s keksom ta koja ima tri vrste recepata, prikazana je upotreba

Flyweight paterna u toj klasi. Prvo, klasa VocnaTortaSKeksom sadrži reference na FlyweightFactory i

FlyWeight, kao i niz referenci na UnsharedConcreteFlyweight:

FlyweightFactory ff;

UnsharedConcreteFlyweight[] ucf;

FlyWeight cf;

Sve to se inicijalizuje pri kreiranju objekta klase VocnaTortaSKeksom u samom konstruktoru koji ne

prima parametre.

public VocnaTortaSKeksom() {

this.ff = new FlyweightFactory();

this.ucf = new UnsharedConcreteFlyweight[4];

this.ts = new TortaSastojci();

}

Dalje, postoji metoda StaviSastojke():

void StaviSastojke() {

ff.DodajFlyweight("Recept za vocnu tortu s keksom: ");

ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ff.DodajFlyweight("voce: "+ts.voce.VratiVoce());

ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

}

Za svaki recept implementira se nova metoda, a one su u ovom primeru nazvane Recept1(), Recept2() i

Recept3().

Page 15: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

15

Konačno, jedan od recepata se prikazuje na slededi način:

void Recept1() {

cf = ff.DodajFlyweight("Recept za vocnu tortu s keksom br.1: ");

ucf[0] = new UnsharedConcreteFlyweight(cf, "\n");

cf = ff.DodajFlyweight("voce: "+ts.voce.VratiVoce());

ucf[1] = new UnsharedConcreteFlyweight(cf, "Prvo staviti ");

cf = ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

ucf[2] = new UnsharedConcreteFlyweight( cf, ", preko toga ");

cf = ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ucf[3] = new UnsharedConcreteFlyweight(cf, " i najzad ");

}

Metoda koja ispisuje recepte je metoda PrikaziRecept():

void PrikaziRecept() {

String recept = "";

for(int i=0; i<4; i++){

recept = recept + ucf[i].VratiStanje();

}

System.out.println(recept);

System.out.println("---------------------------------------");

}

Page 16: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

16

5. Chain of responsibility patern

Izbegava neposredno vezivanje pošiljaoca zahteva sa njegovim primaocem dajudi šansu da više objekata

rukuje zahtevom. Povezuje objekte primaoce i prosleđuje zahtev niz lanac dok ga neki objekat (objekti)

ne obradi.

U primeru poslastičarnice korišden je Chain of responsability patern koji je predstavljen slededom slikom

koja je analogna prethodnoj:

Page 17: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

17

S obzirom na to da poslastičarnica učestvuje na raznim takmičenjima prezentujudi vodnu tortu s keksom,

javila se potreba da se pamte sve osvojene nagrade. Da bi se to postiglo, korišden je Chain of

responsibility patern kojim se uvodi apstraktna klasa Nagrada i klase koje je nasleđuju, a predstavljaju

konkretna pojavljivanja nagrada poput: nagrada za dekoraciju, jednostavnost, neobičan spoj sastojaka,

stil, ukus... itd. Sve te klase implementiraju apstraktnu metodu vratiNagradu() nadređene klase koja

vrada ime konkretne nagrade. Klasa Nagrada sadrži referencu na, takoredi, samu sebe. O čemu se radi?

Postoji lanac objekata određenog tipa nagrade i svaki taj objekat ima pokazivač na slededi objekat u

nizu, a to je upravo pomenuta referenca. Takođe, klasa Nagrada sadrži i atribut nagrađeno tipa boolean

koji govori da li je torta nagrađena konkretnom nagradom. Tako klasa Nagrada ima metodu

PrikaziNagradu():

String PrikaziNagradu(){ String n = "";

if (nagradjeno == true) n = "\nNagrada:" + vratiNagradu() + " ";

if (nagrada!=null )n = n + nagrada.PrikaziNagradu();

return n;

}

Za prikupljanje podataka o nagradama zadužen je menadžer poslastičarnice. Način na koji je ovo

prikupljanje rešeno, objašnjeno je u opisu upotrebe slededeg paterna.

Page 18: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

18

6. Observer patern

Definiše zavisnost jedan prema više među objektima da bi prilikom promene stanja jednog objekta svi

zavisni objekti bili obavešteni i automatski ažurirani.

U primeru poslastičarnice korišden je Observer patern koji je predstavljen slededom slikom koja je

analogna prethodnoj:

Page 19: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

19

Na prvoj slici gde je prikazan dijagram klasa Observer paterna, vidi se da klasa Subject ima metodu

Attach(Observer) koja kao parametar prima referencu na klasu Observer. Međutim, u primeru

poslastičarnice funkcionalnost ove metode je zamenjena konstruktorom klase Poslasticarnica koja kao

parametar prima referencu na objekat tipa Torta:

Poslasticarnica(Torta torta) {

this.torta = torta;

}

Metoda Detach(Observer) nije implementirana u ovom primeru, a metoda Notify() je ustvari

ObjaviRezultate():

public void ObjaviRezultate(){

torta.PogledNaRezultate();

}

Rečeno je da menadžer prikuplja podatke o osvojenim nagradama poslastičarnice na takmičenjima. On

to čini putem sledede metode:

void SakupiSveRezultate(){

Menadzer m;

NagradaZaDekoraciju nzd = new NagradaZaDekoraciju(null,true);

NagradaZaJednostavnost nzj = new NagradaZaJednostavnost(nzd,true);

NagradaZaNeobicanSpojSastojaka nznss = new NagradaZaNeobicanSpojSastojaka(nzj,false);

NagradaZaStil nzs = new NagradaZaStil(nznss,true);

NagradaZaUkus nzu = new NagradaZaUkus(nzs, true);

VocnaTortaSKeksom vtsk = new VocnaTortaSKeksom(nzu);

m = new Menadzer(vtsk);

rezultati = m.PrikaziNagrade();

}

Page 20: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

20

Rezultate menadžer prikazuje preko metode PrikaziRezultate():

String PrikaziRezultate(){

return rezultati;

}

Nakon što se prikupe rezultati o osvojenim nagradama, kod svake torte se ažuriraju ti podaci i to na

slededi način:

void PogledNaRezultate() {

rezultati = m.PrikaziRezultate();

System.out.print("Nagrade za vocnu tortu s keksom:\n"+"-----------------");

System.out.println(rezultati);

}

Page 21: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

21

7. Command patern

Enkapsulira zahtev kao objekat čime omogudava parametrizaciju klijenata sa različitim zahtevima,

redovima za čekanje, ili zahtevima za formiranje dnevnika rada, i podržava operacije čije se dejstvo može

poništiti.

U primeru poslastičarnice korišden je Command patern koji je predstavljen slededom slikom koja je

analogna prethodnoj:

Page 22: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

22

Osim zadatka da prikuplja podatke o osvojenim nagradama na takmičenjima, menadžer ima još jedan

zadatak, a to je da odredi koja koja torta de učestvovati na takmičenjima i koji kuvar de je prezentovati.

To je omogudeno preko metode OdrediTortuIKuvaraZaTakmicenje() klase Menadžer:

void OdrediTortuIKuvaraZaTakmicenje(){

kuvar = new KuvarEgzoticneTorte();

torta = new VocnaTortaSKeksom(kuvar);

}

Klasa Torta i sva njena konkretna pojavljivanja čuvaju referencu na klasu Kuvar, a tu klasu nasleđuju

klase koje ustvari predstavljaju konkretne kuvare poput: Kuvar za brze torte, kuvar za egzotične torte i

glavni kuvar. Takođe, svako konkretna klasa koja nasleđuje klasu Torta implementira metodu

VratiPredstavnikaZaTakmicenje():

String VratiPredstavnikaZaTakmicenje() {

return kuvar.OpisPosla();

}

S druge strane, svako konkretno pojavljivanje klase Kuvar implementira metodu OpisPosla() koja, kao što

i sama metoda kaže, vrada opis posla kuvara.

Na ovaj način, poslastičarnica može da sazna koji kuvar de prezentovati određenu tortu na takmičenju, a

da uopšte ne učestvuje u određivanju istog, a menadžer uvek zna koji kuvar je zadužen za svaku od torti.

Tako poslastičarnica implementira slededu metodu:

public String VratiPredstavnikaZaTakmicenje(){

return torta.VratiPredstavnikaZaTakmicenje();

}

Page 23: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

23

Celokupan programski kod

package Poslasticarnica7paterna;

//Builder pattern-Director

//FactoryMethod pattern-Client

//Adapter pattern-Client

//Observer pattern-Subject

//Command pattern-Invoker

public class Poslasticarnica {

Torta torta;

public Poslasticarnica() {

}

//Observer pattern-Attach()

Poslasticarnica(Torta torta) {

this.torta = torta;

}

//Observer pattern-Notify()

public void ObjaviRezultate(){

torta.PogledNaRezultate();

}

//Command pattern

public String VratiPredstavnikaZaTakmicenje(){

return torta.VratiPredstavnikaZaTakmicenje();

}

//FactoryMethod pattern

static String PrikaziFlajer(){

Torta t;

String s = "////////////////////////\nFlajer:\n";

t = new CokoladnaKeksTorta();

t.Sastavi();

String s1 = t.DajKratakOpis()+"\n";

t = new VocnaTortaSKeksom();

t.Sastavi();

String s2 = t.DajKratakOpis()+"\n";

return s+s1+s2+"////////////////////////";

}

//Builder pattern-Construct()

static String IspisiElementStandardno(Torta t){

t.IzaberiKeks();

t.IzaberiPreliv();

t.IzaberiVoce();

return t.DajOpisTorte();

}

Page 24: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

24

//Adapter patern

static String IspisiElementSpecijalno(Torta t){

t.IzaberiKeks();

t.IzaberiPreliv();

t.IzaberiVoce();

TortaNova tortaNova = new Adapter(t);

return tortaNova.DajOpisTorteSDodacima();

}

//Builder patern

static String IspisiMeni(){

Torta t;

String s = "***************************\nMeni:\n";

t = new VocnaTortaSKeksom();

String s1 = IspisiElementStandardno(t)+"\n";

t = new CokoladnaKeksTorta();

String s2 = IspisiElementSpecijalno(t)+"\n";

return s+s1+s2+"***************************";

}

//Flyweight patern

public static void prikaziRecepteVocneTorteSKeksom(){

Torta t = new VocnaTortaSKeksom();

t.IzaberiKeks();

t.IzaberiPreliv();

t.IzaberiVoce();

t.StaviSastojke();

t.Recept1();

t.PrikaziRecept();

t.Recept2();

t.PrikaziRecept();

t.Recept3();

t.PrikaziRecept();

}

//Flyweight patern

public static void prikaziRecepteCokoladneKeksTorte(){

Torta t = new CokoladnaKeksTorta();

t.IzaberiKeks();

t.IzaberiPreliv();

t.IzaberiVoce();

t.StaviSastojke();

t.Recept1();

t.PrikaziRecept();

}

//Observer pattern

public static void ObjaviRezultateZaVocnuTortuSKeksom(){

Menadzer men = new Menadzer();

men.SakupiSveRezultate();

VocnaTortaSKeksom vtsk = new VocnaTortaSKeksom(men);

men = new Menadzer(vtsk);

men.ObjaviRezultate();

}

Page 25: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

25

//Command pattern

public static String DajPredstavnika(){

Poslasticarnica p;

Menadzer m = new Menadzer();

m.OdrediTortuIKuvaraZaTakmicenje();

p = new Poslasticarnica(m.VratiTortu());

return "Predstavnik na takmicenju bice:

"+p.VratiPredstavnikaZaTakmicenje();

}

public static void main(String args[]) {

prikaziRecepteVocneTorteSKeksom();

prikaziRecepteCokoladneKeksTorte();

ObjaviRezultateZaVocnuTortuSKeksom();

System.out.println(IspisiMeni());

System.out.println(PrikaziFlajer());

System.out.println(DajPredstavnika());

}

}

package Poslasticarnica7paterna;

//Observer pattern-ConcreteSubject

//Command pattern-Client

public class Menadzer extends Poslasticarnica

{

String rezultati;//Observer pattern-SubjectState

Kuvar kuvar;//Command pattern

Menadzer()

{

super();

}

Menadzer(Torta t)

{

super(t);

}

//Command pattern

void OdrediTortuIKuvaraZaTakmicenje()

{

kuvar = new KuvarEgzoticneTorte();

torta = new VocnaTortaSKeksom(kuvar);

}

String PrikaziNagrade()

{

return torta.PrikaziNagradu();

}

Page 26: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

26

//Observer pattern-SetState()

void SakupiSveRezultate()

{

Menadzer m;

NagradaZaDekoraciju nzd = new NagradaZaDekoraciju(null, true);

NagradaZaJednostavnost nzj = new NagradaZaJednostavnost(nzd,

true);

NagradaZaNeobicanSpojSastojaka nznss = new

NagradaZaNeobicanSpojSastojaka(nzj, false);

NagradaZaStil nzs = new NagradaZaStil(nznss, true);

NagradaZaUkus nzu = new NagradaZaUkus(nzs, true);

VocnaTortaSKeksom vtsk = new VocnaTortaSKeksom(nzu);

m = new Menadzer(vtsk);

rezultati = m.PrikaziNagrade();

}

//Observer pattern-GetState()

String PrikaziRezultate()

{

return rezultati;

}

Torta VratiTortu()

{

return torta;

}

}

package Poslasticarnica7paterna;

//Builder pattern-Product

public interface Keks

{

String VratiKeks();

}

package Poslasticarnica7paterna;

public class KeksPetitBeure implements Keks

{

public String VratiKeks()

{

return "petit beure";

}

}

package Poslasticarnica7paterna;

public class KeksPlazma implements Keks

{

public String VratiKeks()

{

return "plazma keks"; }}

Page 27: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

27

package Poslasticarnica7paterna;

//Builder pattern-Product

public interface Preliv

{

String VratiPreliv();

}

package Poslasticarnica7paterna;

public class PrelivCokolada implements Preliv

{

public String VratiPreliv()

{

return "cokoladni preliv";

}

}

package Poslasticarnica7paterna;

public class PrelivVanila implements Preliv

{

public String VratiPreliv()

{

return "preliv od vanile";

}

}

package Poslasticarnica7paterna;

//Builder pattern-Product

public interface Voce

{ String VratiVoce();}

package Poslasticarnica7paterna;

public class VoceBanana implements Voce

{

public String VratiVoce()

{

return "banane";

}}

package Poslasticarnica7paterna;

public class VoceJagoda implements Voce

{

public String VratiVoce()

{

return "jagode";

}}

Page 28: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

28

package Poslasticarnica7paterna;

class VoceBez implements Voce

{

public String VratiVoce()

{

return "bez voca";

}}

package Poslasticarnica7paterna;

//Command pattern-Receiver

abstract class Kuvar

{

abstract String OpisPosla();//Command pattern-Action()

}

package Poslasticarnica7paterna;

class KuvarBrzeTorte extends Kuvar{

@Override

String OpisPosla() {

return "Kuvar brzih torti";

}}

package Poslasticarnica7paterna;

class KuvarEgzoticneTorte extends Kuvar{

@Override

String OpisPosla() {

return "Kuvar egzoticnih torti";

}}

package Poslasticarnica7paterna;

class KuvarGlavni extends Kuvar{

@Override

String OpisPosla() {

return "Glavni kuvar";

}}

package Poslasticarnica7paterna;

//FactoryMethod pattern-Product->ConcreteProduct

public class TortaSastojci

{

Preliv preliv;

Voce voce;

Keks keks;

}

Page 29: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

29

package Poslasticarnica7paterna;

//Builder pattern-Builder

//FactoryMethod pattern-Creator

//Adapter pattern-Adaptee

//Observer pattern-Observer

//Command pattern-Command

abstract class Torta

{

TortaSastojci ts;

String rezultati;//Observer pattern-observerState

Menadzer m;

Torta(Menadzer m)

{

this.m = m;

}

Torta()

{

ts = new TortaSastojci();

}

abstract Preliv IzaberiPreliv();//Builder pattern-buildPart()

abstract Voce IzaberiVoce();//Builder pattern-buildPart()

abstract Keks IzaberiKeks();//Builder pattern-buildPart()

abstract Keks UzmiKeks();

abstract Preliv UzmiPreliv();

abstract Voce UzmiVoce();

abstract String DajKratakOpis();

abstract String DajOpisTorte();//Adapter pattern-SpecificRequest()

abstract String PrikaziNagradu();

abstract void PogledNaRezultate();//Observer pattern-Update()

abstract void StaviSastojke();//Flyweight pattern

abstract void Recept1();//Flyweight pattern

abstract void Recept2();//Flyweight pattern

abstract void Recept3();//Flyweight pattern

abstract void PrikaziRecept();//Flyweight pattern

abstract TortaSastojci Sastavi();//FactoryMethod pattern-

FactoryMethod()

abstract String VratiPredstavnikaZaTakmicenje();//Command pattern-

Execute()

}

package Poslasticarnica7paterna;

//Adapter pattern-Target

abstract class TortaNova

{

abstract String DajOpisTorteSDodacima();//Adapter pattern-Request()

}

Page 30: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

30

package Poslasticarnica7paterna;

//Adapter pattern-Adapter

class Adapter extends TortaNova{

Torta torta;

Adapter(Torta torta) {

this.torta = torta;

}

//Adapter pattern-Request()

@Override

String DajOpisTorteSDodacima() {

return torta.DajOpisTorte() + "\n*****Moguci dodaci: ukrasi za

vencanje, svece-brojevi ili konfete";

}

}

package Poslasticarnica7paterna;

//Flyweight pattern-FlyweightFactory

public class FlyweightFactory

{

FlyWeight[] fw;

int brojFlyweight;

FlyweightFactory()

{

fw = new FlyWeight[8];

brojFlyweight = 0;

}

//Flyweight pattern-GetFlyweight(key)

FlyWeight DodajFlyweight(String flyweight)

{

for (int i = 0; i < brojFlyweight; i++)

{

if (fw[i].VratiStanje().equals(flyweight))

return fw[i];

}

fw[brojFlyweight++] = new ConcreteFlyweight(flyweight);

return fw[brojFlyweight - 1];

}

}

Page 31: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

31

package Poslasticarnica7paterna;

//Flyweight pattern-Flyweight

abstract class FlyWeight

{

abstract String VratiStanje();

//Flyweight pattern-Operation(ExtrinsicState)

String VratiStanje(String spoljasnjeStanje)

{

return "";

} }

package Poslasticarnica7paterna;

//Flyweight pattern-UnsharedConcreteFlyweight

class UnsharedConcreteFlyweight extends FlyWeight

{

String spoljasnjeStanje;

FlyWeight cf;//Flyweight pattern-allState

UnsharedConcreteFlyweight(FlyWeight cf, String spoljasnjeStanje)

{

this.cf = cf;

this.spoljasnjeStanje = spoljasnjeStanje;

}

//Flyweight pattern-Operation(ExtrinsicState)

String VratiStanje()

{

return cf.VratiStanje(spoljasnjeStanje);

}

}

package Poslasticarnica7paterna;

//Flyweight pattern-ConcreteFlyweight

class ConcreteFlyweight extends FlyWeight{

//Flyweight pattern-intrinsicState

String unutrasnjeStanje;

public ConcreteFlyweight(String unutrasnjeStanje) {

this.unutrasnjeStanje = unutrasnjeStanje;

}

String VratiStanje() {

return unutrasnjeStanje;

}

//Flyweight pattern-Operation(ExtrinsicState)

@Override

String VratiStanje(String spoljasnjeStanje){

return spoljasnjeStanje + " " + unutrasnjeStanje; }}

Page 32: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

32

package Poslasticarnica7paterna;

//ChainOfResponsibility pattern-Handler

abstract class Nagrada

{

Nagrada nagrada;

boolean nagradjeno;

public Nagrada(Nagrada nagrada, boolean nagradjeno)

{

this.nagrada = nagrada;

this.nagradjeno = nagradjeno;

}

String PrikaziNagradu()

{

String n = "";

if (nagradjeno == true) n = "\nNagrada:" + vratiNagradu() + " ";

if (nagrada != null) n = n + nagrada.PrikaziNagradu();

return n;

}

//ChainOfResponsibility pattern-HandleRequest()

abstract String vratiNagradu();

}

package Poslasticarnica7paterna;

//ChainOfResponsibility pattern-ConcreteHandler

class NagradaZaDekoraciju extends Nagrada

{

NagradaZaDekoraciju(Nagrada n, boolean b)

{

super(n, b);

}

//ChainOfResponsibility pattern-HandleRequest()

String vratiNagradu()

{

return " Nagrada za najbolju dekoraciju";

}

}

Page 33: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

33

package Poslasticarnica7paterna;

//ChainOfResponsibility pattern-ConcreteHandler

class NagradaZaJednostavnost extends Nagrada

{

NagradaZaJednostavnost(Nagrada n, boolean b)

{

super(n, b);

}

//ChainOfResponsibility pattern-HandleRequest()

String vratiNagradu()

{

return " Nagrada za jednostavnost";

} }

package Poslasticarnica7paterna;

//ChainOfResponsibility pattern-ConcreteHandler

class NagradaZaNeobicanSpojSastojaka extends Nagrada

{

NagradaZaNeobicanSpojSastojaka(Nagrada n, boolean b)

{

super(n, b);

}

//ChainOfResponsibility pattern-HandleRequest()

String vratiNagradu()

{

return " Nagrada za neobican spoj sastojaka";

}

}

package Poslasticarnica7paterna;

//ChainOfResponsibility pattern-ConcreteHandler

class NagradaZaStil extends Nagrada

{

NagradaZaStil(Nagrada n, boolean b)

{

super(n, b);

}

//ChainOfResponsibility pattern-HandleRequest()

String vratiNagradu()

{

return " Nagrada za stil";

}

}

Page 34: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

34

package Poslasticarnica7paterna;

//ChainOfResponsibility pattern-ConcreteHandler

class NagradaZaUkus extends Nagrada

{

NagradaZaUkus(Nagrada n, boolean b)

{

super(n, b);

}

//ChainOfResponsibility pattern-HandleRequest()

String vratiNagradu()

{

return " Nagrada za najbolji ukus";

}

}

package Poslasticarnica7paterna;

//Builder pattern-ConcreteBuilder

//FactoryMethod pattern-ConcreteCreator

//Flyweight pattern-Client

//ChainOfResponsibility pattern-Client

//Observer pattern-ConcreteObserver

//Command pattern-ConcreteCommand

class VocnaTortaSKeksom extends Torta{

Nagrada nagrada;

FlyweightFactory ff;

UnsharedConcreteFlyweight[] ucf;

FlyWeight cf;

Kuvar kuvar;//Command pattern-State

public VocnaTortaSKeksom() {

this.ff = new FlyweightFactory();

this.ucf = new UnsharedConcreteFlyweight[4];

this.ts = new TortaSastojci();

}

VocnaTortaSKeksom(Nagrada nagrada) {

this.nagrada = nagrada;

}

VocnaTortaSKeksom(Menadzer m) {

super(m);

}

VocnaTortaSKeksom(Kuvar kuvar){

this.kuvar = kuvar;

}

Page 35: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

35

//Observer pattern-Update()

@Override

void PogledNaRezultate() {

rezultati = m.PrikaziRezultate();

System.out.print("Nagrade za vocnu tortu s keksom:\n"+"--------------

---");

System.out.println(rezultati);

}

//Builder pattern-BuildPart()

@Override

Keks IzaberiKeks() {

ts.keks = new KeksPlazma();

return ts.keks;

}

//Builder pattern-BuildPart()

@Override

Preliv IzaberiPreliv() {

ts.preliv = new PrelivCokolada();

return ts.preliv;

}

//Builder pattern-BuildPart()

@Override

Voce IzaberiVoce() {

ts.voce = new VoceBanana();

return ts.voce;

}

@Override

Keks UzmiKeks() {

return ts.keks;

}

@Override

Preliv UzmiPreliv() {

return ts.preliv;

}

@Override

Voce UzmiVoce() {

return ts.voce;

}

@Override

String DajKratakOpis(){

return "Vocna torta s keksom-glavni sastojak "+ts.voce.VratiVoce();

}

//Builder pattern-GetResult()

@Override

String DajOpisTorte(){

return "Vocna torta s keksom: "+ts.keks.VratiKeks()+",

"+ts.preliv.VratiPreliv()+", "+ts.voce.VratiVoce(); }

Page 36: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

36

//Flyweight patern

@Override

void StaviSastojke() {

ff.DodajFlyweight("Recept za vocnu tortu s keksom: ");

ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ff.DodajFlyweight("voce: "+ts.voce.VratiVoce());

ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

}

//Flyweight patern

@Override

void Recept1() {

cf = ff.DodajFlyweight("Recept za vocnu tortu s keksom br.1: ");

ucf[0] = new UnsharedConcreteFlyweight(cf, "\n");

cf = ff.DodajFlyweight("voce: "+ts.voce.VratiVoce());

ucf[1] = new UnsharedConcreteFlyweight(cf, "Prvo staviti ");

cf = ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

ucf[2] = new UnsharedConcreteFlyweight( cf, ", preko toga ");

cf = ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ucf[3] = new UnsharedConcreteFlyweight(cf, " i najzad ");

}

//Flyweight patern

@Override

void Recept2() {

cf = ff.DodajFlyweight("Recept za vocnu tortu s keksom br.2: ");

ucf[0] = new UnsharedConcreteFlyweight(cf, "\n");

cf = ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

ucf[1] = new UnsharedConcreteFlyweight( cf, "Prvo staviti ");

cf = ff.DodajFlyweight("voce: "+ts.voce.VratiVoce());

ucf[2] = new UnsharedConcreteFlyweight(cf, ", preko toga ");

cf = ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ucf[3] = new UnsharedConcreteFlyweight(cf, " i najzad ");

}

//Flyweight patern

@Override

void Recept3() {

cf = ff.DodajFlyweight("Recept za vocnu tortu s keksom br.3: ");

ucf[0] = new UnsharedConcreteFlyweight(cf, "\n");

cf = ff.DodajFlyweight("voce: "+ts.voce.VratiVoce());

ucf[1] = new UnsharedConcreteFlyweight(cf, "Prvo staviti ");

cf = ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ucf[2] = new UnsharedConcreteFlyweight(cf, ", preko toga ");

cf = ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

ucf[3] = new UnsharedConcreteFlyweight( cf, " i najzad "); }

Page 37: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

37

//Flyweight patern

void PrikaziRecept() {

String recept = "";

for(int i=0; i<4; i++){

recept = recept + ucf[i].VratiStanje();

}

System.out.println(recept);

System.out.println("---------------------------------------");

}

//ChainOfResponsibility patern

@Override

String PrikaziNagradu() {

return nagrada.PrikaziNagradu();

}

//FactoryMethod pattern-FactoryMethod()

@Override

TortaSastojci Sastavi() {

ts = new TortaSastojci();

ts.keks = new KeksPlazma();

ts.preliv = new PrelivCokolada();

ts.voce = new VoceBanana();

return ts;

}

//Command pattern-Execute()

@Override

String VratiPredstavnikaZaTakmicenje() {

return kuvar.OpisPosla();

}

}

Page 38: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

38

package Poslasticarnica7paterna;

//Builder pattern-ConcreteBuilder

//FactoryMethod pattern-ConcreteCreator

//Observer pattern-ConcreteObserver

//Command pattern-ConcreteCommand

class CokoladnaKeksTorta extends Torta{

FlyweightFactory ff;

UnsharedConcreteFlyweight[] ucf;

FlyWeight cf;

Kuvar kuvar;//Command pattern-State

public CokoladnaKeksTorta() {

this.ff = new FlyweightFactory();

this.ucf = new UnsharedConcreteFlyweight[4];

this.ts = new TortaSastojci();

}

//Builder pattern-BuildPart()

@Override

Keks IzaberiKeks() {

ts.keks = new KeksPetitBeure();

return ts.keks;

}

//Builder pattern-BuildPart()

@Override

Preliv IzaberiPreliv() {

ts.preliv = new PrelivCokolada();

return ts.preliv;

}

//Builder pattern-BuildPart()

@Override

Voce IzaberiVoce() {

ts.voce = new VoceBez();

return ts.voce;

}

@Override

Keks UzmiKeks() {

return ts.keks;

}

@Override

Preliv UzmiPreliv() {

return ts.preliv;

}

@Override

Voce UzmiVoce() {

return ts.voce;

}

Page 39: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

39

@Override

String DajKratakOpis(){

return "Cokoladna keks torta-glavni sastojak

"+ts.preliv.VratiPreliv();

}

//Builder pattern-GetResult()

@Override

String DajOpisTorte(){

return "Cokoladna keks torta: "+ts.keks.VratiKeks()+",

"+ts.preliv.VratiPreliv()+", "+ts.voce.VratiVoce();

}

@Override

void PrikaziRecept() {

String recept = "";

for(int i=0; i<4; i++){

recept = recept + ucf[i].VratiStanje();

}

System.out.println(recept);

System.out.println("---------------------------------------");

}

void StaviSastojke() {

ff.DodajFlyweight("Recept za cokoladnu keks tortu: ");

ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

ff.DodajFlyweight("Napomena: u ovoj torti "+ts.voce.VratiVoce());

}

void Recept1() {

cf = ff.DodajFlyweight("Recept za cokoladnu keks tortu: ");

ucf[0] = new UnsharedConcreteFlyweight(cf, "\n");

cf = ff.DodajFlyweight("keks: "+ts.keks.VratiKeks());

ucf[1] = new UnsharedConcreteFlyweight(cf, "Prvo staviti");

cf = ff.DodajFlyweight("preliv: "+ts.preliv.VratiPreliv());

ucf[2] = new UnsharedConcreteFlyweight(cf, ", preko toga ");

cf = ff.DodajFlyweight("Napomena:"+ts.voce.VratiVoce());

ucf[3] = new UnsharedConcreteFlyweight(cf, ".");

}

@Override

void Recept2() {

}

@Override

void Recept3() {

}

Page 40: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

40

//Observer pattern-Update()

@Override

void PogledNaRezultate() {

System.out.println("Ova torta nije predvidjena za takmicenje");

}

@Override

String PrikaziNagradu() {

String s = "Ova torta nije predvidjena za takmicenje, pa nema

nagrada";

return s;

}

//FactoryMethod pattern-FactoryMethod()

@Override

TortaSastojci Sastavi() {

ts = new TortaSastojci();

ts.keks = new KeksPetitBeure();

ts.preliv = new PrelivCokolada();

ts.voce = new VoceBez();

return ts;

}

//Command pattern-Execute()

@Override

String VratiPredstavnikaZaTakmicenje() {

return kuvar.OpisPosla();

}

}

Page 41: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

41

Rezultat programskog koda

Ukoliko bi se iskoristile sve implementirane funkcionalnosti ovog programskog koda, rezultat koji bi se

ispisao bio bi slededi:

Recept za vocnu tortu s keksom br.1: Prvo staviti voce: banane, preko toga

keks: plazma keks i najzad preliv: cokoladni preliv

---------------------------------------

Recept za vocnu tortu s keksom br.2: Prvo staviti keks: plazma keks, preko

toga voce: banane i najzad preliv: cokoladni preliv

---------------------------------------

Recept za vocnu tortu s keksom br.3: Prvo staviti voce: banane, preko toga

preliv: cokoladni preliv i najzad keks: plazma keks

---------------------------------------

Recept za cokoladnu keks tortu: Prvo staviti keks: petit beure, preko toga

preliv: cokoladni preliv. Napomena:bez voca

---------------------------------------

Nagrade za vocnu tortu s keksom:

-----------------

Nagrada: Nagrada za najbolji ukus

Nagrada: Nagrada za stil

Nagrada: Nagrada za jednostavnost

Nagrada: Nagrada za najbolju dekoraciju

***************************

Meni:

Vocna torta s keksom: plazma keks, cokoladni preliv, banane

Cokoladna keks torta: petit beure, cokoladni preliv, bez voca

*****Moguci dodaci: ukrasi za vencanje, svece-brojevi ili konfete

***************************

////////////////////////

Flajer:

Cokoladna keks torta-glavni sastojak cokoladni preliv

Vocna torta s keksom-glavni sastojak banane

////////////////////////

Predstavnik na takmicenju bice: Kuvar egzoticnih torti

Page 42: Tamara Valok - Primena softverskih paterna na primeru poslasticarnice

Softverski paterni Tamara Valok

Seminarski rad

42

Literatura

“Gotova rešenja- elementi objektno orijentisanog softvera“, Erich Gamma, Richard Helm, Ralph

Johnson, John Vlissides