SlideShare uma empresa Scribd logo
1 de 17
Návrhové vzory v programování
           Jan Tichý
     WebCamp, 27. března 2008
Program přednášky
Co jsou návrhové vzory
Typy návrhových vzorů
Příklady konkrétních návrhových vzorů
Literatura a elektronické zdroje
Co jsou návrhové vzory
• Obecné řešení častého problému při návrhu
  software
• Explicitně pojmenované obecné principy,
  které programátoři intuitivně dávno znají
• Návrhové vzory × algoritmy × knihovny
Proč používat návrhové vzory
•   Podporují správné programátorské postupy
•   Podporují principy čistého OOP
•   Nevymýšlíte již vymyšlené
•   Rozšiřitelnost a znovupoužitenost aplikace
•   Čitelnost aplikace, jednotná filozofie
Typy návrhových vzorů
• Creational patterns – Factory, Singleton,
  Builder, Prototype, Object Pool...
• Structural patterns – Adapter, Bridge,
  Composite, Decorator, Facade...
• Behavioral patterns – Chain of Responsibility,
  Iterator, Observer, Strategy, Template
  Method...
• Architectural patterns – MVC,
• Concurrency patterns – Read Write Lock...
Factory Method
instance se nezískává přes konstruktor,
 ale nepřímo pomocí statické metody
metoda může vracet i již existující instanci
nejsme vázáni konkrétní třídou instance
v obecnějším pojetí deklaruje jen rozhraní,
 konkrétní typy instance určují potomci
často využívána v rámci ostatních vzorů
Singleton
v aplikaci nejvýše jedna instance nějaké třídy
typicky instance aktuálního uživatele
například Zend_Auth, Zend_Registry,
 Zend_Controller_Front, pooly, cache apod.
využívá Factory Method
konstruktor, klonování, serializovatelnost
z puristického hlediska není úplně čistý
Singleton: proč objekt a nikoliv třída
objekt může implementovat rozhraní
odkaz na něj se může předávat jako parametr
je možné i v průběhu aplikace rozhodnout,
 které třídy bude vytvářený objekt instancí
pokud odpovídá nějakému objektu reálného
 světa, je zpravidla vhodné jej instancovat
Library class
seskupené statické metody
nevytváří se instance, jen statické volání
mělo by se zabránit možnosti instancování
pokud je potřeba nějaká statická proměnná,
 možná bude vhodnější použít singleton
například Zend_Json
Iterator
zajišťuje sekvenční přístup k nějakému
 seznamu, kontejneru, poli apod.
zapouzdřuje vnitřní implementaci uložiště
v PHP (SPL) zabudovaný interface Iterator,
 jeho implementace lze použít v cyklu foreach
správně by neměl být instancován přímo, ale
 pomocí Factory method nad daným uložištěm
např. Zend_Config, Zend_Form apod.
Template Method
definuje základní kostru nějakého algoritmu
dílčí kroky mohou definovat až jednotliví
 potomci pomocí překrytých metod
struktura algoritmu ale zůstává stejná
šablonová metoda je zpravidla finální
rodič je zpravidla abstraktní
Adapter
potřebuji, aby třída měla jiné rozhraní, než
 má
mezi ni a sebe vložím adaptér, který převede
 skutečné rozhraní na mnou požadované
sjednocení různých rozhraní do jednotného
požadované rozhraní dáno zpravidla nějakým
 definovaným interface – tři možnosti
 realizace
Decorator
Alternativa k dědění
Přidává k objektu další dodatečnou funkčnost
Původní objekt zabalí do jiného objektu
Vnější objekt zajišťuje nové funkce, vše
 ostatní deleguje na původní objekt
Oba dva by měli mít společného rodiče
 (abstraktní třída či interface)
Observer
Pozorovatelé se na začátku zaregistrují
 u pozorovaného objektu
Při nějaké události pak pozorovaný objekt
 upozorní všechny registrované pozorovatele
