Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Návrhové vzory Lucie Sobotková 8. 10. 2014. Návrhové vzory (Design patterns) Návrhové vzory jsou doporučené postupy řešení často se vyskytujících úloh.

Podobné prezentace


Prezentace na téma: "Návrhové vzory Lucie Sobotková 8. 10. 2014. Návrhové vzory (Design patterns) Návrhové vzory jsou doporučené postupy řešení často se vyskytujících úloh."— Transkript prezentace:

1 Návrhové vzory Lucie Sobotková

2 Návrhové vzory (Design patterns) Návrhové vzory jsou doporučené postupy řešení často se vyskytujících úloh Můžeme je přirovnat k matematickým nebo fyzikálním vzorcům. Nedosazujeme do nich čísla, ale třídy, rozhraní a objekty.

3 Výhody použití návrhových vzorů Snižují pravděpodobnost chyb Ulehčují budoucí práci Vštěpují zásady správného objektového programování Zestručňují a zkvalitňují komunikaci Velké SW firmy jejich znalost vyžadují

4 Zápis návrhových vzorů Návrhové vzory jsou často publikovány v katalozích K zápisu návrhových vzorů se používá UML diagramů, doprovázených slovním popisem Definice návrhového vzoru má následující strukturu: 1. zavedení názvu, popis účelu a podstaty 2. příklad, demonstrující motivaci 3. obecná struktura vzoru, vztahy mezi jednotlivými složkami 4. popis implementace, příklad 5. použití vzoru, důsledky, možnost náhrady, spolupráce s dalšími vzory

5 Počet návrhových vzorů Existuje 23 vzorů, považovaných za základní, univerzální. Další publikované vzory jsou určené pro specialozované oblasti programování. Celkový počet vzorů je relativně malý.

6 Zásady objektově orientovaného programování Programovat proti rozhraní Důsledné skrytí implementace Zapouzdření a odpoutání částí kódu, které by se mohly měnit Přednost skládání před dědičností Soudržnost (cohesion) Návrh řízený odpovědnostmi Minimální vzájemná provázanost (coupling) Vyhýbání se duplicitám v kódu Nepodřizovat návrh snahám o maximální efektivitu

7 Rozhraní Množina informací, které o sobě daná entita (atribut, třída) zveřejní Termín interface budeme užívat ve smyslu druh datového typu, označovaného v hlavičce klíčovým slovem interface. Rozhraní má dvě části: - signatura – souhrn informacím zpracovatelných a kontrolovatelných překladačem - kontrakt – souhrn dalších zásad, které je potřeba při použití dané entity dodržet, ale jejichž dodržování nemůže překladač zkontrolovat.

8 Programovat proti rozhraní Proměnné nemají být deklarovány jako instance konkrétních tříd, ale jako instance nějakého datového typu, který není vázán na konkrétní implementaci. Takovým datovým typem je interface.

9 Důsledné skrytí implementace Implementace – souhrn informací odhalujících, jak program pracuje Zapouzdření – slučování věcí, které k sobě patří, pod jednu střechu Podle některých autorů je důsledné skrytí implementace součástí zapouzdření

10 Jednoduchá tovární metoda Simple Factory Method Je zjednodušenou verzí obecnějšího návrhového vzoru Tovární metoda Definuje statickou metodu nahrazující konstruktor Používá se tam, kde potřebujeme získat odkaz na objekt, ale přímé použití konstruktoru není vhodné

11 Omezení konstruktoru Prvním příkazem konstruktoru musí být volání přetíženého konstruktoru nebo rodičovského konstruktoru. Nesmíme používat žádné virtuální (překrytelné) metody. Konstruktor vždy vytvoří novou instanci.

12 Jednoduchá tovární metoda Je obyčejná metoda, která jako svoji návratovou hodnotu vrací instanci zadané třídy (i jejích potomků). Bývá definována jako statická metoda třídy, jejíž instanci vrací. Na rozdíl od konstruktoru NEMUSÍ instanci vytvořit. Může vracet instance různých typů: může se rozhodnout, zda vrátí instanci deklarovaného typu, nebo jeho potomka. Rozdíl v syntaxi: konstruktor voláme pomocí new. Větší svoboda v definici. Nelpí na jméně -> mohou být dvě verze se stejnou hodnotou parametrů

13 Neměnné objekty Immutable objects Objekty, u nichž nelze změnit hodnotu Dělení datových typů: - hodnotové: typy, jejichž instance se předávají hodnotou - referenční: instance se předávají odkazem.

