61
Dizajn paterni Factory, Abstract Factory, State, Model-View-Presenter, Proxy dr Zoran Jeremić [email protected] 1

Dizajn paterni

Embed Size (px)

DESCRIPTION

Dizajn paterni

Citation preview

Page 1: Dizajn paterni

Dizajn paterniFactory, Abstract Factory, State, Model-View-Presenter,

Proxy

dr Zoran Jeremić[email protected]

1

Page 2: Dizajn paterni

SIMPLE FACTORY, FACTORYMETHOD I ABSTRACT FACTORY

Paterni kreiranja

2

Page 3: Dizajn paterni

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

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

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

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

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

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

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

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

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

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

Dijagram klasa

13

Page 14: Dizajn paterni

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

� Š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

16

Page 17: Dizajn paterni

17

Page 18: Dizajn paterni

Omogućiti podklasama da odluče

18

Page 19: Dizajn paterni

19

Jedna od podklasa se poziva

Page 20: Dizajn paterni

20

Page 21: Dizajn paterni
Page 22: Dizajn paterni

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

Struktura Factory Method paterna

23

Page 24: Dizajn paterni

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

25

Page 26: Dizajn paterni

26

Page 27: Dizajn paterni

STATE PATERN

Paterni ponašanja

27

Page 28: Dizajn paterni

Motivacija: Mašina za loptice

Page 29: Dizajn paterni

• Definisanje vrednosti za svako stanje

• Akcija i promena stanja

29

Page 30: Dizajn paterni
Page 31: Dizajn paterni
Page 32: Dizajn paterni
Page 33: Dizajn paterni

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

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

35

Page 36: Dizajn paterni

Klasa stanja

36

Page 37: Dizajn paterni

Klasa Gumball mašine

Stari kod Izmenjen kod

37

Page 38: Dizajn paterni

Implementacija Gumball mašine

38

Page 39: Dizajn paterni

Implementacija Gumball mašine

39

Page 40: Dizajn paterni

Implementacija stanja

40

Page 41: Dizajn paterni

Implementacija stanja

41

Page 42: Dizajn paterni

Promena stanja

42

Page 43: Dizajn paterni

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

MODEL-VIEW-PRESENTER

44

Page 45: Dizajn paterni

Motivacija

45

Page 46: Dizajn paterni

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

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

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

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

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

PROXY PATERN

Strukturni paterni

51

Page 52: Dizajn paterni

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

Gumball mašina

� Dodavanje podrške za upravljanje lokacijom Gumball mašine.

53

Page 54: Dizajn paterni

Gumball monitor

54

Page 55: Dizajn paterni

Testiranje monitora

55

Page 56: Dizajn paterni

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

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

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

Struktura (alternativna)

59

Page 60: Dizajn paterni

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

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