Typicky u událostmi řízeného programování
Registrace dynamicky anebo natvrdo v kódu
Literatura
 Erich Gamma, Richard Helm, Ralph Johnson,
  John Vlisside: Design Patterns: Elements of Reusable
  Object-Oriented Software. Addison Wesley, 1995.
 Erich Gamma, Richard Helm, Ralph Johnson,
  John Vlisside: Návrh programů pomocí vzorů.
  Stavební kameny objektově orientovaných
  programů.
  Grada, 2003.
 Rudolf Pecinovský: Návrhové vzory
  Computer press, 2007.
Elektronické zdroje
• Bruce Eckel: Thinking in patterns.
  www.bruceeckel.com
• Wikipedia: en.wikipedia.org/wiki/Design_pattern
  (computer_science)
• Vince Huston: www.vincehuston.org/dp/
• Miloš Dvořák: Návrhové vzory (design patterns)
  objekty.vse.cz/Objekty/Vzory
• Pavel Drbal: objekty.vse.cz
• Ilja Kraval: www.objects.cz
Díky za pozornost


Otázky, připomínky, doplnění?

    www.phpguru.cz ;-)

Mais conteúdo relacionado

Semelhante a Návrhové vzory v programování

Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftumdevtalk
 
Vizualizace chemickych struktur na www
Vizualizace chemickych struktur na wwwVizualizace chemickych struktur na www
Vizualizace chemickych struktur na wwwMartin Slavík
 
Dependency injection v .Net Frameworku
Dependency injection v .Net FrameworkuDependency injection v .Net Frameworku
Dependency injection v .Net FrameworkuRené Stein
 
03 Významné vlastnosti digitálních objektů.pptx
03 Významné vlastnosti digitálních objektů.pptx03 Významné vlastnosti digitálních objektů.pptx
03 Významné vlastnosti digitálních objektů.pptxMagdalnaBohuslavov
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariRoman Pichlík
 
Tv 10 11
Tv 10 11Tv 10 11
Tv 10 11352
 
On-line nástroje pro plánování, projektový management a time management + sof...
On-line nástroje pro plánování, projektový management a time management + sof...On-line nástroje pro plánování, projektový management a time management + sof...
On-line nástroje pro plánování, projektový management a time management + sof...Allix
 
ORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentBrnoPHP
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Kuba Břečka
 
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Péhápkaři
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbecDavid Grudl
 
ReliSA KIV hlavni oblasti vyzkumu (2014-01)
ReliSA KIV hlavni oblasti vyzkumu (2014-01)ReliSA KIV hlavni oblasti vyzkumu (2014-01)
ReliSA KIV hlavni oblasti vyzkumu (2014-01)Premek Brada
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaJan Hřídel
 
TPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročnéTPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročnéRené Stein
 
Technologie sémantického webu pro vzdělávání
Technologie sémantického webu pro vzděláváníTechnologie sémantického webu pro vzdělávání
Technologie sémantického webu pro vzděláváníTomáš Pitner
 
Vývoj wp 7 aplikací pro pokročilé
Vývoj wp 7 aplikací pro pokročiléVývoj wp 7 aplikací pro pokročilé
Vývoj wp 7 aplikací pro pokročiléRené Stein
 

Semelhante a Návrhové vzory v programování (20)

Úvod do OOP
Úvod do OOPÚvod do OOP
Úvod do OOP
 
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
 
Vizualizace chemickych struktur na www
Vizualizace chemickych struktur na wwwVizualizace chemickych struktur na www
Vizualizace chemickych struktur na www
 
Dependency injection v .Net Frameworku
Dependency injection v .Net FrameworkuDependency injection v .Net Frameworku
Dependency injection v .Net Frameworku
 
Úvod do rails
Úvod do railsÚvod do rails
Úvod do rails
 
