Composite “Spojuj a panuj”.

Slides:



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

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.
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
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.
Singleton 1 1.
● SWIG - Simplified Wrapper and Interface Generator ● + google a diskusní fóra ● nástroj zjednodušující (a sjednocující)
Čtvrté cvičení Objektové programování Objektový model v Javě
Desáté cvičení Java Core API Java Collection Framework JavaDoc.
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
Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:
Objektové orientované programování Objektově orientované problémy v PHP Lukáš Masopust 2008.
Objektové programování
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:
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.
Association table mapping Jakub Chalupa Naim Ashhab ČVUT FEL A7B36ASS – Architektura SW systémů LS 2014.
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í.
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
PB161 Principy OOP - rozhraní, dědičnost PB161 | Principy OOP - Dědičnost, rozhraní
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.
Richard Lipka Department of Computer Science and Engineering Faculty of Applied Sciences University of West Bohemia, Pilsen, Czech Republic 1.
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.
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.
Abstract Factory. Abstract Factory – úvod Situace  potřebujeme vytvářet objekty ze skupiny souvisejících nebo na sobě závislých tříd  2 „druhy“ GUI.
Factory Method. Motivace – tisk Knihovna tiskne dokumenty do pdf File Open() Close() Print() PresentationWritingDrawing Knihovna tiskne obrázky do pdf.
Foreign key mapping Jakub Chalupa Naim Ashhab ČVUT FEL
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
Kam se ubírá jazyk C#? Dr. Ing. Dalibor Kačmář Academic Developer Evangelist Developer & Platform Evangelist Group Microsoft Czech & Slovakia Anders Hejlsberg.
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.
Proxy. Popis  Klient má přístup k nějakému objektu  Potřebujeme tento přístup ošetřit, aniž bychom přidělali klientovi práci Kontrola přístupu Vzdálený.
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(); //
CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Jazyk C# a platforma.NET ZS 2015/2016 Pavel Ježek
Petr Puš Software Architect Unicorn a.s. Microsoft C# MVP.
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é.
Strategy. Motivace Ze života - jak to taky může vypadat (R): source("../algorithms/HOCForLOCF.R") source("../algorithms/HOCForLOCFv2.R") source("../MILP/MILP.R")
SOLID principy v OOP návrhu
Úvod do C# - OOP Jaroslav BURDYS 4IT.
Jazyk C# a platforma .NET ZS 2016/2017
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.
State 1.
Decorator Radek Zikmund NPRG024, LS 2016/17.
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í.
Decorator.
Monitor Object 1.
Proxy 1.
Adapter
Bridge.
Návrhový vzor Prototype.
Transkript prezentace:

Composite “Spojuj a panuj”

Motivace - námořnictvo

Motivace

Naivní implementace Bez composite Třídy: pro jednoduché objekty (Cruiser, Destroyer, ..) kontejner pro skupiny objektů (Fleet, Task Force, ..) Nutnost rozlišovat mezi objekty Chování kontejneru je jiné než u jednoduchých objektů private void Sail(Object obj) { if (obj is Ship) ((Ship) obj).sail(); else if (obj is Fleet) foreach(Object o in obj) Sail(o); }

Composite pattern Použití Účel Když je potřeba vykonávat operace nad hierarchií objektů Hierarchie obsahuje různé typy objektů s odlišnými četnostmi Je možné hierarchii rekurzivně skládat (strom) Účel Používá stromovou strukturu pro reprezentaci hierarchie objektů typu část-celek Umožňuje uživateli ignorovat rozdíly mezi složenými a individuálními objekty K tomu implementuje několik metod, které musí být přístupné skrze hierarchii Redukuje složitost kódu

Composite – obecná struktura for (Component c in components) c.operation();

Composite – účastníci Component Leaf (Cruiser, Destroyer) Deklaruje interface pro objekty v kompozici Implementuje defaultní chování Leaf (Cruiser, Destroyer) (nemá potomky) Reprezentuje listové objekty v kompozici Definuje chování primitivních objektů Composite (Task force) Definuje chování složených komponent Uchovává potomky ve vhodné datové struktuře a umožňuje jejich správu Client (Naval commander) Používá objekty v kompozici přes rozhraní Component

Jednoduchý composite Chceme implementovat metodu sail() pro lodě a skupiny lodí Vytvoříme abstraktní třídu Component s metodami Add(), Remove(), Sail() public abstract class Component { public abstract void Sail(); public abstract void Add(Component c); public abstract void Remove(Component c); }

Jednoduchý composite Chceme implementovat metodu sail() pro lodě a skupiny lodí Vytvoříme abstraktní třídu Component s metodami Add(), Remove(), Sail() Vytvoříme třídy Composite a Leaf rozšiřující Component public class Composite : Component { List<Component> components = new List<Component>(); public override void Sail() foreach (var c in components) c.Sail(); } public override void Add(Component c) components.Add(c); public override void Remove(Component c) components.Remove(c);

