View
198
Download
11
Category
Preview:
DESCRIPTION
Dizajn paterni
Citation preview
Dizajn paterniFactory, Abstract Factory, State, Model-View-Presenter,
Proxy
dr Zoran Jeremićzoran.jeremic@gmail.com
1
SIMPLE FACTORY, FACTORYMETHOD I ABSTRACT FACTORY
Paterni kreiranja
2
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
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
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();
}
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
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;
}
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
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
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();
}
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.
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
Dijagram klasa
13
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
� Š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.
16
17
Omogućiti podklasama da odluče
18
19
Jedna od podklasa se poziva
20
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
Struktura Factory Method paterna
23
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
25
26
STATE PATERN
Paterni ponašanja
27
Motivacija: Mašina za loptice
• Definisanje vrednosti za svako stanje
• Akcija i promena stanja
29
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
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
35
Klasa stanja
36
Klasa Gumball mašine
Stari kod Izmenjen kod
37
Implementacija Gumball mašine
38
Implementacija Gumball mašine
39
Implementacija stanja
40
Implementacija stanja
41
Promena stanja
42
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
MODEL-VIEW-PRESENTER
44
Motivacija
45
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
Struktura
� View i Model ne znaju ništa jedno o drugome
� Presenter koordinira zahteve i događaje između Modela i View komponente
47
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
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
Posledice
� Svaku klasu je moguće testirati odvojeno od drugih
� Jasna podela odgovornosti, pri čemu svaki učesnik ima samo jednu odgovnorst
50
PROXY PATERN
Strukturni paterni
51
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
Gumball mašina
� Dodavanje podrške za upravljanje lokacijom Gumball mašine.
53
Gumball monitor
54
Testiranje monitora
55
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
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
Definicija i struktura Proxy paterna
� Proxy patern obezbeđuje surogat ili placeholder za drugi objekat i kontroliše pristup tom objektu.
58
Struktura (alternativna)
59
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
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
Recommended