03 Významné vlastnosti digitálních objektů.pptx
03 Významné vlastnosti digitálních objektů.pptx03 Významné vlastnosti digitálních objektů.pptx
03 Významné vlastnosti digitálních objektů.pptx
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou Tvari
 
Tv 10 11
Tv 10 11Tv 10 11
Tv 10 11
 
On-line nástroje pro plánování, projektový management a time management + sof...
On-line nástroje pro plánování, projektový management a time management + sof...On-line nástroje pro plánování, projektový management a time management + sof...
On-line nástroje pro plánování, projektový management a time management + sof...
 
ORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM development
 
TNPW2-2012-03
TNPW2-2012-03TNPW2-2012-03
TNPW2-2012-03
 
Sexy infrastruktura
Sexy infrastrukturaSexy infrastruktura
Sexy infrastruktura
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]
 
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
Petr Nikolas Prokop - Symfony framework (0. sraz přátel Symfony v Hradci Král...
 
Závislosti, injekce a vůbec
Závislosti, injekce a vůbecZávislosti, injekce a vůbec
Závislosti, injekce a vůbec
 
ReliSA KIV hlavni oblasti vyzkumu (2014-01)
ReliSA KIV hlavni oblasti vyzkumu (2014-01)ReliSA KIV hlavni oblasti vyzkumu (2014-01)
ReliSA KIV hlavni oblasti vyzkumu (2014-01)
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáška
 
TPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročnéTPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročné
 
Technologie sémantického webu pro vzdělávání
Technologie sémantického webu pro vzděláváníTechnologie sémantického webu pro vzdělávání
Technologie sémantického webu pro vzdělávání
 
Vývoj wp 7 aplikací pro pokročilé
Vývoj wp 7 aplikací pro pokročiléVývoj wp 7 aplikací pro pokročilé
Vývoj wp 7 aplikací pro pokročilé
 

Mais de Taste Medio

Zodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účetZodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účetTaste Medio
 
Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4Taste Medio
 
Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?Taste Medio
 
Vyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumůVyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumůTaste Medio
 
Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?Taste Medio
 
Retenční analýza - krok za krokem
 Retenční analýza - krok za krokem Retenční analýza - krok za krokem
Retenční analýza - krok za krokemTaste Medio
 
Dejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondiceDejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondiceTaste Medio
 
Impresní remarketing RTB a FB
Impresní remarketing RTB a FBImpresní remarketing RTB a FB
Impresní remarketing RTB a FBTaste Medio
 
Symboly značky prakticky
Symboly značky praktickySymboly značky prakticky
Symboly značky praktickyTaste Medio
 
Marketingový framework PAVRD
Marketingový framework PAVRDMarketingový framework PAVRD
Marketingový framework PAVRDTaste Medio
 
Pozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizíPozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizíTaste Medio
 
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?Taste Medio
 
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...Taste Medio
 
Bageta plná hejtu
Bageta plná hejtuBageta plná hejtu
Bageta plná hejtuTaste Medio
 
Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)Taste Medio
 
"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkami"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkamiTaste Medio
 
Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?Taste Medio
 
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuciPříběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuciTaste Medio
 
Kde jsou limity zákaznické 360°?
 Kde jsou limity zákaznické 360°? Kde jsou limity zákaznické 360°?
Kde jsou limity zákaznické 360°?Taste Medio
 
Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?Taste Medio
 

Mais de Taste Medio (20)

Zodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účetZodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účet
 
Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4
 
Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?
 
Vyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumůVyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumů
 
Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?
 
Retenční analýza - krok za krokem
 Retenční analýza - krok za krokem Retenční analýza - krok za krokem
Retenční analýza - krok za krokem
 
Dejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondiceDejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondice
 
Impresní remarketing RTB a FB
Impresní remarketing RTB a FBImpresní remarketing RTB a FB
Impresní remarketing RTB a FB
 
Symboly značky prakticky
Symboly značky praktickySymboly značky prakticky
Symboly značky prakticky
 
