Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Decorator
2
Problém Káva Cena House Blend 3.00€ Kenya 1.50€ Decaf Veranda Blend
3.50€ Espresso 2.00€
3
Problém Káva Cena House Blend 3.00€ Kenya 1.50€ Decaf Veranda Blend
3.50€ Espresso 2.00€ Šlehačka Čokoláda Mléko Voda Sojové mléko Mléčná pěna Čokoládový sirup Whiskey
4
„Řešení“ číslo 1 Omezení na podmnožinu
Nemožné vytvořit jakoukoliv kombinaci Co když se změní cena mléka?
5
„Řešení“ číslo 2 Dědičnost
6
„Řešení“ číslo 2 Dědičnost
7
„Řešení“ číslo 3 Supertřída
8
„Řešení“ číslo 3 Supertřída
9
„Řešení“ číslo 3 Supertřída
10
„Řešení“ číslo 3 Supertřída
if (MaMleko()) { cena += 0.10; } if (MaSojoveMleko()) cena += 0.50; if (MaPenu()) cena += 0.25; if (MaCokoladu()) cena += 0.65;
11
„Řešení“ číslo 3 Supertřída
Změna ceny doplňku vynutí změnu celého kódu Přidání doplňku znamená změnu supertřída Co když chceme dvojitou dávku mléka?
12
„Open-Closed“ princip
Třídy by měly být: otevřené pro rozšíření zavřené pro modifikaci Možnost rozšířit funkcionalitu bez nutnosti měnit stávající kód
13
Dědičnost ... je silný nástroj...
ale může vést k neflexibilnímu designu vytváří statické, compile-time rozhodnutí
14
Kompozice stále umožňuje "dědit" chování
umožňuje dynamické, run-time rozhodnutí umožňuje přidat nové chování bez změny stávajícího kódu
15
Kompozice větší flexibilita méně chyb a vedlejších efektů
16
Řešení číslo 4 Finální Espresso Cena()
17
Řešení číslo 4 Finální Postupně přidáváme doplňky/“dekorace“ Espresso
Mléko Cena() Espresso Cena() Postupně přidáváme doplňky/“dekorace“
18
Řešení číslo 4 Finální Decorator a.k.a. Wrapper Espresso Cena() Mléko
Šlehačka Cena() Mléko Cena() Espresso Cena() Decorator a.k.a. Wrapper
19
Řešení číslo 4 Finální Získání finální ceny Cena = 2 Espresso Cena()
Šlehačka Cena() Mléko Cena() Espresso Cena() Cena = 2 Získání finální ceny Cena = <cena vyšší vrstvy> + 0.1 Cena = <cena vyšší vrstvy> + 0.3 Cena()
20
Řešení číslo 4 Finální Získání finální ceny Cena = 2 Espresso Cena()
Šlehačka Cena() Mléko Cena() Espresso Cena() Cena = 2 Získání finální ceny Cena = <cena vyšší vrstvy> + 0.1 Cena = <cena vyšší vrstvy> + 0.3 Cena()
21
Vzor dekorátor ... přidává dodatečné závazky do objektu dynamicky
Dekorátory poskytují flexibilní alternativu k podtřídám pro rozšíření funkcionality
22
Diagram
23
Společný abstraktní předek
Diagram Společný abstraktní předek Abstraktní dekorátor Konkrétní komponenta Konkrétní dekorátor
24
Diagram
25
Kód
26
Kód
27
Kód
28
Vzor dekorátor Můžeme: libovolně kombinovat dekorátory
přidávat více stejných dekorátorů k jedné komponentě
29
Potenciální problémy Pevné hodnoty (ceny) pro určité kombinace neodpovídají ručně vyrobené kombinaci Zaokrouhlování cen Možnost "negativní hodnoty" (odečtu ceny) v dekorátoru
32
Reálný problém InputStream FileInputStream InputFileLineStream
LineInputStream FileInputStream InputStream InputFileLineStream
33
Reálné využití Grafické toolkity Čtení vstupu, zápis výstupu
Java Swing System.Windows.Controls Čtení vstupu, zápis výstupu System.IO.Stream java.io DataInputStream dis = new DataInputStream( new GzipInputStream( new BufferedInputStream( new FileInputStream("file.gz")))); dis.Read(...);
34
Vestavěná podpora v jazycích
JavaScript TypeScript Python
35
Výhody Vyšší flexibilita pro přidávání funkcionality oproti statickému dědění Transparentnost - programátor stále vidí objekt typu Nápoj Možnost rozšíření - přidávání doplňků Odolnost vůči změnám
36
Nevýhody Komponenta a dekorovaná verze komponentu nejsou identické
Pena(Mleko(Espresso)) == Karamel(Decaf) Pena(Mleko(Espresso)).Cena() != Karamel(Decaf).Cena() Dlouhá řetěz dekorátorů => dopad na výkon Velké množství malých tříd
37
Související vzory Adapter Strategy Composite
Decorator mění pouze chování objektu, ne jeho rozhraní Adapter dá objektu zcela nové rozhraní Composite Decorator je modifikovaný Composite - s jedinou komponentou Decorator přidává dodatečné chování, neagreguje objekty Strategy Decorator mění povrch objektu / Strategy mění vnitřek objektu Komponenta ve Strategy ví o extenzích
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.