6. Problem koji treba rešiti
Imamo jednostavan daljinski upravljač sa većim brojem
on i off dugmadi i skup klasa različitih proizvođača koje
se u značajnoj meri razlikuju.
Metode on(), off(), setTemperature(), setVolume(),
setDirection()...
Možemo očekivati još različitih proizvođača u
budućnosti.
Daljinski je “glup” i prepoznaje samo generičke zahteve.
Na koji način ćemo dizajnirati akcije kao što su “Uključi
svetlo”, “otvori garažu”...
6
7. Command
Namena
Enkapsulira zahtev kao objekat čime omogućava 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.
Poznat takođe kao
Action (akcija), Transaction (transakcija)
Problem
Potrebno je da prosleđuje zahteve objekata bez ikakvog znanja
o operaciji koja se zahteva ili o primaocu zahteva
7
10. Command patern
Klijent kreira ConcreteCommand objekat i definiše njegove prijemnike.
Invoker objekat smešta ConcreteCommand objekat.
Invoker izdaje zahtev pozivanjem Execute command objekta. Kada su komande
poništive (undo), ConcreteCommand čuva stanje za poništavanje pre pozivanja
Execute.
ConcreteCommand objekat poziva operacije na svom prijemniku da bi izvršio zahtev.
10
12. Još primera upotrebe
Konobar uzima narudžbenicu, ili komandu od mušterije i enkapsulira
zahtev pišući ga na formularu. Narudžbenica (formular) se stavlja u red
brzih jela. Formulari ne zavise od menija i stoga se mogu koristiti za
podršku naručivanja različitih jela.
Primer
12
14. Još primera upotrebe
Meniji implementirani korišćenjem Command
Svaki izbor u Menu klasi je instanca MenuItem klase. Klasa
Application kreira ove menije i njihove elemente kao i ostatak
korisničkog interfejsa. Klasa Application takođe čuva podatak o
Document objektima koje je korisnik otvorio.
Klasa Application konfiguriše svaki MenuItem korišćenjem
instance konkretne Command podklase. Kada korisnik selektuje
MenuItem, MenuItem poziva Execute na svojoj komandi, i
Execute izvršava operaciju.
14
15. Još primera upotrebe
MenuItem ne zna koje podklase klase Command koristi.
Command podklase čuvaju prijemnik zahteva i pozivaju
jednu ili više operacija na prijemniku <<npr next slide>>
Na primer, PasteCommand podržava paste teksta sa
klipborda u Document. Prijemnik PasteCommand klase
je Document objekat. Execute operacija poziva Paste na
primajućem Document objektu.
15
16. Command - primenljivost
Command upotrebite u sledećim slučajevima:
Kada hoćete da parametrizujete objekte akcijom koju treba da
izvrše, kao npr MenuItem. Takvu parametrizaciju možete u
proceduralnom jeziku izraziti funkcijom za uzvraćanje poziva, tj.
funkcijom koja je negde registrovana da bi se kasnije pozivala.
Kada želite da navedete, poređate i izvršite zahteve u različito
vreme. Objekat Command može da ima životni ciklus nezavisan
od prvobitnog zahteva. Ako primalac zahteva može da se
predstavi na način nezavistan od adresnog prostora, možete
objekat komande za taj zahtev da prenesete drugom procesu i
tamo izvršite zahtev.
16
17. Command - primenljivost
Kada hoćete da podržite poništavanje akcije.
Kada hoćete da podržite evidentiranje promena da bi se one
mogle ponovo primeniti u slučaju pada sistema. Ako interfejs
Command proširite operacijama učitavanja i čuvanja, moći ćete
da održite trajnu evidenciju promena.
Ako želite da struktuirate sistem oko operacija višeg nivoa
izgrađenih od operacija na primitivnim objektima. Takva struktura
je uobičajena kod informacionih sistema koji podržavaju
transakcije.
17
20. Problem
• Recept za kafu • Recept za čaj
– Prokuvati vodu – Prokuvati vodu
– Staviti kafu u ključalu – Staviti čaj u ključalu vodu
vodu – Sipati čaj u šolju
– Sipati kafu u šolju – Dodati limun
– Dodati šećer i mleko
20
21. Klasa Coffee
public class Coffee {
void prepareRecipe() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}
public void boilWater() {
System.out.println(“Boiling water”);
}
public void brewCoffeeGrinds() {
System.out.println(“Dripping Coffee through filter”);
}
public void pourInCup() {
System.out.println(“Pouring into cup”);
}
public void addSugarAndMilk() {
System.out.println(“Adding Sugar and Milk”);
}
}
21
22. Klasa Tea
public class Tea {
void prepareRecipe() {
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
public void boilWater() {
System.out.println(“Boiling water”);
}
public void steepTeaBag() {
System.out.println(“Steeping the tea”);
}
public void addLemon() {
System.out.println(“Adding Lemon”);
}
public void pourInCup() {
System.out.println(“Pouring into cup”);
}
}
22
24. Problem
Prokuvati vodu Ove dve su već
Staviti kafu (ili čaj) u ključalu vodu abstrakovane u
osnovnu klasu
Sipati kafu (ili čaj) u šolju
Dodati šećer i mleko (ili limun) Nisu abstrakovane ali
su u suštini iste, samo
primenjuju drugi
napitak.
Coffee Tea
void prepareRecipe() {
void prepareRecipe() { void prepareRecipe() {
boilWater();
boilWater(); boilWater();
brew();
brewCoffeeGrinds(); steepTeaBag();
pourInCup();
pourInCup(); pourInCup();
addCondiments();
addSugarAndMilk(); addLemon();
24
25. Klasa CaffeineBeverage
public abstract class CaffeineBeverage {
void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments);
}
abstract void brew();
abstract void addCondiments();
public void boilWater() {
System.out.println(“Boiling water”);
}
public void pourInCup() {
System.out.println(“Pouring into cup”);
}
}
25
26. Klase Coffee i Tea
public class Coffee extends CaffeineBeverage{
public void brew() {
System.out.println(“Dripping Coffee through filter”);
}
public void addCondiments() {
System.out.println(“Adding Sugar and Milk”);
}
}
public class Tea extends CaffeineBeverage{
public void brew() {
System.out.println(“Steeping the tea”);
}
public void addCondiments() {
System.out.println(“Adding Lemmon”);
}
}
26
27. Template method
Namena
Definiše skelet algoritma u nekoj operaciji prepuštajući
implementaciju nekih koraka potklasi. Template metod
dozvoljava da potklase redefinišu neke korake altoritma ne
menjajući strukturu altoritma.
27
28. Template method - primer
Graditelji kuća koriste Template metod kada razvijaju novi ogranak. Tipičan
ogranak se sastoji od ograničenog broja planova spratova, sa različitim
varijantama za svaki plan sprata. Unutar plana sprata, osnova, okviri,
vodovodne cevi i električna instalacija su identični za svaku kuću. Varijacije
se uvode u kasnijim fazama konstrukcije da bi proizveli veći broj modela.
Primer
28
30. Template method - primenljivost
Za impementiranje nepromenljivih delova algoritma na
jednom mestu i prepuštanje implementacije ponašanja
koje se menja potklasama.
Kada ponašanje zajedničko za potklase treba izdvojiti i
staviti u zajedničku klasu da bi se izbeglo dupliranje
koda.
Za kontrolisanje proširivanja potklasa. Možete da
definišete šablonski metod koji na određenim tačkama
poziva “priljučene” operacije i na taj način dopušta
proširivanje samo u tim tačkama.
30
31. Template method - posledice
Template method poziva sledeće vrste operacija:
Konkretne operacije (iz ConcreteClass ili klijentske klase)
Konkretne operacije AbstractClass klase
Primitivne operacije (tj. Apstraktne operacije)
Proizvodne metode
Priključne operacije – obezbeđuju podrazumevano ponašanje
koje potklase mogu po potrebi da prošire. Priljučena operacija
često podrazumevano ništa ne radi.
31
34. Prototype
Određuje vrste objekata koji se prave koristeći prototipski primerak i
pravi nove objekte kopiranjem tog prototipa.
Prototipovi novih proizvoda se često izrađuju pre pune proizvodnje,
ali u ovom primeru prototip je pasivan i ne učestvuje u kopiranju
samog sebe. Deoba ćelija, koja rezultuje u dobijanju dve identične
ćelije, je primer kako prototip igra aktivnu ulogu u kopiranju samog
sebe i demonstrira Prototype patern. Kada se ćelija deli, dobijaju se
dve identične ćelije. Drugim rečima ćelija klonira samu sebe.
34
35. Prototype
Namena
Određuje vrste objekata koji se prave koristeći prototipski
primerak i pravi nove objekte kopiranjem tog prototipa.
35
36. Prototype - problem
Okruženje u primeru obezbeđuje apstraktnu klasu Graphic za
grafičke komponente, npr. beleške i note. Osim toga, ona
obezbeđuje apstraktnu klasu Tool za definisanje alata poput onih u
paleti.
Okruženje takođe definiše GraphicTool podklasu za alate koji
kreiraju instance grafičkih objekata i dodaje ih u dokument.
36
37. Prototype - problem
GraphicTool klasa pripada okruženju dok su alati za beleške i note
specifični u našoj aplikaciji. GraphicTool ne zna kako da kreira
instance naših muzičkih klasa. Mogli bismo da napravimo podklase
GraphicTool za svaku vrstu muzičkog objekta, ali tako bi nastalo
mnogo podklasa koje bi se razlikovale samo po vrsti muzičkog
objekta koji instanciraju. Sastavljanje objekata je fleksibilna
alternativa za potklase.
37
38. Prototype - rešenje
Rešenje je da se natera klasa GraphicTool da pravi nov
objekat klase Graphic kopiranjem ili kloniranjem neke
instance potklase klase Graphic. Tu instancu nazivamo
prototipom. Klasa GraphicTool se parametrizuje
prototipom koji treba da klonira i doda u dokument.
38
39. Prototype - primenjivost
Prototype treba da se koristi kada sistem ne sme da
zavisi od toga kako se njegovi proizvodi prave,
sastavljaju i predstavljaju,
Kada se klase koje treba instancirati određuju u vreme
izvršavanja, na primer dinamičkim učitavanjem
39
41. Prototype - posledice
Dodavanje i uklanjanje proizvoda u vreme izvršavanja
Određivanje novih objekata menjanjem vrednosti
Određivanje novih objekata menjanjem strukture
Smanjivanje broja podklasa
Dinamičko konfigurisanje aplikacije klasama
41