14 Dělení objektových typů 1. Hodnotové objektové typy Instance hodnotových objektových typů slouží k uchovávání hodnot. Má u nich smysl definovat metodu equals(Object). Příklady tříd ze standardní knihovny: java.lang.String, java.io.File, java.awt.Point a) neměnné hodnotové objektové typy: Není žádná možnost měnit hodnotu. Chovají se stejně jako hodnoty primitivních datových typů. Př: java.awt.Color, java.math.BigDecimal b)Proměnné hodnotové objektové typy: Nezaručují nemměnnost uchovávaných hodnot. Př: Point

15 Dělení objektových typů 2. Referenční objektové typy Jejich hodnotou je instance sama. Dvě instance jsou ekvivalentní právě tehdy, jedná-li se o tutéž instanci.

16 Neměnné objekty Implementace – pravidla tvorby Konstantní atributy Zapouzdřit odkazy na měnitelné objekty Metody nesmí modifikovat hodnotu – musí vracet nový objekt Definovat třídu jako konečnou

17 Přepravka Crate (Messenger) Vzor Přepravky slouží ke sloučení několika samostatných informací do jednoho objektu. Tyto informace je pak možno jednoduše ukládat nebo přenášet mezi metodami. Využití: - má-li metoda vracet několik hodnot současně -> přepravka je definovaná jako třída viditelná pro volající i volanou metodu. - chceme-li v rámci třídy uložit skupinu informací do soukromého kontejneru -> přepravka je definovaná jako vnořená nebo vnitřní třída dané třídy.

18 Přepravka Pro každou informaci je vyhrazen jeden atribut. Atributy se většinou definují jako veřejné. Přepravky jsou většinou jednoúčelové. Příklady přepravek ze standardní knihovny: java.awt.Point, java.awt.Dimension, java.awt.Rectangle Tyto třídy nejsou definovány jako neměnné, což způsobuje problémy.

19 Služebník Servant Využití: Chceme-li skupině tříd nabídnout další funkčnost. Služebník je třída, jejíž instance poskytují metody, které si vezmou příslušnou činnost (službu) na starost, přičemž objekty, s nimiž danou činnost vykonávají, přebírají jako parametry.

20 Služebník - Implementace V analýze zjistíme, jaké schopnosti budou mít obsluhované třídy Definujeme rozhraní, které bude po implementujících třídách vyžadovat implementaci deklarovaných metod Definujeme třídu služebníka, jejímž metodám budeme předávat jako parametr instanci tohoto rozhraní Upravíme obsluhované třídy, aby implementovaly toto rozhraní

21 Služebník – způsoby implementace 1. Uživatel požaduje operace přímo po služebníkovi a obsluhované objekty předává jako parametr. Obsluhovaný 1 Obsluhovaný 2 Interface IObsluhovaný Služebník Uživatel

22 Služebník – způsoby implementace 2. Uživatel požaduje operace po obsluhovaných instancích, které pak samy požádají služebníka o svoji obsluhu. SlužebníkObsluhovaný 1 Obsluhovaný 2 Uživatel Interface IObsluhovaný

23 Prázdný objekt Null Object Prázdný objekt je platný, formálně plnohodnotný objekt, který použijeme v situaci, kdy by nám použití prázdného ukazatele null přinášelo problémy (vyvolání výjimky NullPointerException, testování). Prázdný objekt definujeme jako instanci třídy, která je potomkem třídy neprázdných objektů. Třída prázdného objektu bývá definována podle návrhového vzoru Jedináček (Singleton). Akci, kterou je v případě prázdnosti odkazu třeba provést místo molání metody, definujeme ve třídě prázdného objektu jako překrývací verzi této metody.

24 Knihovní třída Library Class (Utility) Slouží jako obálka pro soubor statických metod Žádné instance nepotřebujeme => znemožníme jejich vytváření Toho dosáhneme definicí soukromého konstruktoru, nejlépe bezparametrického s prázdným tělem a deklarací třídy jako konečné.

25 Jedináček Singleton Jedináček specifikuje, jak vytvořit třídu, která bude mít nejvýše jednu instanci. Tato instance přitom nemusí být vlastní instancí dané třídy.

