Tamara Valok - Primena softverskih paterna na primeru poslasticarnice
-
Upload
tamaravalok -
Category
Documents
-
view
193 -
download
3
Transcript of 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.
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
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
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
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.
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:
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.
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:
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;
}
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:
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();
}
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:
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.
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().
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("---------------------------------------");
}
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:
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.
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:
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();
}
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);
}
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:
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();
}
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();
}
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();
}
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();
}
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"; }}
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";
}}
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;
}
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()
}
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];
}
}
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; }}
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";
}
}
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";
}
}
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;
}
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(); }
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 "); }
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();
}
}
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;
}
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() {
}
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();
}
}
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
Softverski paterni Tamara Valok
Seminarski rad
42
Literatura
“Gotova rešenja- elementi objektno orijentisanog softvera“, Erich Gamma, Richard Helm, Ralph
Johnson, John Vlissides