Jednoduchý composite Chceme implementovat metodu sail() pro lodě a skupiny lodí Vytvoříme abstraktní třídu Component s metodami Add(), Remove(), Sail() Vytvoříme třídy Composite a Leaf rozšiřující Component public class Leaf extends Component { protected int fuel = 1000; // default fuel capacity protected int fuelConsumption = 10; // per mile public override void Sail(){ if (fuel > fuelConsumption) fuel -= fuelConsumtion; moveTo(..); } public override void Add(Component c) { // What to do here? } public override void Remove(Component c) { // What to do here? }

Jednoduchý composite Chceme implementovat metodu Sail() pro lodě a skupiny lodí Vytvoříme abstraktní třídu Component s metodami Add(), Remove(), Sail() Vytvoříme třídy Composit a Leaf rozšiřující Component Definujeme jednotlivé typy lodí a skupin Předáme uživateli (Commander) Ten si vytvoří strukturu -> může použít třeba builder Začne používat metodu Sail() Navy myRoyalNavy = NavyBuilder.Build() .AddFleet(new ForceGroup( new Carrier(), new Destroyer())) .AddShip(new StealthySubmarine()) .Get(); myRoyalNavy.Sail(); // We can define more: myRoyalNavy.SailOut(); myRoyalNavy.Attack(Enemy e); myRoyalNavy.FallBack(); myRoyalNavy.Dock();

Kdo deklaruje Add a Remove? Component Transparentnější Ošetření neopatrnosti uživatele - defaultně error/výjimka (runtime) Bez ošetření může být rizikové public abstract class Component { public void Add(Component c) throw new InvalidOperationException(); }; public void Remove(Component c) }

Kdo deklaruje Add a Remove? Component Transparentnější Ošetření neopatrnosti uživatele - defaultně error/výjimka (runtime) Bez ošetření může být rizikové Composite Bezpečnější (v staticky typovaných jazycích selže už při kompilaci) Nedodržuje transparentnost (Composite se liší od Component) public abstract class Component { public void Add(Component c) throw new InvalidOperationException(); }; public void Remove(Component c) }

getComposite() class Composite; class Component { //... virtual Composite GetComposite() { return null; } } class Composite : Component // ... void Add(Component); virtual Composite GetComposite() { return this; } class Leaf : public Component { }; Composite composite = new Composite; Component component = composite; Composite test = component.GetComposite(); if (test != null) { Test.Add(new Leaf); } GoF preferuje Add a Remove v Component s defaultním errorem z dnešního pohledu je výhodnější použít getComposite()

Možné úpravy Reference na rodiče Sdílení komponent Zjednodušuje průchod a některé operace (delete) Je třeba zaručit invariant: Všichni potomci mají správné rodiče Sdílení komponent Redukce nároků na pamět/výkon Problematické, pokud ukládáme reference na rodiče => Flyweight Definice „class Component : List<Component>“ Už obsahuje metody Add a Remove Nebývá to dobrý nápad – zvětšuje paměťové nároky Pořadí uvnitř Composite Někdy potřebujeme prvky uvnitř Composite setřízené Např.: Aritmetická operace, u lodí specifická sekvence střelby, .. => Iterator Kešování Pro zlepšení výkonu Composite může ukládat informace získané z dětí Změna dat/vlastností komponenty musí být propagována do rodiče

Výhody a nevýhody Skrytí rozdílů mezi objekty a kolekcemi Jednotlivé části lze libovolně skládat a zaměňovat Lehká integrace nových částí Uživatel na ni nemusí reagovat Composite může snížit výkon Je možné jej obejít? Plánujeme aplikaci rozšiřovat? Pokud obsahuje mnoho prvků, vytváří velký overhead Může učinit design příliš obecným Nutnost run-time kontroly typů objektů Maximalizace společného rozhraní nemusí dávat smysl např. Add() u listů U dynamicky typovaných jazyků existují lepší řešení

Composite – použití GUI Reprezentace XML Komponenty a kontejnery Java: AWT, Swing, JSP … .NET: WinForms, WPF, Silverlight ...  C++: Qt, GTK+ …  Reprezentace XML  Destrukce objektů v OOP bez GC Parsing výrazů Reprezentace, interpretace Struktura souborů a adresářů  ... Téměř každá stromová struktura v OOP používá vzor Composite http://www.javaworld.com/javaworld/jw-09-2002/jw-0913-designpatterns.html http://sourcemaking.com/design_patterns/composite http://www.vincehuston.org/dp/composite.html http://www.coolapps.net/composite.htm http://composing-the-semantic-web.blogspot.com/2007/07/composite-design- pattern-in-rdfowl.html

Související vzory Decorator Iterator Visitor Interpreter Č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 Flyweight Pro sdílení komponent Interpreter Composite definuje strukturu pro reprezentaci jazyka, tu pak používá Interpreter Builder a Factories Pro vytváření hierarchie

Shrnutí Skrývá rozdíl mezi objektem a kolekcí těchto objektů Definuje hierarchie tříd Zjednodušení kódu a práce klienta Jednoduchá struktura