26 Jedináček – účel Účel: Nutnost existence jediné instance se objevuje například tam, kde potřebujeme, aby se nějaké objekty pohybovaly jen ve vymezeném prostředí. Příklady: - Hráči fotbalu hrající na jednom hřišti. Třída definující hřiště vytváří svou instanci jako jedináček. -Dalším příkladem mohou být dialogová okna nebo ovladače zařízení -Známým příkladem ze světa Windows je schránka, která může existovat jen jednou, aby se nám data získaná v jedné aplikaci neztratila někde po cestě do druhé aplikace.

27 Jedináček – základní implementace Implementace jedináčka mají společný soukromý konstruktor, který zaručí, že nedojde k vytvoření další instance. Požadovaná instance se vytvoří uvnitř třídy a její odkaz se uloží do statického atributu. Jednotlivé varianty implementace se pak odlišují tím, kdy a jak se objekt konstruuje a jak jej mohou ti ostatní získat. Tuto třídu je vhodné označit jako finální.

28 Jedináček – 1. ukázka implementace

29 Jedináček – 2. ukázka implementace

30 Jedináček – vícevláknové aplikace Je třeba ošetřit, aby inicializaci jedináčka nemohla vyvolat současně dvě vlákna Řešení: -synchronizování tovární metody (drahá operace) - definování odkazu na jedináčka jako nestálého (volatie) a synchronizováním bloku kódu, starajícího se o tvorbu jedináčka. (Java 5 a vyšší)

31 Jedináček - serializovatelnost Kdybychom chtěli načítat jedináčka ze streamu, například souboru, musíme zkontrolovat, jestli již nějaký takový jedináček neexistuje Java poskytuje metodu, kterou je tato funkcionalita podpořena, jedná se o readSolve(). tato metoda vrací odkaz na existujícího jedináčka

32 Výčtový typ Enumerated Type K definici skupin předem známých hodnot K umožnění následné typové kontroly Lze definovat i Funkční výčtové typy: jednotlivé hodnoty se liší reakcemi na zasílané zprávy

33 Výčtový typ V Javě: standardní objektové typy, které jsou rozšířením jedináčka. Zavádějí předem známý počet předem známých instancí Je známý typ instancí. Konstruktor je soukromý, ale vlastní hodnoty jsou veřejné statické konstanty daného typu.

34 Originál Original Pokud dopředu víme, že se v aplikaci bude používat pouze malý počet různých instancí, které budou požadovány na různých částech kódu. Účelem je, aby se každá instance vyskytovala v programu jen jednou, tj. aby instance neměly dvojníky se stejnou hodnotou Popisuje jednodušší verzi fondu, která nevyžaduje návrat použitých instancí do fondu.

35 Fond Pool Potřebujeme-li omezit počet vytvořených instancí Místo vytváření nových instancí použijeme „reinkarnaci“ instancí již nepoužívaných Fond můžeme definovat jak s omezenou, tak s neomezenou kapacitou

36 Muší váha Flyweight Pokud řešení poblému vyžaduje vytvoření velkého počtu objektů Je účelné zastoupit skupinu virtuálních instancí jednou instancí reálnou, která bude jejich reprezentantem Charakteristiky stavu virtuální instance: - interní – společné pro všechny virtuální instance v dané skupině => budou i charakteristikami reprezentanta - externí – u jednotlivých virtuálních instancí se liší => reprezentant se je dozvídá např. v parametrech svých metod

37 Zástupce Proxy Zavádí zástupce, který odstiňuje objekt od jeho uživatelů a sám řídí jejich přístup k objektu. Slouží k lepšímu zapouzdření implementace, někdy ke zlepšení funkčnosti. Dělení zástupců: - Vzdálený zástupce: komunikace mezi programy na různých virtuálních strojích. - Virtuální zástupce: může šetřit zdroje emulací objektu. - Ochranný zástupce: zamezuje přímé komunikaci s objektem. Někdy ho lze nahradit implementací rozhraní (snižuje bezpečnost, zvyšuje efektivitu) - Chytrý zástupce: doplňuje odkaz o dodatečnou funkčnost.

38 Příkaz Command Zabalí metodu do objektu. To umožňuje dynamickou výměnu metod za běhu programu. Při implementaci definujeme rozhraní deklarující požadovanou metodu – příkaz. Blízký návrhovému vzoru Služebník. Použití: - potřebujeme zabezpečit možnost zpětného volání - potřebujeme volané metodě předat jinou metodu - možnost definice pole metod

