Composite “ Spojuj a panuj ”. Zakladní vlastnosti Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit strukturované hierarchie tříd, v níž.

Slides:



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

Stručný úvod do UML.
Mediator. Mediator - motivace  FontDialog  závislosti mezi jednotlivými ovládacími prvky jsou netriviální.
Programovací jazyk C++
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.
 Informací se data a vztahy mezi nimi stávají vhodnou interpretací pro uživatele, která odhaluje uspořádání, vztahy, tendence a trendy  Existuje celá.
Přednáška č. 5 Proces návrhu databáze
Ú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.
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
Hana Kotinová Struktura a cíl práce Metody předzpracování dat Systémy předzpracování dat Historie vývoje DPT Jak program pracuje Budoucnost.
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
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í
Rozšíření jednouživatelské verze IS na víceuživatelskou Prezentace Diplomové práce Autor : Libor Tomášek Spoluautoři : Pobucký M., Drábek L. Vedoucí :
Strategy. Strategy – „All-in-1“ na začátek class AStrategy { public: virtual void Algorithm()=0; protected: AStrategy(); }; class SpecificStrategy: public.
Composite [kompozit, ne kompozajt]. Composite Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit hierarchii tříd složenou ze dvou druhů.
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.
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í.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
IB111 Programování a algoritmizace
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.
Principy OOP Objektově orientované programování vychá-zí ze třech základních principů (rysů): zapouzdření (encapsulation) dědičnost (inheritance) polymorfismus.
PJV031 Přetypování (casting) Objekty, atributy, lokální proměnné, parametry a návratové hodnoty metod mají definovaný, neměnný typ. Jsou dva druhy typů:
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.
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í.
Prototyp. O čem to bude? Prototyp Účel  vytváření objektů  nový objekt se vytváří kopírováním (klonováním) vzoru – prototypu.
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ř.
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
SOLID principy v OOP návrhu
Mediator Několik slov o překladu slova do češtiny (prostředník, zprostředkovatel), vyzdvihnutí počeštěného slova mediátor. 1 1.
Vlastnosti souborů Jaroslava Černá.
Programovací jazyk C++
Decorator Radek Zikmund NPRG024, LS 2016/17.
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Návrhový vzor Flyweight
Abstract Factory.
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í.
ZAL – 7. cvičení 2016.
Unit of Work vzor z P of EAA (Fowler) 1.
Decorator.
Monitor Object 1.
Proxy 1.
Adapter
Composite “Spojuj a panuj”.
Bridge.
Návrhový vzor Prototype.
Transkript prezentace:

Composite “ Spojuj a panuj ”

Zakladní vlastnosti Výslovnost  kompozit, ne kompozajt Účel  Popisuje, jak postavit strukturované hierarchie tříd, v níž s jednotlivými komponentami lze pracovat úplné stejně jako skupinami komponentů  Hierarchie je složená ze dvou druhů objektů Atomických (primitivních) Kontejnerů (rekurzivně složených z primitivních a dalších složených objektů)  Typické operace na komponentách zahranují: Přidavání Odstraňování Vyhledávání Zpracování

Motivace – grafický editor 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  Naivní implementace – bez Composite Definuje třídy pro grafická primitiva (Line, Text, Rect) a třídu jako kontejner Kód používající tyto třídy musí rozlišovat primitivy a kontejnery  Lepší implementace - Composite pattern (Jak? – Hledáme další slajd) Klient nemusí rozlišovat

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 Dobrá implementace grafického editoru Component Composite Leaves

Composite – obecná struktura pozor! diskuse později

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

Composite – použití – výjimky Výkon je kritický parametr pro aplikace  Jestli je možná realizace bez kompozitu  Neplánujete rozšiřování hierarchie a funkčnosti modulu Programujete v jazyce s dynamickým typováním  Existují elegantnější způsoby řešení Nekontrolujete životní cyklus komponent  Zpracování tříd Composite je stochastický proces  Můzou vzniknut cyklické závislosti mezí potomky Kdy používání Composite není dobrým nápadem?