Marketingový framework PAVRD
Marketingový framework PAVRDMarketingový framework PAVRD
Marketingový framework PAVRD
 
Pozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizíPozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizí
 
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
 
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
 
Bageta plná hejtu
Bageta plná hejtuBageta plná hejtu
Bageta plná hejtu
 
Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)
 
"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkami"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkami
 
Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?
 
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuciPříběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
 
Kde jsou limity zákaznické 360°?
 Kde jsou limity zákaznické 360°? Kde jsou limity zákaznické 360°?
Kde jsou limity zákaznické 360°?
 
Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?
 

Návrhové vzory v programování

  • 1. Návrhové vzory v programování Jan Tichý WebCamp, 27. března 2008
  • 2. Program přednášky Co jsou návrhové vzory Typy návrhových vzorů Příklady konkrétních návrhových vzorů Literatura a elektronické zdroje
  • 3. Co jsou návrhové vzory • Obecné řešení častého problému při návrhu software • Explicitně pojmenované obecné principy, které programátoři intuitivně dávno znají • Návrhové vzory × algoritmy × knihovny
  • 4. Proč používat návrhové vzory • Podporují správné programátorské postupy • Podporují principy čistého OOP • Nevymýšlíte již vymyšlené • Rozšiřitelnost a znovupoužitenost aplikace • Čitelnost aplikace, jednotná filozofie
  • 5. Typy návrhových vzorů • Creational patterns – Factory, Singleton, Builder, Prototype, Object Pool... • Structural patterns – Adapter, Bridge, Composite, Decorator, Facade... • Behavioral patterns – Chain of Responsibility, Iterator, Observer, Strategy, Template Method... • Architectural patterns – MVC, • Concurrency patterns – Read Write Lock...
  • 6. Factory Method instance se nezískává přes konstruktor, ale nepřímo pomocí statické metody metoda může vracet i již existující instanci nejsme vázáni konkrétní třídou instance v obecnějším pojetí deklaruje jen rozhraní, konkrétní typy instance určují potomci často využívána v rámci ostatních vzorů
  • 7. Singleton v aplikaci nejvýše jedna instance nějaké třídy typicky instance aktuálního uživatele například Zend_Auth, Zend_Registry, Zend_Controller_Front, pooly, cache apod. využívá Factory Method konstruktor, klonování, serializovatelnost z puristického hlediska není úplně čistý
  • 8. Singleton: proč objekt a nikoliv třída objekt může implementovat rozhraní odkaz na něj se může předávat jako parametr je možné i v průběhu aplikace rozhodnout, které třídy bude vytvářený objekt instancí pokud odpovídá nějakému objektu reálného světa, je zpravidla vhodné jej instancovat
  • 9. Library class seskupené statické metody nevytváří se instance, jen statické volání mělo by se zabránit možnosti instancování pokud je potřeba nějaká statická proměnná, možná bude vhodnější použít singleton například Zend_Json
  • 10. Iterator zajišťuje sekvenční přístup k nějakému seznamu, kontejneru, poli apod. zapouzdřuje vnitřní implementaci uložiště v PHP (SPL) zabudovaný interface Iterator, jeho implementace lze použít v cyklu foreach správně by neměl být instancován přímo, ale pomocí Factory method nad daným uložištěm např. Zend_Config, Zend_Form apod.
  • 11. Template Method definuje základní kostru nějakého algoritmu dílčí kroky mohou definovat až jednotliví potomci pomocí překrytých metod struktura algoritmu ale zůstává stejná šablonová metoda je zpravidla finální rodič je zpravidla abstraktní
  • 12. Adapter potřebuji, aby třída měla jiné rozhraní, než má mezi ni a sebe vložím adaptér, který převede skutečné rozhraní na mnou požadované sjednocení různých rozhraní do jednotného požadované rozhraní dáno zpravidla nějakým definovaným interface – tři možnosti realizace
  • 13. Decorator Alternativa k dědění Přidává k objektu další dodatečnou funkčnost Původní objekt zabalí do jiného objektu Vnější objekt zajišťuje nové funkce, vše ostatní deleguje na původní objekt Oba dva by měli mít společného rodiče (abstraktní třída či interface)
  • 14. Observer Pozorovatelé se na začátku zaregistrují u pozorovaného objektu Při nějaké události pak pozorovaný objekt upozorní všechny registrované pozorovatele Typicky u událostmi řízeného programování Registrace dynamicky anebo natvrdo v kódu
  • 15. Literatura  Erich Gamma, Richard Helm, Ralph Johnson, John Vlisside: Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley, 1995.  Erich Gamma, Richard Helm, Ralph Johnson, John Vlisside: Návrh programů pomocí vzorů. Stavební kameny objektově orientovaných programů. Grada, 2003.  Rudolf Pecinovský: Návrhové vzory Computer press, 2007.
  • 16. Elektronické zdroje • Bruce Eckel: Thinking in patterns. www.bruceeckel.com • Wikipedia: en.wikipedia.org/wiki/Design_pattern (computer_science) • Vince Huston: www.vincehuston.org/dp/ • Miloš Dvořák: Návrhové vzory (design patterns) objekty.vse.cz/Objekty/Vzory • Pavel Drbal: objekty.vse.cz • Ilja Kraval: www.objects.cz
  • 17. Díky za pozornost Otázky, připomínky, doplnění? www.phpguru.cz ;-)