39 Iterátor Iterator Zprostředkuje jednoduchý a přehledný způsob sekvenčního přístupu k objektům uloženým většinou v kontejneru. Implementace této struktury zůstane klientovi skryta. Bývá definován jako soukromá vnitřní třída. Může pracovat i skrytě.

40 Stav State Řeší výrazný rozdíl mezi chováním objektu v různých stavech zavedením vnitřního stavu jako objektu reprezentovaného instancí některé ze stavových tříd. Změnu stavu objektu řeší záměnou objektu reprezentujícího stav. Použijeme tehdy, nacházejí-li se objekty nějaké třídy v různých stavech, které se liší svými reakcemi na zasílané zprávy. Atribut zastupující stavově závislou část objektu můžeme specifikovat jako instanci speciálního stavového rozhraní nebo abstraktní třídy.

41 Šablonová metoda Template Method Definuje metodu obsahující kostru nějakého algoritmu. Některé kroky nejsou v době vzniku algoritmu známy – definují je až potomci třídy se šablonovou metodou prostřednictvím překrytí metod, které šablonová metoda volá.

42 Šablonová metoda Bývá nejčastěji implementována v abstraktní třídě. Metody: - pevné, nepřekrytelné metody definované ve společné rodičovské třídě - překrytelné metody s implicitní implementací - abstraktní metody (metody, které musí potomek definovat -jiné šablonové metody Šablonovou metodou nemůže být konstruktor, protože konstruktor nesmí obsahovat překrytelné metody Aplikace předem neznámého počtu metod je možné řešit použitím návrhového vzoru Příkaz a předáním příslušných objektů – metod v nějakém iterovatelném objektu.

43 Tovární metoda Factory Method Deklaruje rozhraní s metodou pro získání objektu. Účel je vytvořit novou instanci nějakého objektu a vytvořenou instanci vrátit. Rozhodnutí o konkrétním typu vráceného objektu ponechává na svých potomcích – na překrývajících verzích deklarované metody.

44 Tovární metoda Uvolňuje vazbu mezi třídou používající nějaký objekt a třídou tohoto objektu Umožňuje se odpoutat od implementace používaného objektu a soustředit se na jeho rozhraní Instance s tovární metodou funguje jako zástupce vložený mezi konstruktor a zbytek aplikace Často není potřeba definovat tovární metodu jako zvláštní třídu, ale stačí ji pouze přidat mezi metody používaných tříd.

45 Tovární metoda Diagram tříd Klient Interface IProdukt Produkt A Produkt B Interface ITovárna Továrna A Továrna B

46 Tovární metoda Aplikace tovární metody v knihovně kontejnerů Klient Interface Iterator Interface Iterable AbstratList.Itr LinkedList.ListItr HashMap.KeyIterator ArrayList LinkedList HashSet

47 Instanční tovární metoda používá se tam, kde je vytvářený objekt nějakým způsobem odvozený od aktuální instance třídy, která tovární metodu poskytuje.

48 Tovární metoda - příklady

49 Prototyp Prototype Objekt definuje tovární metodu, která bude vytvářet jeho kopie. V programu je pak možno místo přímého volání konstruktoru využívat volání kopírovací tovární metody připraveného prototypu.

50 Prototyp - klonování Klonování je další způsob vytváření objektů. Vytváříme při něm kopii objektu bez použití konstruktoru. Ve standardní knihovně je k tomu účelu připravena metoda clone(), definovaná ve třídě Object. Metoda clone() je definována jako chráněná, takže ji mohou volat pouze nadobjekty daného objektu. Je možné klonovat pouze objekty, které implementují interface “Clonable”. Objekt, který není možné klonovat, vyhodí výjimku CloneNotSupported.

51 Prototyp - klonování Metoda clone() vytvoří v paměti kopii celého objektu, jehož je její instance kořenovým podobjektem. Klonování umožňuje, aby aplikace byla schopná vytvářet instance i do tříd, které ještě nezná. Klonování je výhodnější při používání mělkých kopií – kopíruje se pouze vlastní objekt, ponechávají se odkazy na objekty, na něž odkazoval v atributech původní objekt Využití speciální tovární metody volající konstruktor je výhodnější při používání hlubokých kopií – kopíruje se nejen objekt, ale i všechny objekty, na které tento objekt odkazuje.

52 Stavitel Builder Odděluje konstrukci složitého objektu od jeho vnitřní reprezentace Tím umožňuje využít stejného konstrukčního postupu pro různé vnitřní reprezentace konstruovaných objektů. Nesoustřeďuje se na vytvoření objektu, ale na postup jeho tvorby.

53 Stavitel Vedle řídícího objektu vystupují též výkonné objekty. Řídící objekt má na starosti dodržení správného postupu vytvoření požadovaného objektu Výkonné objekty mají na starosti vytvoření některých detailů podle pokynů řídícího objektu.

54 Stavitel - použití Je-li algoritmus tvorby objektu závislý na použité vnitřní reprezentaci Mají-li vytvářené objekty složitější vnitřní strukturu a budují-li se proto v několika fázích Je-li vhodné použít řídící objekt současně jako správce zdrojů používaných při tvorbě daných objektů Příklad: sázecí stroje

55 Abstraktní továrna Abstract Factory Definuje rozhraní pro tvorbu celé rodiny souvisejících objektů. Tím odděluje klienta od vlastního procesu vytváření objektů. Řeší problém, kdy je třeba vybrat mezi několika sadami tříd, jejichž instance budou vystupovat v programu. Příklad: volba celkového vzhledu Instance vracené jednotlivými metodami mohou být jak různého, tak stejného typu. Jednotlivé instance bývají definovány jako jedináčci. Při implementaci se často používá Tovární metoda nebo Prototyp.

56 Dekorátor Decorator Přidává další funkcionalitu k objektu tak, že objekt zabalí do jiného objektu, který má na starosti pouze přídatnou funkcionalitu. Zbytek požadavků deleguje na zabalený objekt. Umožňuje snížit kombinatoricky rostoucí počet tříd. Dodaná funkčnost je implementována jako ozdobení objektu.

57 Dekorátor Základní třídy mají společného rodiče. Pro každé rozšíření je definována samostatná třída – dekorátor. Konstruktor dekorátoru přebírá objekt jako parametr a obalí jej vlastními schopnostmi. Dekorátor většinou přidává metody, které se starají o jím přidanou funkčnost. Může také pouze překrýt metody svých předků.

58 Strom Composite Sjednocuje typy používaných objektů a umožňuje tak jednotné zpracování každého z nich nezávisle na tom, jedná-li se o atomický nebo složený objekt. Rozhraní společné pro atomické i složené typy by mělo být co největší. Příklad: Třída java.io.File – společný datový typ File.

59 Řetěz odpovědnosti Chain of Responsibility Umožňuje, aby zaslaný požadavek zpracoval jiný objekt než ten, kterému byl zadán. Využívá se v případě, že není dopředu jasné, koho oslovit. Skupina instancí je navzájem propojena odkazy do řetězu. Řetěz umožňuje dynamicky měnit adresáta zprávy. Instance mohou být různých typů – vhodné aplikovat vzor Strom.

60 Pozorovatel Observer Zavádí vztah mezi objekty (pozorovateli) reagujícími na změnu stavu pozorovaného objektu nebo na jím sledované události. Pozorovatelé se u pozorovaného objektu přihlásí a ten je pak každou změnu svého stavu či výskyt události upozorní.

61 Pozorovatel Je vhodný pro následující případy: - Abstrakce má dva parametry, které jsou na sobě navzájem závislé. - Zapouzdřením parametrů je dosaženo větší obměnitelnosti a znovupoužitelnosti. - Změna jednoho objektu vyžaduje změnu dalších objektů a není známo kolik objektů je třeba změnit. - Objekt má být schopen upozornit další objekty aniž by o těchto objektech věděl detaily.

62 Pozorovatel - strategie Tažná strategie: Pozorovatel říká pozorovanému o požadované parametry. Tlačná strategie: Pozorovaný objekt předá pozorovateli všechny parametry při volání upozorňovací metody.

63 Pozorovatel – standardní knihovna Ve standardní knihovně je pro aplikaci vzoru připraveno rozhraní java.util.Observer a třída java.util.Observable. Metoda update(Observable, Object) deklarovaná rozhraním Observer zavádí první parametr proto, aby mohl být jeden pozorovatel přihlášen u několika objektů. Použití implementace ze standardní knihovny vyžaduje definici potomka třídy Observable.

64 Pozorovatel - příklad

65 Použitá literatura: Rudolf Pecinovský: Návrhové vzory

66 Děkuji za pozornost!


Stáhnout ppt "Návrhové vzory Lucie Sobotková 8. 10. 2014. Návrhové vzory (Design patterns) Návrhové vzory jsou doporučené postupy řešení často se vyskytujících úloh."

Podobné prezentace


Reklamy Google