dizajn paterni
DESCRIPTION
Dizajn paterniTRANSCRIPT
![Page 1: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/1.jpg)
Dizajn paterniFactory, Abstract Factory, State, Model-View-Presenter,
Proxy
dr Zoran Jeremić[email protected]
1
![Page 2: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/2.jpg)
SIMPLE FACTORY, FACTORYMETHOD I ABSTRACT FACTORY
Paterni kreiranja
2
![Page 3: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/3.jpg)
Kada treba koristiti factory paterne
� Kada niste sigurni koju konkretnu implementaciju određenog interfejsa želite da vratite,
� Kreriranje treba da bude odvojeno od reprezentacije objekta,
� Imamo puno if/else blokova koji odlučuju koju konkretnu klasu treba kreirati
� Imamo puno switch iskaza koji odlučuju koju konkretnu klasu treba kreirati.
3
![Page 4: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/4.jpg)
Simple Factory
� Enkapsulira kreiranje objekta
� Omogućava donošenje kasnih odluka u vezi sa instaciranjem objekta� Na osnovu konfiguracije
� Na osnovu perzistentnih podataka� Na osnovu perzistentnih podataka
� Na osnovu ulaza ili drugih dinamičkih podataka
� Klasa pozivalac zna koji konkretni factory joj treba
4
![Page 5: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/5.jpg)
Opis problema
� Kada koristimo new mi zapravo instanciramo konkretnu klasu, tako da je to definitivno implementacija a ne interfejs.
Duck duck = new MallardDuck();
� Kada imamo skup povezanih konkretnih klasa, često pišemo kod poput ovog:
5
Duck duck;
If (picnic) {
duck = new MallardDuck();
} else if (hunting) {
duck = new DecoyDuck();
}else if (inBathTub){
duck = new RubberDuck();
}
![Page 6: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/6.jpg)
Opis problema
� Kod pisan kroz interfejse će raditi kroz polimorfizam sabilo kojom novom klasom koja implementira interfejs.
� Međutim kada imamo dosta konkretnih klasa, kod se mora menjati dodavanjem novih konkretnih klasa.
6
![Page 7: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/7.jpg)
Opis problema
Pizza orderPizza(){
Pizza pizza;
pizza.prepare();
Zbog fleksibilnosti
Pizza je abstraktna
klasa
7
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
![Page 8: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/8.jpg)
Opis problema
Pizza orderPizza(String type){
Pizza pizza = new Pizza ();
if (type.equals(“cheese”)) {
pizza = new CheesePizza();
} else if (type.equals(“greek”) {
pizza = new GreekPizza();
} else if (type.equals(“pepperoni”) {
Sada prosleđujemo
vrstu pice kao
argument
Na osnovu vrste pice
instanciramo
8
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
} else if (type.equals(“pepperoni”) {
pizza = new PepperoniPizza();
}
instanciramo
konkretnu klasu i
dodeljujemo je
promenljivoj pizza
![Page 9: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/9.jpg)
Opis problema
Pizza orderPizza(String type){
Pizza pizza = new Pizza ();
if (type.equals(“cheese”)) {
pizza = new CheesePizza();
} else if (type.equals(“greek”) {
pizza = new GreekPizza();
} else if (type.equals(“pepperoni”) {
pizza = new PepperoniPizza();
Kod se mora
konstantno menjati u
skladu sa ponudama
picerije
9
pizza = new PepperoniPizza();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
} else if (type.equals(“clam”)) {
pizza = new ClamPizza();
} else if (type.equals(“veggie”) {
pizza = new VeggiePizza();
}
Ovo nije u skladu sa
Open-Closed
principom
![Page 10: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/10.jpg)
Enkapsulacija kreiranja objekta
Pizza orderPizza(String type){
if (type.equals(“cheese”)) {
pizza = new CheesePizza();
} else if (type.equals(“pepperoni”) {
pizza = new PepperoniPizza();
} else if (type.equals(“clam”)) {
pizza = new ClamPizza();
} else if (type.equals(“veggie”) {
10
Pizza orderPizza(String type){
Pizza pizza = new Pizza ();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
} else if (type.equals(“veggie”) {
pizza = new VeggiePizza();
}
![Page 11: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/11.jpg)
Jednostavan pizza factory
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if (type.equals(“cheese”)) {
pizza = new CheesePizza();
} else if (type.equals(“pepperoni”)) {
pizza = new PepperoniPizza();
Metodu createPizza()
koriste svi klijenti za
instanciranje novih
objekata.
Ovaj kod je još uvek
11
pizza = new PepperoniPizza();
} else if (type.equals(“clam”)) {
pizza = new ClamPizza();
} else if (type.equals(“veggie”)) {
pizza = new VeggiePizza();
}
return pizza;
}
}
Ovaj kod je još uvek
parametrizovan
vrstom pice, kao i u
originalnoj
orderPizza() metodi.
![Page 12: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/12.jpg)
PizzaStore klasa
public class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
PizzaStore klasi se
prosleđuje factory kroz
konstruktor
12
Pizza pizza;
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
// other methods here
}
pizza = factory.createPizza(type); orderPizza() metoda
koristi factory da kreira
picu jednostavnim
prosleđivanjem tipa pice
![Page 13: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/13.jpg)
Dijagram klasa
13
![Page 14: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/14.jpg)
Factory Method
� Dodaje interfejs samom Factory-ju iz Simple Factory-ja
Factory method patern definiše interfejs za kreiranje
objekta, ali omogućava podklasama da odluče koja
klasa će se instancirati. Factory Method delegira
odgovornost za instanciranje klasa na podklase.
� Dodaje interfejs samom Factory-ju iz Simple Factory-ja
� Prenosi odgovornost za kreiranje objekta na veći broj Factory-ja koji dele interfejs
14
![Page 15: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/15.jpg)
� Šta sa regionalnim razlikama? Picerije u različitim gradovima mogu imati različite vrste pica u ponudi.
15
Jedan pristup je da umesto SimplePizzaFactory kreiramo tri različite fabrike, NYPizzaFactory, ChicagoPizzaFactory i CaliforniaPizzaFactory.
![Page 16: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/16.jpg)
16
![Page 17: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/17.jpg)
17
![Page 18: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/18.jpg)
Omogućiti podklasama da odluče
18
![Page 19: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/19.jpg)
19
Jedna od podklasa se poziva
![Page 20: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/20.jpg)
20
![Page 21: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/21.jpg)
![Page 22: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/22.jpg)
Prednosti i nedostaci Factory method paterna
Prednosti Nedostaci
Eliminiše reference na konkretne klase
(Factory i objekte koje su kreirale Factory
klase)
Može biti potrebno da se kreira factory
samo da bi se dobile konkretne klase
Factory klase se mogu proširivati da bi
obezbedile još specijalizovanije kreiranje
Hijerarhija nasleđivanja ide sve dublje
zbog povezivanja konkretnih factory klasa obezbedile još specijalizovanije kreiranje
objekata
zbog povezivanja konkretnih factory klasa
i kreiranih klasa.
Pravila za inicijalizaciju objekata su
centralizovana
![Page 23: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/23.jpg)
Struktura Factory Method paterna
23
![Page 24: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/24.jpg)
Abstract Factory
� Factory kreiraju različite vrste konkretnih objekata
Abstract factory patern obezbeđuje interfejs za
kreiranje familija vezanih ili zavisnih objekata bez
definisanja njihovih konkretnih klasa.
� Factory kreiraju različite vrste konkretnih objekata (proizvoda)
� Factory predstavlja familiju objekata koji se mogu kreirati
� Factory mogu imati više od jednog factory metoda
24
![Page 25: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/25.jpg)
25
![Page 26: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/26.jpg)
26
![Page 27: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/27.jpg)
STATE PATERN
Paterni ponašanja
27
![Page 28: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/28.jpg)
Motivacija: Mašina za loptice
![Page 29: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/29.jpg)
• Definisanje vrednosti za svako stanje
• Akcija i promena stanja
29
![Page 30: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/30.jpg)
![Page 31: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/31.jpg)
![Page 32: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/32.jpg)
![Page 33: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/33.jpg)
Trenutno stanje implementirane mašine
� Nema enkapsulacije
� Nije objektno orjentisan
� Prelazi između stanja nisu eksplicitni i smešteni su unutar velikog broja uslovnih iskaza
� Dalje proširivanje daje veliko verovatnoću da izavove bagove
![Page 34: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/34.jpg)
Rešenje
� Potrebno je enkapsulirati objekte stanja u sopstvene klase i delegirati trenutno stanje kada dođe do akcije.
� Najpre definišemo State interfejs koji sadrži metode za svaku akciju Gumball mašine
� Zatim implementiramo State klasu za svako stanje mašine. Ove klase će biti odgovorne za ponašanje mašine kada se nalazi u odgovarajućem stanju.
� Konačno, oslobodićemo se uslovnog koda i delegirati klasi stanja da radi za nas.
34
![Page 35: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/35.jpg)
35
![Page 36: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/36.jpg)
Klasa stanja
36
![Page 37: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/37.jpg)
Klasa Gumball mašine
Stari kod Izmenjen kod
37
![Page 38: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/38.jpg)
Implementacija Gumball mašine
38
![Page 39: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/39.jpg)
Implementacija Gumball mašine
39
![Page 40: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/40.jpg)
Implementacija stanja
40
![Page 41: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/41.jpg)
Implementacija stanja
41
![Page 42: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/42.jpg)
Promena stanja
42
![Page 43: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/43.jpg)
Definicija i struktura State paterna
State patern omogućava objektu da promeni
svoje ponašanje kada mu se promeni
unutrašnje stanje. Objekat će promeniti svoju
klasu.
43
![Page 44: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/44.jpg)
MODEL-VIEW-PRESENTER
44
![Page 45: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/45.jpg)
Motivacija
45
![Page 46: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/46.jpg)
Namena
� Obezbeđuje jasno razdvajanje između:� Podataka koje treba prikazati
� Poslovne logike aplikacije
� Prikaza poadataka
� Obezbeđuje da svaki učestnik u paternu ima samo jednu � Obezbeđuje da svaki učestnik u paternu ima samo jednu odgovornost� Model
� View
� Prezenter
� Omogućava izolovano testiranje svakog učesnika u paternu
46
![Page 47: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/47.jpg)
Struktura
� View i Model ne znaju ništa jedno o drugome
� Presenter koordinira zahteve i događaje između Modela i View komponente
47
![Page 48: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/48.jpg)
Struktura
• Svi MVP učesnici su deo
UI sloja
• Model nije deo
poslovnog domenaposlovnog domena
• Model je specijalna
prezentacija podataka
napravljena specijalno
za View
48
![Page 49: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/49.jpg)
Kolaboracija
� Model� Čuva podatke koje će prikazati View
� View� Instancira Presenter komponentu
� Zahteva da Prezenter izvrši zadatak� Zahteva da Prezenter izvrši zadatak
� Može imati referencu na Model ili
� se može osloniti na Presenter da inicijalizuje podatke
� Presenter� Odgovara na zahteve View komponente
� Može znati kada su podaci ažurirani
� Ažurira View podacima iz Modela
49
![Page 50: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/50.jpg)
Posledice
� Svaku klasu je moguće testirati odvojeno od drugih
� Jasna podela odgovornosti, pri čemu svaki učesnik ima samo jednu odgovnorst
50
![Page 51: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/51.jpg)
PROXY PATERN
Strukturni paterni
51
![Page 52: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/52.jpg)
Kontrolisanje pristupa objektu
� Dobar policajac – loš policajac� Dobar policajac pruža sve usluge na ljubazan i prijateljski način,
ali ne želi da mu svi traže usluge, pa zbog toga ima lošeg policajca koji kontroliše pristup dobrom policajcu.
� To je ono što proxy radi: kontroliše i upravlja ko može da pristupi nekom objektu.
52
![Page 53: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/53.jpg)
Gumball mašina
� Dodavanje podrške za upravljanje lokacijom Gumball mašine.
53
![Page 54: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/54.jpg)
Gumball monitor
54
![Page 55: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/55.jpg)
Testiranje monitora
55
![Page 56: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/56.jpg)
Primenljivost
� Remote proxy ima ulogu lokalnog predstavnika udaljenog objekta. To je objekat nad kojim možete lokalno pozivati metode i usmeravati ih ka udaljenom objektu.
� Klijentski objekat se ponaša kao da se pozivaju udaljene metode, ali ono što se u stvari dešava je pozivanje metoda na lokalnom proxy-ju koji upravlja svim detaljima mrežne komunikacije.
56
![Page 57: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/57.jpg)
Primenljivost
� Virtual proxy kreira skupi objekat na zahtev. Tipičan primer je Image Proxy koji prikazuje placeholder dok se slika učitava ili renderuje.
� Protection proxy se može koristiti za kontrolu pristupa objektu, na osnovu pravila o autorizaciji. objektu, na osnovu pravila o autorizaciji.
57
![Page 58: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/58.jpg)
Definicija i struktura Proxy paterna
� Proxy patern obezbeđuje surogat ili placeholder za drugi objekat i kontroliše pristup tom objektu.
58
![Page 59: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/59.jpg)
Struktura (alternativna)
59
![Page 60: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/60.jpg)
Kako se koristi
� Klijenti rade sa Proxy objektom kao da je reč o stvarnom objektu
� Proxy kontroliše pristup stvarnom objektu, delegirajući pozive ka njemu kada je potrebno
� Koristi se da:� Unapredi performanse i vreme pokretanja aplikacije
� Pojednostavljuje interakciju sa udaljenim objektom
� Odlaže skupe pozive dokle god je to moguće – implementira lazy loading objekata iz perzistentnog skladišta
60
![Page 61: Dizajn paterni](https://reader034.vdocuments.us/reader034/viewer/2022050705/55cf992b550346d0339bf9b3/html5/thumbnails/61.jpg)
Posledice
� Klijentski kod se ne mora menjati da bi radilo sa Proxy-jem� Ipak, Proxy mora biti sinhronizovan sa stvarnim objektom
� Proxy se može koristiti da optimizuje performanse postojećeg sistema bez izmene ponašanja postojeće postojećeg sistema bez izmene ponašanja postojeće klase� Poštuje se Open/Closed princip
� Klijentski kod može imati pogrešne pretpostavke o ponašanju stvarnog objekta� Interfejs može koristiti više malih poziva umesto jednog velikog
� Pristup klijentu korišćenjem lazy loadinga može rezultirati u većem broju pristupa bazi podataka nego što je potrebno.
61