You are on page 1of 39

FAKULTET ORGANIZACIONIH NAUKA

UNIVERZITET U BEOGRADU

Seminarski rad
iz predmeta
Softverski paterni

Tema:
Primena softverskih paterna na primeru
salona automobila

Profesor:
Dr Sinia Vlaji

Asistenti:
Ilija Antovi
Duan Savi
Vojislav Stanojevi
Milo Mili

Student:
Filip Radulovi 9/05

Beograd, 2009.
FON, seminarski rad iz Softverskih paterna

Sadraj

Sadraj................................................................................................................................. 1
Uvod.................................................................................................................................... 2
AbstractFactory................................................................................................................... 3
Definicija: ....................................................................................................................... 3
Primer salona automobila: .............................................................................................. 4
Builder................................................................................................................................. 8
Definicija......................................................................................................................... 8
Analogija sa ivotnim situacijama: ................................................................................. 8
Primer salona automobila: .............................................................................................. 9
Proxy................................................................................................................................. 14
Definicija....................................................................................................................... 14
Analogija sa ivotnim situacijama: ............................................................................... 14
Primer salona automobila: ............................................................................................ 15
Adapter patern................................................................................................................... 16
Analogija sa ivotnim situacijama ................................................................................ 16
Primer salona automobila: ............................................................................................ 17
Proxy and Adapter ............................................................................................................ 18
Chain of responsibility...................................................................................................... 22
Definicija....................................................................................................................... 22
Analogija sa ivotnim situacijama ................................................................................ 22
Primer salona automobila ............................................................................................. 23
Memento ........................................................................................................................... 24
Definicija....................................................................................................................... 24
Analogija sa ivotnim situacijama ................................................................................ 24
Primer salona automobila: ............................................................................................ 25
Command.......................................................................................................................... 26
Definicija....................................................................................................................... 26
Analogija sa ivotnim situacijama ................................................................................ 26
Primer salona automobila ............................................................................................. 27
Chain of responsibility, Memento i Command................................................................. 28
Rezultat programa ............................................................................................................. 37
Literatura........................................................................................................................... 38

Tema Primena softverskih paterna na primeru salona automobila 1


FON, seminarski rad iz Softverskih paterna

Uvod
Paterni su svuda oko nas, mogu se nai u prirodi, graevinama, ljubavnim
romanima, ali i u softveru. Kristofer Aleksandar kae: Svaki patern opisuje problem koji
se stalno ponavlja u naem okruenju i zatim opisuje sutinu reenja problema tako to se
to reenje moe upotrebiti milion puta, a da se dva puta ne ponovi na isti nain. Mada
se ovo odnosilo na peterne u arhitekturi, sigurno je da se moe primeniti i u objektno
orjentisanom projektovanju softvera kao i u projektovanju softvera uopte.
Najbolji nain da koristimo softverske paterne jeste da se to bolje upoznamo sa
njima, toliko dobro da ponemo da prepoznajemo mesta u naim aplikacijama gde
moemo da ih upotrebimo. Umesto da kopiramo kod , uz pomo paterna kopirajmo tua
iskustva jel neko je pre nas verovatno ve reio na problem.
U ovom radu e se na 7 razliitih paterna, iz razliitih kategorija, predstaviti
njihov veliki znaaj . Svaki od njih e biti detaljno predstavljen, a kroz primar salona
automobila i klijenta koji vri kupovinu pokazae se i konkretan kod, napisan u
programskom jeziku Java.

Tema Primena softverskih paterna na primeru salona automobila 2


FON, seminarski rad iz Softverskih paterna

AbstractFactory
Lepa stvar koju nam apstrakcija prua jeste da se brinemo o celini, a da brigu o
detaljima ostavimo za kasnije. Abstract Factory nam upravo omoguava klase koje e se
pobrinuti o kreiranju delova eljenog objekta umesto nas.
Abstrakt Factory uzor treba koristiti kada se upravlja stvaranjem grupe
meusobno zavisnih objekata. Treba ga koristiti kada sistem ne sme da zavisi od toga
kako se njegovi objekti prave, sastavljaju i predstavljaju. Uz pomo ovog uzora sistem
uvek dobija prave objekte u odgovarajuem trenutku.

Definicija:
Obezbeuje interfejs (AbstractFactory) za kreiranje (CreateProductA(),
CreateProductB()) familije povezanih ili zavisnih objekata (AbstractProductA,
AbstractProductB) bez navoenja (specificiranja) njihovih konkretnih klaca
(ProductA1, ProductA2,ProductB1,ProductB2).

Sa slike se vidi da klijent ne zna, odnosno ne vodi brigu o tome koji proizvod je
iz koje od ovih fabrika, posto radi sa njihovim apstraktnim predstavama. Koristei ovaj
uzor, postaje mogue promeniti konkretnu klasu bez menjanja koda koji je koristi, ak i u
rantajmu. Meutim primena ovog uzora, kao i uzora poput njega, moe izazvati
nepotrebnu sloenost i dodatni rad u poetku pisanja koda.

Tema Primena softverskih paterna na primeru salona automobila 3


FON, seminarski rad iz Softverskih paterna

Primer salona automobila:

Klijent dolazi u salon automobila da kupi automobil. U salonu se trenutno nalaze