Notas do Editor

  1. instance se nezískává přes konstruktor, ale nepřímo pomocí statické metody – factory1.php metoda může vracet i již existující instanci – factory2.php nejsme vázáni konkrétní třídou instance – factory3.php v obecnějším pojetí deklaruje jen rozhraní, konkrétní typy instance určují potomci - často využívána v rámci ostatních vzorů, například singleton, (iterator), pool
  2. lazy/late initialization – odložená (pozdní, líná) inicializace – až v getInstance early ( časná ) inicializace – již při deklaraci statické proměnné – private static $instance = new Foo; -- unexpected T_NEW serializovatelnost – unserialize je vedle konstruktoru a klonování další cesta, jak vznikají instance – byly by tam dvě singleton1.php – základní kostra singleton2.php – ukázka na Auth singleton3.php – totéž na statické třídě
  3. singleton3.php – ukázka statické Auth třídy
  4. zabránit instancování – soukromý konstruktor, deklarace jako konečná (final) library1.php – můj Convert library2.php - Zend_Json
  5. - v SPL (Standard PHP Library) – Iterator, RecursiveIterator, RecursiveIteratorIterator, ArrayIterator, DirectoryIterator, CachingIterator apod. - iterator1.php – definice interface - iterator2.php –ukázka použití – instancování iterátoru „vedle“ uložiště – uložiště se klonuje apod. (rozhraní Iterable v Javě) – odděluje se tak samotné uložiště od svého iterátoru – na to je ale potřeba mít možnost soukromých vnitřních tříd, což PHP neumí
  6. template1.php
  7. adapter1.php - nebo samostatná třída implementující daný interface, která má instanci cílové třídy ve své proměnné – Zend_Auth_Adapter_Interface adapter2.php - buď obecný předek všech adaptérů s implicitníma metodama + jejich předefinování v konkrétních potomcích (nevýhoda – nutnost mít ho jako předka) -- např. abstract class Zend_Translate_Adapter_Abstract, Zend_Db_Adapter_Abstract - ale i tady by měl být k dispozici interface! a vše proti němu – u Zendu chybí adapter3.php - nebo potomek cílové třídy implementující daný interface – v Zendu není – ukázka s Nette
  8. decorator1.php - prasopes
  9. například reverzní kaskáda u kaskádové transparentní hierarchické cache