Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.

Slides:



Advertisements
Podobné prezentace
(instance konkrétní třídy)
Advertisements

Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Programovací jazyk C++
Ing. Jan Mittner MySQL Workbench 2. Základy práce s databází 3. Subversion 2.
Proxy. Definice  zástupce nebo náhradník za dotyčný objekt  proxy i zastoupený objekt dědí od stejného interfacu  proxy kontroluje přístup k objektu.
Přednáška č. 5 Proces návrhu databáze
Semestrální práce KIV/PT Martin Kales Hana Hůlová.
ÚVOD DO CPP 7 Dědičnost - pokračování
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
T OOL FOR C OLLABORATIVE XML S CHEMA I NTEGRATION Jiří Meluzín.
Desáté cvičení Java Core API Java Collection Framework JavaDoc.
ADT Strom.
Objekty v CLIPSu RNDr. Jiří Dvořák, CSc.
Chain of responsibility Martin Malý prezentace na předmět Návrhové vzory (PRG024) na MFF UK
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
PB161 – Programování v jazyce C++ Objektově Orientované Programování
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové programování
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Facade [f ə ˈ s ɑː d]f ə ˈ s ɑː d. Facade Před: Po:
6. cvičení Polymorfismus
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
Association table mapping Jakub Chalupa Naim Ashhab ČVUT FEL A7B36ASS – Architektura SW systémů LS 2014.
Ing. Jan Mittner Životní cyklus požadavku 2. Moduly 3. Pluginy 4. Jak řešit komponenty typu menu 5. atd. 2.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
12/04/20151 Kolekce (1) Kolekce (collection) představují standardní datové struktury (seskupení) prvků (objektů) Jsou definovány ve jmenném prostoru System.Collections.
Richard Lipka Department of Computer Science and Engineering Faculty of Applied Sciences University of West Bohemia, Pilsen, Czech Republic 1.
Databázové modelování
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Šesté cvičení Výjimky Balíky.
XQuery Dotazovací jazyk XML Daniel Privalenkov. O čem bude prezentace Nutnost dotazovacího jazyku v XML Rychlý přehled XQuery Několik příkladů.
Decorator. Rozšiřuje objekty o dodatečné chování  rozšiřuje konkrétní objekty, ne třídy  rozšiřuje objekt dynamicky, tj. za běhu Upřednostňuje kompozici.
XML data na disku jako databáze Kamil Toman
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
© BBMP: BAM015, BAR487, MAL305, POH015 1 Prezentace projektu Adresář kontaktů Autoři: Kateřina Bambušková, BAM015 Martina Bartošíková, BAR487 Alena Malovaná,
Foreign key mapping Jakub Chalupa Naim Ashhab ČVUT FEL
Service layer. Service layer – úvod Problém  Vytvoření API aplikace  Odstínění bussiness logiky a transakčního chování od zbytku aplikace  Kam s aplikační.
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
Visitor. Visitor - motivace Existující struktura typů Unit Character Main Hero Monster Environment Wall Magic Wall Stone Tree Mnoho nezávislých operací.
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
Iterator Iterator – Problém struct Item { int _value; Item * _next; Item( int value, Item * next ) : _value( value ), _next( next ) { } }; void Print(
Template Method. Motivační příklad – reálný svět Čaj 1) Uvař vodu 2) Dej do hrnku sáček čaje 3) Zalij hrnek 4) Přisyp cukr a vymačkej citrón Káva 1) Uvař.
Composite “ Spojuj a panuj ”. Zakladní vlastnosti Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit strukturované hierarchie tříd, v níž.
Iterator. C historie int * rand_numbers(int n) { int *numbers = malloc(n * sizeof(int)); int *it = numbers; while (it < numbers + n) *it++ = rand(); //
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně AUTOR: Ing. Adéla Tomalová NÁZEV: Podpora výuky v technických oborech TEMA: Objektově orientované.
SOLID principy v OOP návrhu
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Programovací jazyk C++
Návrhový vzor Flyweight
Abstract Factory.
Lazy load Použity informace z knihy Patterns of Enterprise Application Architecture od M. Fowlera Jan Sládek.
Strategy „Definujte rodinu algoritmů, zapouzdřuje je aby byly vzájemně zaměnitelné. Strategie umožňuje, aby se algoritmus nebyl závislý na klientech, kteří.
Bridge.
C# přehled vlastností.
Unit of Work vzor z P of EAA (Fowler) 1.
Decorator.
Monitor Object 1.
GRASP Patterns.
Adapter
Composite “Spojuj a panuj”.
Bridge.
Návrhový vzor Prototype.
Transkript prezentace:

Composite [kompozit, ne kompozajt]

Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů objektů Atomických (primitivních) Složených (rekurzivně složených z primitivních a dalších složených objektů)  Jednotný přístup k atomickým i složeným objektům (kontejnery) Motivace  Grafický editor Vytváření složitých schémat z primitivních komponent Použití těchto schémat na vytvoření ještě složitějších schémat  Hloupá implementace – bez Composite Definuje třídy pro grafická primitiva (Line, Text, Rect) a třídy jako jejich kontejnery Kód používající tyto třídy musí rozlišovat primitiva a kontejnery  Lepší implementace - Composite pattern Klient nemusí rozlišovat

Příklad: Model tříd Struktura:  Abstraktní třída Graphic (Component) Reprezentuje primitivní třídy i kontejner Deklaruje metodu Draw() Deklaruje metody pro správu potomků (případně poskytuje defaultní definice)  Primitivní podtřídy (Leaf) přímo vykonávají své metody Draw()  Kontejnery (Composite) definují Draw() a metody pro správu potomků Delegují Draw() na všechny své potomky Component Composite Leaves

Použití GUI  Komponenty-kontejnery na komponenty Obecné (Panel, Container) Speciální (menu, strom)  AWT, Swing Reprezentace XML Reprezentace aritmetického výrazu  Nebo programu (složený příkaz) Struktura souborů a adresářů java.awt

Composite – obecná struktura

Composite – účastníci Component (Graphic)  Deklaruje interface pro objekty v kompozici  Implementuje defaultní chování společného interface  Deklaruje interface pro správu a přístup k potomkům  Uchovává referenci na předka (volitelně) Leaf (Rectangle, Line, Text, atd.)  Reprezentuje listové objekty v kompozici, nemá potomky  Definuje chování primitivních objektů Composite (Picture)  Definuje chování komponent, které potomky mají  Uchovává potomky ve vhodné datové struktuře a umožňuje jejich správu Client  Používá objekty v kompozici přes interface Component

Důsledky Definuje hierarchii tříd skládajících se z primitivních a složených objektů, rekurzivně  Kdykoliv klientský kód předpokládá primitivní objekt, může také použít složený objekt Zjednodušuje klienta  Může zacházet stejně se složenými i primitivními objekty  Nemusí je rozlišovat – jednodušší kód Umožňuje jednoduché přidávání nových komponent  Nově definované Composite nebo Leaf třídy automaticky fungují s existujícími strukturami i klientským kódem  Na klientovi se nemusí nic měnit Může Váš design učinit až příliš obecným  Jednoduché přidání nových komponent naopak omezuje možnosti, jak omezit typy komponent ve složeném objektu  Je potřeba použít run-time kontroly

Implementace – „a co děti?“ Deklarace operací s potomky ( add, remove, getChild )  Operace pro správu dětí nemají smysl pro listy – kam s nimi? V root Component – přináší transparentnost, méně bezpečné  Preferovaná varianta podle GoF  „Divné“ operace v listech, řešit výjimkami V Composite – přináší bezpečnost, odnáší transparentnost  Chyby (snaha přidat potomek k listu) zachyceny už při kompilaci  Leaf a composite mají jiný interface Ve třídě Component definovat virtuální metodu GetComposite() vracející defaultně null Datová struktura pro uchování potomků  Pole, spojové seznamy, stromy, hashovací tabulky, …  Nedefinovat kolekci ve třídě Component ! Pořadí potomků  Composite může definovat pořadí potomků, které se může v aplikaci využít Příklad v Graphics: front-to-back order  Použít vhodnou datovou strukturu  Přizpůsobit interface metod pro přístup a správu potomků, lze použít Iterator pattern

Implementace Explicitní reference na rodiče  Jednodušší pohyb po stromové struktuře, použití ve vzoru Chain of Responsibility  Referenci definovat v Component Leaf a Composite ji dědí spolu s funkcemi s ní případně spojenými  Zajistit, aby reference byla aktuální Měnit ji pouze když je dítě přidáváno nebo odstraňováno z Composite (Add, Remove) Mazání komponent  Mazaný Composite by měl být zodpovědný za smazání svých dětí Výjimka: sdílené komponenty  Při mazání dítěte je potřeba jej odebrat z rodičovy kolekce Composite.Operation()  Nemusí se delegovat pouze na potomky Př.: Composite.Price() vrací cenu objektu: rekurzivně zavolá na všechny své děti a jejich návratové hodnoty sečte

Implementace - vylepšení Cachování pro zlepšení výkonnosti  Při častém procházení nebo prohledávání velkých kompozic je dobré evidovat informace z posledního průchodu / hledání  Composite cachuje informace o dětech Př.: Picture cachuje ohraničenou viditelnou oblast svých dětí, během překreslování je nemusí procházet znovu  Je třeba invalidovat cache při změně Jsou potřeba reference na předky a interface k invalidaci cache Sdílení komponent  Sdílet komponenty např. kvůli úspoře paměti  Složitější, když komponenta může mít nejvýše jednoho rodiče  Řešení – děti mají více rodičů - DAG Problémy s víceznačností, když je požadavek propagován směrem nahoru ve struktuře

Příklad class Equipment { protected: string name; public: Equipment(string name):name(name) {} virtual ~Equipment() {} virtual void add(Equipment* equipment) =0; virtual void remove(Equipment* equipment) =0; virtual int getTotalPrice() =0; string getName() {return this->name;} }; Component (abstract child methods) class Keyboard : public Equipment { private: int price; public: Keyboard(string name, int price) : Equipment(name), price(price) {} int getTotalPrice() {return this->price;} void add(Equipment*) { throw RtExc(); } void remove(Equipment*) { throw RtExc(); } }; Leaf (not implemented child methods)

Příklad class PC : public Equipment { private: List children; public: PC(String name) : Equipment(name) {}; ~PC() { for (Equipment* equipment : children) delete equipment; } int getTotalPrice() { int total = 0; for (Equipment* equipment : children) total += equipment->getTotalPrice(); return total; } void add(Equipment* equipment) { children.add(equipment); } void remove(Equipment* equipment) {children.remove(equipment);} }; Composite Implementované child methods Využití potomků pro výpočet celkové částky

Související vzory Command  Složený MacroCommand Decorator  Často používán s Composite  Interface třídy Component z Decoratoru navíc obsahuje metody pro práci s dětmi Flyweight  Sdílení komponent Iterator  Procházení potomků různými způsoby Visitor  Lokalizuje operace a chování, které by jinak byly rozprostřeny v Composite i Leaf třídách

Shrnutí Zakrytí rozdílu mezi objektem a kolekcí těchto objektů  Zjednodušení práce klienta Možnost cacheování výsledků získaných z potomků  Urychlení běhu programu Struktura

Composite Zdroje  Příklady použití in-rdfowl.html  Vše ostatní GoF C# návrhové vzory, Judith Bishopová