u ponudi samo Audi i BMW . Prilikom izbora automobila postoje razni kriterijumi, a radi
jednostavnosti ovog primera uzeti su boja koja moze biti plava i crvena, broj vrata etiri
ili pet, i gume koje mogu biti letnje ili zimske. Klijent sastavlja sam svoju elju i na
osnovu nje mu se trai odgovarajui automobil.

Tema Primena softverskih paterna na primeru salona automobila 4


FON, seminarski rad iz Softverskih paterna

package PrimerZaAbstractFactory;

/**
*
* @author Filip Radulovic 9/05
*/

public interface ApstraktniAutomobil // AbstractFactory


{
Boja kreirajBoju();
BrojVrata kreirajBrojVrata();
Gume kreirajGume();

public interface Boja // ProductA


{ String VratiBoju();}

public class CrvenaBoja implements Boja


{ public String VratiBoju() { return "Crvena Boja";} }

public class PlavaBoja implements Boja


{ public String VratiBoju(){ return "PlavaBoja"; } }

public interface Gume //ProductB


{ String vratiGume();}

public class LetnjaGuma implements Gume


{ public String vratiGume(){return "Letnja guma"; } }

public class ZimskaGuma implements Gume

public interface BrojVrata // ProductC


{ int VratiBrojVrata();}

public class PetoroVrata implements BrojVrata


{ public int VratiBrojVrata(){return 5; } }

public class CetvoroVrata implements BrojVrata


{ public int VratiBrojVrata() { return 4; } }

Tema Primena softverskih paterna na primeru salona automobila 5


FON, seminarski rad iz Softverskih paterna

public class Audi implements ApstraktniAutomobil // ConcreteFactory1


{

public Boja kreirajBoju()


{
return new PlavaBoja();
}
public BrojVrata kreirajBrojVrata()
{
return new PetoroVrata();
}
public Gume kreirajGume()
{
return new LetnjaGuma();
}

public class BMW implements ApstraktniAutomobil // ConcreteFactory2


{

public Boja kreirajBoju()


{
return new CrvenaBoja();
}
public BrojVrata kreirajBrojVrata()
{
return new CetvoroVrata();
}
public Gume kreirajGume()
{
return new ZimskaGuma();
}

Tema Primena softverskih paterna na primeru salona automobila 6


FON, seminarski rad iz Softverskih paterna

public class KupacAutomobila // Client


{

ApstraktniAutomobil autoBilder;

public KupacAutomobila(ApstraktniAutomobil ab)


{
autoBilder=ab;
}

String Kreiraj()
{
Gume gu=autoBilder.kreirajGume();
Boja bo=autoBilder.kreirajBoju();
BrojVrata brv=autoBilder.kreirajBrojVrata();
return "guma : "+gu.vratiGume()+" boja: "+bo.VratiBoju()+" broj vrata:
"+brv.VratiBrojVrata();
}
}

public class Main {

public static void main(String args[])


{
KupacAutomobila opstina;
Audi A6=new Audi();
opstina=new KupacAutomobila(A6);
System.out.println("Audi A6: "+opstina.Kreiraj());

BMW Z4=new BMW();


opstina=new KupacAutomobila(Z4);
System.out.println("BMW Z4: "+opstina.Kreiraj());
}

Tema Primena softverskih paterna na primeru salona automobila 7


FON, seminarski rad iz Softverskih paterna

Builder

Definicija
Razdvaja izgradnju sloenog objekta od njegove reprezentacije da bi isti proces
pravljenja mogao da proizvede razliite reprezentacije.

Karakteristike Buildera

1. Omogucava menjanje unutrasnje predstave proizvoda. Ukoliko zelimo da promenimo


unutrasnju predstavu proizvoda, treba samo dodati novu vrstu buildera, a to nam
omogucava apstraktni interfejs. On krije i nacin sklapanja proizvoda, i predstavu i
unutrasnju strukturu proizvoda.
2. Bilder gradi proizvod korak po korak po kontrolom direktora, a ne odjednom, i tek kad
se proizvod ceo zavrsi, direktor ga preuzima.
3. Razliciti direktori mogu koristiti iste linije koda.
4. U interfejsu se ne pojavljuju klase koje definisu unutrasnju strukturu proizvoda, pa
prema tome klijent ne mora nista da zna o njima.

Analogija sa ivotnim situacijama:

Recimo da imamo plan da odvedemo decu u restoran brze hrane. Od ega se


sastoji takav jedan obrok? Hamburger, hladno pice, porcija pomfrita i igrakica. To je
ono to je zajedniko za sve restorane brze hrane i za svaki deiji obrok. ta je ovde
bitno? Svaki put kada je deiji obrok naruen, osoblje restorana e uzeti hamburger,
hladno pice, porciju ponfrita i igrakicu. Sada predpostavimo da su na jelovniku dostupne
tri vrste hamburgera, od sivinjetine, piletine i soje. Dve vrste pia, kola i oranina,
pomfrit mali i veliki i igrake automobil i lutka. Dakle svaka narudbina moe biti jedna
od ovih kombinacija, ali proces je uvek isti, jedan hamburger, jedno pie, jedan pomfrit i
jedna igraka. Svi su smeteni u kesu papira i predati detetu. Kada bismo pravili program
za ovo imali bismo apstraktu klasu obrok, koji bi se sastojao od elemenata hamburger,
pomfrit, pie i igraka koji bi takodje predstavljali apstraktne klace. Na taj nain obrok
skriva interne podatke o tome kako je obrok sastavljen. Svaki obrok je nezavisan, i zato
to se sastavlja korak po korak, imamo veu kontrolu.

Tema Primena softverskih paterna na primeru salona automobila 8


FON, seminarski rad iz Softverskih paterna

Primer salona automobila:

Klijent dolazi u salon automobila da kupi automobil. U salonu se trenutno nalaze


u ponudi samo Audi i BMW. Osnovni kriterijumi prilikom izbora automobila su mu boja
koja moze biti plava i crvena, broj vrata etiri ili pet, i gume koje mogu biti letnje ili
zimske. Klijent naglaava da su mu bitne te karakteristike, i na osnovu njih dobija ponudu
automobila.

Tema Primena softverskih paterna na primeru salona automobila 9


FON, seminarski rad iz Softverskih paterna

package primerzabuilderpatern;
/**
*
* @author Filip Radulovic 9/05
*/
public class KupacAutomobila //DIREKTOR
{
private ApstraktniAutomobil autoBilder;

public void setApstraktniAutomobil(ApstraktniAutomobil ab)


{
autoBilder=ab;
}

public Automobil getAuto()


{
return autoBilder.getAuto();
}

public void Konstruisi()


{
autoBilder.kreirajNoviAutomobil();
autoBilder.kreirajGume();
autoBilder.kreirajBrojVrata();
autoBilder.kreirajBoju();
}
}

public class Main {

public static void main(String[] args)


{
KupacAutomobila opstina=new KupacAutomobila();
ApstraktniAutomobil audi=new Audi();
ApstraktniAutomobil BMW=new BMW();

opstina.setApstraktniAutomobil(BMW);
opstina.Konstruisi();
System.out.println(BMW.vratiPonudu());

opstina.setApstraktniAutomobil(audi);
opstina.Konstruisi();
System.out.println(audi.vratiPonudu());
}
}

Tema Primena softverskih paterna na primeru salona automobila 10


FON, seminarski rad iz Softverskih paterna

abstract class ApstraktniAutomobil // Builder


{
protected Automobil auto;
public Automobil getAuto() { return auto; }

public void kreirajNoviAutomobil()


{
auto=new Automobil();
}
public abstract void kreirajGume();
public abstract void kreirajBoju();
public abstract void kreirajBrojVrata();
public abstract String vratiPonudu();

public class Automobil


{

private Gume gume ;


private BrojVrata brojVrata ;
private Boja boja ;

public void setGume(Gume gume)


{
this.gume=gume;
}

public void setBrojVrata(BrojVrata brojVrata)


{
this.brojVrata=brojVrata;
}

public void setBoja(Boja boja)


{
this.boja=boja;
}

public Gume getGume(){return gume;}

public BrojVrata getBrojVrata(){return brojVrata;}

public Boja getBoja(){ return boja;}


}

Tema Primena softverskih paterna na primeru salona automobila 11


FON, seminarski rad iz Softverskih paterna

public class Audi extends ApstraktniAutomobil// ConcreteBuilder1


{
public void kreirajGume()
{
auto.setGume(new LetnjaGuma());
}
public void kreirajBoju()
{
auto.setBoja(new PlavaBoja());
}

public void kreirajBrojVrata()


{
auto.setBrojVrata(new PetoroVrata());
}
public String vratiPonudu()
{
return "automobil sa gumama "+auto.getGume().vratiGume()+" boje
"+auto.getBoja().VratiBoju()+" broj vrata: "+auto.getBrojVrata().VratiBrojVrata();
}
}

public class BMW extends ApstraktniAutomobil


{
public void kreirajGume()
{
auto.setGume(new ZimskaGuma());
}

public void kreirajBoju()


{
auto.setBoja(new CrvenaBoja());
}

public void kreirajBrojVrata()


{
auto.setBrojVrata(new CetvoroVrata());
}

public String vratiPonudu()


{
return "automobil sa gumama "+auto.getGume().vratiGume()+" boje
"+auto.getBoja().VratiBoju()+" broj vrata: "+auto.getBrojVrata().VratiBrojVrata();
}
}

Tema Primena softverskih paterna na primeru salona automobila 12


FON, seminarski rad iz Softverskih paterna

public interface Boja // AbstractProductA


{ String VratiBoju();}

public class CrvenaBoja implements Boja


{ public String VratiBoju() { return "Crvena Boja";} }

public class PlavaBoja implements Boja


{ public String VratiBoju(){ return "PlavaBoja"; } }

public interface Gume //AbstractProductB


{ String vratiGume();}

public class LetnjaGuma implements Gume


{ public String vratiGume(){return "Letnja guma"; } }

public class ZimskaGuma implements Gume


{ public String vratiGume(){ return "Zimska guma"; }}

public interface BrojVrata // AbstractProductC


{ int VratiBrojVrata();}

public class PetoroVrata implements BrojVrata


{ public int VratiBrojVrata(){return 5; } }

public class CetvoroVrata implements BrojVrata


{ public int VratiBrojVrata() { return 4; } }

Tema Primena softverskih paterna na primeru salona automobila 13


FON, seminarski rad iz Softverskih paterna

Proxy
Jedan od razloga za kontrolisanje pristupa objektu jeste da se odloe puni trokovi
njegovog pravljenja i inicijalizovanja do trenutka kada zaista treba da ga upotrebimo.

Definicija
Obezbeuje posrednika za pristupanje drugom objektu kako bi se omoguio
kontrolisani pristup do njega.

Analogija sa ivotnim situacijama:

Postoje razne situacije koje mogu da se poistovete sa primenom Proxy paterna u


programiranju. Pretpostavimo da nam treba novac da odemo u samoposlugu. Znai, otii
emo do bankomata, podii novac, ili emo platiti na kasi samoposluge ekom. A ta se u
ovoj situaciji radilo ranije kada nije postojao bankomat? Pa uzeli bismo tednu knjiicu
otili do banke, uzeli obrasce, ekali u redu, podigli novac i onda otili u samoposlugu.
Na ovaj nain moemo rei da su bankomat ili ek na proksi do banke. Plaajui ekom
nismo svesni da u stvari ne vrimo plaanje, nego tu obavezu prosleujemo banci.

Tema Primena softverskih paterna na primeru salona automobila 14


FON, seminarski rad iz Softverskih paterna

Primer salona automobila:

Nakon odreenog vremena klijent se vraa u salon da jo jednom isproba BMW


koji mu se svideo proli put. U meuvremenu automobil koji mu se zaista svideo je
prodat, a automobil koji mu je sada na raspolaganju je pozajmljen iz drugog salona i na
izgled je potpuno identian sa starim, ali odreene karakteristike im se ipak razlikuju. Uz
sebe klijent nosi i katalog starog automobila koji je dobio na poklon proli put, tako da
klijent na raspolaganju ima katalog prodatog automobila (Subject), a ispred sebe novi
automobil. Klijent gleda karakteristike prodatog BMW-a koji u ovoj situaciji predstavlja
Proxy, posto klijen misli da isprobava BMW koji je probao i proli put, a u stvari proba
BMW RealSubject iz drugog salona.

Tema Primena softverskih paterna na primeru salona automobila 15


FON, seminarski rad iz Softverskih paterna

Adapter patern
Ponekad postoji potreba da se postojea klasa upotrebi poto nam prua neke ili
sve mogunosti koje su nam potrebne, ali njen interfejs nije usklaen sa interfejsom koji
nam je potreban. Tada je prilika da se upotrebi Adapter patern koji konvertuje interfejs
postojee klase u drugi interfejs koji klijenti oekuju. Dakle, Adapter omoguava
saradnju klasa koje inae ne bi mogle da sarauju zbog nekompatibilnosti njihovih
interfejsa. Njegovom primenom moemo napraviti viestruko upotrebljivu klasu, koja je
u mogunosti da sarauje sa nepovezanim i nepredvienim klasama, tj. sa klasama koje
mogu da imaju nekompatibilne interfejse.
Kod adapter paterna imamo dakle postojeu klasu koja klijentu sa jedne strane
moe da poslui, jer poseduje odreene funkcionalnosti koje su mu potrebne, ali nije u
mogunosti da je iskoristi, poto ne zna kako da radi sa njom. Postojea klasa ima svoj
interfejs (Adaptee) koji ne moe da proita. Adapter nasleuje neitljiv interfejs
(Adaptee) i prilagoava ga itljivom interfejsu (Target), koji predstavlja novi interfejs sa
kojim klijent moe da ostvari interakciju, koji je specifian za domen koji on koristi.

Ovo prilagoavanje interfejsa omoguava da ugradimo klasu u postojee sisteme


koji oekuju drugaiji interfejs od postojeeg.

Analogija sa ivotnim situacijama

Dobili smo pojaalo za gitaru (Clijent), od tetke iz Amerike, koje radi na 120V
(Target), a dobro je poznato da je napon kod nas (Adaptee) 220V. Ukoliko elimo da ga
upotrebimo i na svirkama koje se odrzavaju u Srbiji, sve sto treba da uradimo je da
(primenimo adapter patern) kupimo transformator (Adapter) koji ce nam konvertovati
200V u 120V, i uiniti nase pojaalo upotrebljivim.

Tema Primena softverskih paterna na primeru salona automobila 16


FON, seminarski rad iz Softverskih paterna

Primer salona automobila:

Nakon odreenog vremena prodavac objanjava klijentu situaciju u kojoj se


naao, i daje mu katalog novog automobila. Novi katalog predstavlja Target u Adapter
paternu, a stari katalog Adaptee . Prodavac objanjava klijentu da je novi automobil u
stvari isti kao i predhodni sa neznatno malim izmenata koje su u starom katalogu morale
biti izmenjene.

Tema Primena softverskih paterna na primeru salona automobila 17


FON, seminarski rad iz Softverskih paterna

Proxy and Adapter

public class Adapter implements KatalogBMWAutomobila //Adapter


{ Katalog katalog;
public Adapter(Katalog katalog) { this.katalog = katalog; }
public void BojaBMWAutomobila()
{ katalog.BojaAutomobila(); }
public void BrojBMWVrataAutomobila()
{ katalog.BrojVrataAutomobila(); }
public void GumeBMWAutomobila()
{ katalog.GumeAutomobila(); }
}

public class Auto


{
Boja boja;
BrojVrata brojvrata;
Gume gume;

public String PrikaziAuto()


{
return "Boja automobila "+boja.VratiBoju()+"\n Broj vrata
"+brojvrata.VratiBrojVrata()+"\nGume "+gume.vratiGume();

}
}

Tema Primena softverskih paterna na primeru salona automobila 18


FON, seminarski rad iz Softverskih paterna

public class BMW implements Katalog //Proxy


{ BMWDrugiServis X5;
public BMW(BMWDrugiServis X5) { this.X5 = X5; }
public void BojaAutomobila()
{ X5.BojaAutomobila(); }
public void BrojVrataAutomobila()
{ X5.BrojVrataAutomobila(); }
public void GumeAutomobila()
{ X5.GumeAutomobila(); }
public Auto vratiAutomobil()
{ return X5.vratiAutomobil(); }

public class BMWDrugiServis implements Katalog //RealSubject


{
Auto auto;

BMWDrugiServis()
{
auto=new Auto();
}
public void BojaAutomobila()
{
auto.boja=new CrvenaBoja();
}
public void BrojVrataAutomobila()
{
auto.brojvrata = new PetoroVrata();
}
public void GumeAutomobila()
{
auto.gume= new LetnjaGuma();
}

public Auto vratiAutomobil()


{
return auto;
}

}
public interface Boja
{
String VratiBoju();
}

Tema Primena softverskih paterna na primeru salona automobila 19


FON, seminarski rad iz Softverskih paterna

public interface BrojVrata


{
int VratiBrojVrata();
}

public enum Cena


{
velika,
mala
};

public class CetvoroVrata implements BrojVrata


{
public int VratiBrojVrata(){return 4; }
}
public class CrvenaBoja implements Boja
{
public String VratiBoju() { return "Crvena Boja";}
}

public interface Gume


{
String vratiGume();
}

public interface Katalog//Adaptee u Adapter paternu, Subject u Proxy paternu


{
void BojaAutomobila();
void BrojVrataAutomobila();
void GumeAutomobila();

Auto vratiAutomobil();
}

public interface KatalogBMWAutomobila //Target


{
void BojaBMWAutomobila();
void BrojBMWVrataAutomobila();
void GumeBMWAutomobila();

Tema Primena softverskih paterna na primeru salona automobila 20


FON, seminarski rad iz Softverskih paterna

public class Klijent { //Client adapter

KatalogBMWAutomobila katalogBMWAutomobila;

public Klijent(KatalogBMWAutomobila katalogBMWAutomobila) {


this.katalogBMWAutomobila = katalogBMWAutomobila;
}

public void Konstruisi()


{
katalogBMWAutomobila.BojaBMWAutomobila();
katalogBMWAutomobila.BrojBMWVrataAutomobila();
katalogBMWAutomobila.GumeBMWAutomobila();
}
public static void main(String[] args)
{
Klijent Filip;
KatalogBMWAutomobila katalog;
BMWDrugiServis X5Drugi=new BMWDrugiServis();
BMW X5=new BMW(X5Drugi);
katalog=new Adapter(X5);
Filip=new Klijent(katalog);
Filip.Konstruisi();
System.out.println("BMW X5 "+X5.vratiAutomobil().PrikaziAuto());
}

public class LetnjaGuma implements Gume


{
public String vratiGume(){return "Letnja guma"; }
}
public class PetoroVrata implements BrojVrata
{
public int VratiBrojVrata(){return 5; }
}

public class PlavaBoja implements Boja


{
public String VratiBoju() { return "Plava boja";}
}

public class ZimskaGuma implements Gume


{
public String vratiGume(){return "Zimska guma"; }
}

Tema Primena softverskih paterna na primeru salona automobila 21


FON, seminarski rad iz Softverskih paterna

Chain of responsibility

Definicija

Izbegava neposredno vezivanje poiljaoca zahteva sa njegovim primaocem dajui


ansu da vie objekata rukuje zahtevom. Povezuje objekte primaoce i prosleuje zahtev
niz lanac dok ga neki objekat ne obradi.

Chain of responsibility treba upotrebiti kada vie objekata moe da obradi zahtev,
ali se unapred ne zna koji e ga obraditi. Zahtev se kree u hijerarhiji objekata sve dok
neki objekat ne uzme odgovornost da ga obradi. Na ovaj nain se uproava meusobno
povezivanje objekata jer oni imaju reference samo na svog sledbenika. Poto on nema
eksplicitnog primaoca, ne postoji garancija da e on biti obraen, moe se desiti da doe
do kraja lanca, a da ga niko ne obradi.

Analogija sa ivotnim situacijama

Slian mehanizam se koristi prilikom vieslojnog filtriranja ljunka. Recimo da


imamo takav neki vieslojni filter i ljunak razliitih veliina. elimo da dobijemo
razliite grupe ljunka priblino istih veliina. Postaviemo ljunak u filter i podesiti ga
na maksimalnu veliinu, i na taj nain dobiti najvee komade ljunka, a zatim proces
ponavljati sve dok ne dobijemo najfinije estice. Svaki od filtera e imati neke veliine
koje nee moi da propusti i koje e ostaviti sledeem filteru da ih obradi .

Tema Primena softverskih paterna na primeru salona automobila 22


FON, seminarski rad iz Softverskih paterna

Primer salona automobila

Klijent se interesuje za mesta gde i po kojoj ceni moze da obavi servis automobila
ukoliko kupi BMW. Posto je klijent iz Stare Pazove, poziva BMW servis koji se tamo
nalazi, i oni mu nabavljaju adrese svih ostalih BMW servisa na teritoriji Srbije.
Sekretarica uzima tefter i zove najblii BMW servis iz Beograda, sa kojim imaju najbolju
saradnju i trai od njih eljene podatke o njima i o ostalim servisima. Nadleni u servisu
iz Beograda ponavljaju ovaj postupak na isti nain.

Tema Primena softverskih paterna na primeru salona automobila 23


FON, seminarski rad iz Softverskih paterna

Memento
Definicija
Bez naruavanja enkapsulacije, preuzima i ispoljava unutranje stanje objekta da
bi se objekat kasnije mogao vratiti u to stanje.

Ovaj patern treba koristiti kada elimo da sauvamo snimak stanja nekog objekta, da bi
se on kasnije mogao vratiti u to stanje. Informacije o stanju moraju biti negde sauvane i
za to je zaduen Memento. On uva stanje objekta i predstavlja neku vrstu podsetnika, a
jedini ko moe da ga proita jeste Originator koji je podsetnik ujedno i kreirao.

Analogija sa ivotnim situacijama

Zamislite da igrate kompjutersku igricu sa drugarima, i da ste veoma okupirani


njom, danima pokuavate da dostignete famozni nivo 13, koji predstavlja kraj igre. Kako
provodimo dane sedei za igricom napredujemo korak po korak, i svaki dan je izvesnije
da se bliimo kraju. Posle tolikog truda i napora, sasvim je razumljivo neraspoloenje
kada va lik iz igrice postane mrtav, a vi morate da ponete sve iz poetka. Zbog toga
mogunost da se sauva rezultat postignut da nivoa koji nikako ne moemo da preemo,
kao i mogunost da nastavimo odatle sa normalnim sposobnostima, izaziva pravo
oduevljenje.
Moda e se neko usprotiviti to stavljam ovaj primer kao realnu ivotnu
situaciju, poto se odnosi na kompjutersku igru, ali moramo priznati da one postaju
sastavni deo dananje realnosti.

Tema Primena softverskih paterna na primeru salona automobila 24


FON, seminarski rad iz Softverskih paterna

Primer salona automobila:

Na samom kraju ostaje jo samo da se izabere vrsta osiguranja. Sto se toga tice,
klijent je vrlo neodluan. On se u zavisnosti od karakteristika automobila premilja da li
da plati veliku sumu novca za osiguranje, za sta mu kau da je za nju predvidjeno kasko
osiguranje, ili malu za sta je predvidjeno AMS osiguranje. Posle dueg razmiljanja,
odluuje se da uzme Kasko, poto je u njemu predviena kompletna zatita. Nakon
potpisivanja ugovora, na momenat mu se uinilo da je preskupo, i klijent ipak odluuje da
uzme AMS zbog osetne razlike u ceni. Nakon potpisa ovog novog ugovora, klijent pod
pritiskom ostatka porodice, ipak poputa i pristaje da uzme Kasko osiguranje, nakon ega
dobija ugovor koji je potpisao pre toga. (Ovaj problem je resen pomou Memento uzora).
Klijent odlazi zadovoljan iz salona u svom novom BMW dipu, X5.

Tema Primena softverskih paterna na primeru salona automobila 25


FON, seminarski rad iz Softverskih paterna

Command
Definicija

Enkapsulira zahtev kao objekat ime omoguava parametrizaciju klijenata sa


razliitim zahtevima, redovima za ekanje, ili zahtevima za formiranje dnevnika rada, i
podrava operacije ije se dejstvo moe ponititi.
Ponekad je potrebno izdati zahteve objektima, a da se nita ne zna o zahtevanoj
operaciji niti o primaocu zahteva. Jednostavno izdavaa zahteva ne interesuje ko e
njegov zahtev izvriti, njemu je bitno samo da ima to to eli da ima. Command patern u
sutini razdvaja objekat koji aktivira situaciju od objekta koji ima potrebna saznanja da
operaciju izvri.
Ovaj patern se razlikuje od Chain of responsibility paterna po tome to kod ovog
drugog zahtev ide od objekta do objekta, dok ne nae onog koji moe da preuzme
odgovornost i obradi ga. Command patern, meutim, nalazi objekat shodno zahtevima i
upoljava samo njega.

Analogija sa ivotnim situacijama

Klasian primer ovoga je restoran. Gost dolazi u restoran, naruuje sa jelovnika


ono to mu se najvie svia. Konobar uzima porudbinu, (u ovom sluaju komandu) i
odlazi do kuhinje. Tamo se nalazi nekoliko kuvara specijalizovanih za pravljenje samo
odreenih vrsta jela sa jelovnika. Konobar na osnovu porudbine zna kom kuvaru predaje
porudbinu. Kuvar priprema jelo, predaje ga konobaru koji kasnije slui gosta.
Kada bismo napravili analogiju sa gore priloenom slikom, Invoker bi bio gost
koji na osnovu jelovnika (Command ) eli da mu se pripremi obrok (ConcreteCommand).
Konobar (Client) za eljeni obrok zna koji kuvar (Receiver) treba da ga pripremi.

Tema Primena softverskih paterna na primeru salona automobila 26


FON, seminarski rad iz Softverskih paterna

Primer salona automobila

Nakon godinu dana uspene vonje, klijent odluuje da obavi servis. Klijent nema
vremena, niti eli sam da pronae BMW servis koji mu to moe odraditi. Odlazi u salon
automobila, poto mu u katalogu pie da ukoliko eli da obavi servis svog automobila
pod odreenim novanim olakicama, prvo mora da ode do salona u kome je kupio
automobil, tamo da plati servis i ostavi auto na par dana. U servisu postavlja pitanje
prodavcu o ceni servisa BMW automobila, a on poziva kancelariju BMW servisa koja se
nalazi u Beogradu i koja je zaduzena za sve BMW servise na teritoriji Srbije, i oni ga
obavestavaju da je cena 3000 eura. (Ovaj problem se resio primenom Command uzora).
Nakon par dana klijent dolazi po svoj auto, ne znajui u kom od servisa je on servisiran.

Tema Primena softverskih paterna na primeru salona automobila 27


FON, seminarski rad iz Softverskih paterna

Chain of responsibility, Memento i Command

Tema Primena softverskih paterna na primeru salona automobila 28


FON, seminarski rad iz Softverskih paterna

package MementoChainOfResponsibilityCommand;

/**
*
* @author Filip Radulovic 9/05
*/

public interface Boja


{
String VratiBoju();
}

public interface BrojVrata


{
int VratiBrojVrata();
}

public interface Gume{


String vratiGume();
}

public interface Osiguranje{


String VratiFirmu();
}

public enum Cena{


velika, mala
};

public class CetvoroVrata implements BrojVrata


{
public int VratiBrojVrata(){return 4; }
}

public class PetoroVrata implements BrojVrata


{ public int VratiBrojVrata(){return 5; }}

public class PlavaBoja implements Boja


{ public String VratiBoju() { return "Plava boja";}}

Tema Primena softverskih paterna na primeru salona automobila 29


FON, seminarski rad iz Softverskih paterna

public class CrvenaBoja implements Boja


{ public String VratiBoju() { return "Crvena Boja";}}

public class LetnjaGuma implements Gume


{ public String vratiGume(){return "Letnja guma"; }}

public class ZimskaGuma implements Gume


{ public String vratiGume(){return "Zimska guma"; }}

public class AMS implements Osiguranje


{ public String VratiFirmu() { return "AMS"; }}

public class Kasko implements Osiguranje{


public String VratiFirmu()
{
return "Kasko";
}
}

public class Auto


{
Boja boja;
BrojVrata brojvrata;
Gume gume;
Osiguranje osiguranje;

public String PrikaziAuto()


{
return "Boja automobila "+boja.VratiBoju()+"\n Broj vrata
"+brojvrata.VratiBrojVrata()+"\nGume "+gume.vratiGume()+"\n Osiguranje
"+osiguranje.VratiFirmu();

}
}

public interface Katalog //Comamnd- comamnd


{
void BojaAutomobila();
void BrojVrataAutomobila();
void GumeAutomobila();
void osiguranjeAutomobila(Cena cena);
String prikaziAdresuServisa();//Chain of responsibility ima i u servisu
String CenaServisa();
Auto vratiAutomobil();}

Tema Primena softverskih paterna na primeru salona automobila 30


FON, seminarski rad iz Softverskih paterna

public class BMW implements Katalog //Client Chain of responsibility


//Comand- ConcreteCommand
{
Auto auto;
Servis servis;
public BMW( Servis servis) {
this.servis = servis;
}
public void postaviServis(Servis servis)
{
this.servis=servis;
}

BMW()
{ auto=new Auto(); }
public void BojaAutomobila() { auto.boja=new CrvenaBoja(); }

public void BrojVrataAutomobila()


{ auto.brojvrata = new PetoroVrata(); }

public void GumeAutomobila()


{ auto.gume= new LetnjaGuma(); }

public void osiguranjeAutomobila(Cena cena)


{ if(cena==cena.velika)
{ auto.osiguranje=new Kasko(); }
else { auto.osiguranje=new AMS(); } }

public String prikaziAdresuServisa()


{
return servis.prikaziAdresuServisa();
}
public Auto vratiAutomobil()
{ return auto; }

public String CenaServisa()


{
return servis.ProcenaCeneServisa();
}

Tema Primena softverskih paterna na primeru salona automobila 31


FON, seminarski rad iz Softverskih paterna

public class BMWServisBeograd extends Servis //ConcreateHandler1 Chain of


responsibility //Chain of responsibility - ConcreateHandler1
{
BMWServisBeograd(Servis servis, boolean BMWServis)
{ super(servis,BMWServis); }

public String vratiAdresu()


{
return "BMW servis Radulovic\nTosin Bunar 35,11000
Beograd\n===================";
}

public String ProcenaCeneServisa() { return " "; }


}

public class BMWServisNoviSad extends Servis//ConcreateHandler2 Chain of


responsibility //Chain of responsibility ConcreateHandler2
{
BMWServisNoviSad(Servis servis, boolean BMWServis)
{ super(servis,BMWServis); }

public String vratiAdresu()


{
return "BMW servis Radulovic\nLaze teleckog 45,21000 Novi
Sad\n===================";
}
public String ProcenaCeneServisa()
{ return " "; }}

public class BMWServisStaraPazova extends Servis//ConcreateHandler3 Chain


of responsibility //Chain of responsibility ConcreateHandler3
{ BMWServisStaraPazova(Servis servis, boolean BMWServis)
{ super(servis,BMWServis); }
public String vratiAdresu()
{
return "BMW servis Radulovic\nJana Sikore 15,23000 Stara
Pazova\n===================";
}
public String ProcenaCeneServisa()
{ return " "; }
}

Tema Primena softverskih paterna na primeru salona automobila 32


FON, seminarski rad iz Softverskih paterna

public class BmwKancelarija extends Servis //Command-receiver


{ public String vratiAdresu() {
return "Knaza Milosa 34, 11000 BEograd";
}

public String ProcenaCeneServisa()


{ return "Cena servisa je 3000 eura"; }
}

public class KarakteristikePonudeAutomobila //MEMENTO ORIGINATOR


{
Katalog automobil;

KarakteristikePonudeAutomobila(Ugovor automobil)
{
this.automobil=automobil;
}

public void SkladistiUgovor(Ugovor ugovor ) // Set Memento


{
automobil=ugovor .uzmiStanjeAutomobila();
}
public Ugovor kreirajUgovor () // Create Memento
{
Ugovor ugovor =new Ugovor ();
ugovor .PostaviStanjeAutomobila(automobil);
return ugovor ;
}

void Upisi(Cena cena)


{
automobil.BojaAutomobila();
automobil.BrojVrataAutomobila();
automobil.GumeAutomobila();
automobil.osiguranjeAutomobila(cena);
}
}

Tema Primena softverskih paterna na primeru salona automobila 33


FON, seminarski rad iz Softverskih paterna

public class Kupac //Memento CareTaker, Command-invoker


{
static Ugovor ugovor ;//Memento
Katalog katalog;

public Kupac() { }
public Kupac(Katalog katalog)
{ this.katalog=katalog; }

void UzmiKatalog(Katalog katalog)


{ this.katalog=katalog; }

String DajAdreseServisa()
{ return katalog.prikaziAdresuServisa(); }

String DajCenuServisa ()
{ return katalog.CenaServisa(); }

public static void main(String[] args)


{
//Command
Prodavac PetarPetrovic=new Prodavac();
Kupac Filip=new Kupac(PetarPetrovic.VratiKatalog());
System.out.println(Filip. DajCenuServisa ());

//Chain of responsiibility
BMWServisBeograd BG=new BMWServisBeograd(null, true);//Chain of
responsiibility
BMWServisNoviSad NS=new BMWServisNoviSad(BG, true);//Chain of
responsiibility
BMWServisStaraPazova SP=new BMWServisStaraPazova(NS, true);
BMW X5=new BMW();
X5.postaviServis(SP);
Filip.UzmiKatalog(X5);
System.out.println("Adrese "+Filip.DajAdreseServisa());

//Memento
//Prva Ponuda
KarakteristikePonudeAutomobila karakteristike=new
KarakteristikePonudeAutomobila(X5);
karakteristike.Upisi(Cena.velika);
ugovor =karakteristike.kreirajUgovor ();
System.out.println("Automobil
BMW\n"+X5.vratiAutomobil().PrikaziAuto());

Tema Primena softverskih paterna na primeru salona automobila 34


FON, seminarski rad iz Softverskih paterna

//DrugaPonuda
X5=new BMW();
karakteristike=new KarakteristikePonudeAutomobila(X5);
karakteristike.Upisi(Cena.mala);

System.out.println("Automobil
BMW\n"+X5.vratiAutomobil().PrikaziAuto());

//Vracanje na prvu ponudu


karakteristike.SkladistiUgovor(ugovor );
System.out.println("Automobil
BMW\n"+karakteristike.automobil.vratiAutomobil().PrikaziAuto());
}
}

public class Prodavac // Command -Clent


{
BmwKancelarija bk;
Katalog katalog;

public Prodavac() {
bk=new BmwKancelarija();
katalog=new BMW(bk);

}
public Katalog VratiKatalog()
{
return katalog;
}

abstract class Servis//Hendler Chain of responsibility


{
Servis servis;
boolean BMWServis;

public Servis() {
}

public Servis(Servis servis, boolean BMWServis) {


this.servis = servis;
this.BMWServis = BMWServis;
}

Tema Primena softverskih paterna na primeru salona automobila 35


FON, seminarski rad iz Softverskih paterna

String prikaziAdresuServisa()
{
String adrese="";
if(BMWServis==true)
{
adrese="\nAdresa:"+vratiAdresu()+" ";
}
if(servis!=null)
{
adrese=adrese+servis.prikaziAdresuServisa();
}
return adrese;
}

abstract String vratiAdresu();


abstract String ProcenaCeneServisa();

public class Ugovor //Memento- Memento


{
Katalog automobil;

void SastaviUgovor (Katalog automobil)


{ this.automobil=automobil; }

Katalog PredajUgovor ()
{ return automobil; }
}

Tema Primena softverskih paterna na primeru salona automobila 36


FON, seminarski rad iz Softverskih paterna

Rezultat programa

Tema Primena softverskih paterna na primeru salona automobila 37


FON, seminarski rad iz Softverskih paterna

Literatura

Gotova reenja- elementi objektno orijentisanog softvera, Erich Gamma,


Richard Helm, Ralph Johnson, John Vlissides
Head First - Design Patterns, Eric Freeman, Elisabeth Freeman, Kathy Sierra,
Bert Bates

Tema Primena softverskih paterna na primeru salona automobila 38

You might also like