Problémy s implementací Deklarace metod s potomky ( add, remove, getChild )  metody pro správu dětí nemají smysl pro listy – kam s nimi? metody ve společném rozhraní  nepodporované operace v listech řešit výjimkami  preferovaná varianta dle GoF  z dnešního pohledu nevhodné řešení náročné výjimky, kontrola až za běhu metody pouze v Composite  odstranění operace z rozhraní  chyby (snaha přidat potomek k listu) zachyceny už při kompilaci  nepraktické a neflexibilní - dva druhy rozhraní doplnění rozhraní o GetComposite  vrací defaultně nullptr - listy  znalost z kontextu nebo lze otestovat 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

Příklad realizace public abstract class Equipment :Idisposable { protected string _name; public Equipment(string name) { _name = name; } public string Name { get { return _name; } } public Equipment Root { set; get; } public abstract int GetTotalPrice(); public abstract void Dispose(); } Component definuje abstraktní metody pro děti public class EquipmentUnit: Equipment { private int _price; public EquipmentUnit(string name, int price) :base(name) { _price = price; } public override int GetTotalPrice() { return _price; } public override void Dispose() { } } Leaf implementuje abstraktní metody

Příklad realizace - prodloužení public class HWComponents: Equipment { private List _components; public HWComponents(string name) : base(name) { _components = new List (); } public override int GetTotalPrice() { return _components.Sum(item => item.GetTotalPrice()); } public HWComponents Add(Equipment item) { item.Root = this; _components.Add(item); return this; } public HWComponents Remove(Equipment item) { _components.RemoveAll(elem => { elem.Root = null; return elem == item; }); return this; } public override void Dispose() { _components.ForEach(item => item.Dispose()); _components.Clear(); } Composite Implementované metody potomků Využití potomků pro výpočet celkové částky

Příklad realizace - prodloužení var systemUnit = new HWComponents("System unit").Add(new EquipmentUnit("CPU", 4000)).Add(new EquipmentUnit("Motherboard", 3500)).Add(new EquipmentUnit("Hard drive", 2000)).Add(new EquipmentUnit("RAM memory", 1000)).Add(new EquipmentUnit("Trunk", 500)); Equipment PC = new HWComponents("Personal Computer").Add(systemUnit).Add(new EquipmentUnit("Display", 2500)).Add(new EquipmentUnit("Keyboard", 250)); Console.WriteLine(PC.GetTotalPrice()); // PC.Dispose(); Client

Implementace – specifika Explicitní reference na rodiče  Jednodušší pohyb po stromové struktuře, použití ve vzoru Chain of Responsibility  Pomáhá mazání komponentů  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) Composite.Operation()  Nemusí se delegovat pouze na potomky Př.: Equipment.GetTotalPrice() vrací cenu objektu: rekurzivně zavolá na všechny své děti a jejich návratové hodnoty sečte

Implementace – specifika Datová struktura pro uchování potomků  Pole, spojové seznamy, stromy, hashovací tabulky, …  Definice kolekci ve třídě Component není potřebná 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 rozhraní metod pro přístup a správu potomků lze použít vzor Iterator

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 používání sbírky rodičů

Composite – použití GUI  Komponenty a kontejnery Java: AWT, Swing, JSP… atd.NET: WinForms, WPF, Silverlight... atd C++: Qt, GTK+… atd XML a podobné formáty Parsing výrazů  Reprezentace, interpretace Struktura souborů a adresářů...atd Téměř každá stromová struktura v OOP používá vzor Composite java.awt TODO: aktualizovat, doplnit reálné

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 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 MVC, MVVM, MVP  Stavení View-komponentů

Shrnutí Skrývá rozdíl mezi objektem a kolekcí těchto objektů  Definuje hierarchie tříd  Zjednodušení práce klienta Možnost zlepšení pomocí cacheování výsledků získaných z potomků  Urychlení běhu programu Composite není všelék ale velmi užitečný návrhový vzor Jednoduchá struktura