41
Dizajn paterni Command, Template method, Prototype dr Zoran Jeremić [email protected] 1

T 3.6 design paterni (b)

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: T 3.6 design paterni (b)

Dizajn paterni Command, Template method, Prototype

dr Zoran Jeremić [email protected]

1

Page 2: T 3.6 design paterni (b)

COMMAND Paterni ponašanja

2

Page 3: T 3.6 design paterni (b)

3

Page 4: T 3.6 design paterni (b)

4

Page 5: T 3.6 design paterni (b)

5

Page 6: T 3.6 design paterni (b)

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

Page 7: T 3.6 design paterni (b)

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

Page 8: T 3.6 design paterni (b)

8

Page 9: T 3.6 design paterni (b)

9

Page 10: T 3.6 design paterni (b)

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

Page 11: T 3.6 design paterni (b)

Još primera upotrebe

11

Page 12: T 3.6 design paterni (b)

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

Page 13: T 3.6 design paterni (b)

13

Page 14: T 3.6 design paterni (b)

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

Page 15: T 3.6 design paterni (b)

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

Page 16: T 3.6 design paterni (b)

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

Page 17: T 3.6 design paterni (b)

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

Page 18: T 3.6 design paterni (b)

TEMPLATE METHOD Paterni ponašanja

18

Page 19: T 3.6 design paterni (b)

19

Page 20: T 3.6 design paterni (b)

Problem

• Recept za kafu – Prokuvati vodu – Staviti kafu u ključalu

vodu – Sipati kafu u šolju – Dodati šećer i mleko

• Recept za čaj – Prokuvati vodu – Staviti čaj u ključalu vodu – Sipati čaj u šolju – Dodati limun

20

Page 21: T 3.6 design paterni (b)

Klasa Coffee

21

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”); } }

Page 22: T 3.6 design paterni (b)

Klasa Tea

22

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”); } }

Page 23: T 3.6 design paterni (b)

Dijagram klasa sa apstrakcijom

23

Page 24: T 3.6 design paterni (b)

Problem

Prokuvati vodu

Staviti kafu (ili čaj) u ključalu vodu

Sipati kafu (ili čaj) u šolju

Dodati šećer i mleko (ili limun)

24

Ove dve su već abstrakovane u osnovnu klasu

Nisu abstrakovane ali su u suštini iste, samo primenjuju drugi napitak.

Coffee void prepareRecipe() { boilWater(); brewCoffeeGrinds(); pourInCup(); addSugarAndMilk();

Tea void prepareRecipe() { boilWater(); steepTeaBag(); pourInCup(); addLemon();

void prepareRecipe() { boilWater(); brew(); pourInCup(); addCondiments();

Page 25: T 3.6 design paterni (b)

Klasa CaffeineBeverage

25

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”); } }

Page 26: T 3.6 design paterni (b)

Klase Coffee i Tea

26

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”); } }

Page 27: T 3.6 design paterni (b)

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

Page 28: T 3.6 design paterni (b)

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

Page 29: T 3.6 design paterni (b)

Template method - struktura

29

Page 30: T 3.6 design paterni (b)

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

Page 31: T 3.6 design paterni (b)

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

Page 32: T 3.6 design paterni (b)

PROTOTYPE Gradivni paterni

32

Page 33: T 3.6 design paterni (b)

Prototype (prototip)

33

Page 34: T 3.6 design paterni (b)

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

Page 35: T 3.6 design paterni (b)

Prototype

Namena Određuje vrste objekata koji se prave koristeći prototipski

primerak i pravi nove objekte kopiranjem tog prototipa.

35

Page 36: T 3.6 design paterni (b)

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

Page 37: T 3.6 design paterni (b)

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

Page 38: T 3.6 design paterni (b)

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

Page 39: T 3.6 design paterni (b)

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

Page 40: T 3.6 design paterni (b)

Prototype - struktura

40

Page 41: T 3.6 design paterni (b)

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