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.

Slides:



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

Stručný úvod do UML.
Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
Mediator. Mediator - motivace  FontDialog  závislosti mezi jednotlivými ovládacími prvky jsou netriviální.
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.
Pole, ukazatele a odkazy
ÚVOD DO CPP 7 Dědičnost - pokračování
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
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.
Polymorfismus Dědičnost
Vektorový animátor Diplomová práce
Čtvrté cvičení Objektové programování Objektový model v Javě
J a v a Začínáme programovat Lucie Žoltá metody, objekty, konstruktor.
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í
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í :
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
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:
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.
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
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.
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Principy OOP Objektově orientované programování vychá-zí ze třech základních principů (rysů): zapouzdření (encapsulation) dědičnost (inheritance) polymorfismus.
Vzor na všechno. Vzor – úvod Problém .. Příklad: widgety .. Jak na to? .. Známý také jako...
Factory Method. Motivace – tisk Knihovna tiskne dokumenty do pdf File Open() Close() Print() PresentationWritingDrawing Knihovna tiskne obrázky do pdf.
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.
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íž.
Proxy. Proxy poskytuje bariéru mezi klientem a reálnou implementací.
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")
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY MVC vs MVP.
SOLID principy v OOP návrhu
Y36PJC Programování v jazyce C/C++
Úvod do C# - OOP Jaroslav BURDYS 4IT.
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
Composite “Spojuj a panuj”.
Bridge.
Návrhový vzor Prototype.
Transkript prezentace:

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 objektů před dědičností Delegace volání na dekorovaný objekt + vlastní přidaná funkcionalita  vlastní přidané chování může být před i za delegovaným voláním Decorator – o čem to je

Motivační příklad – GUI Toolkit GUI Toolkit obsahuje komponentu TextView  prosté zobrazení textu Chceme instance této komponenty „dekorovat“  přidat posuvník  přidat rámeček  apod. Hodilo by se přitom:  mít k dispozici také původní TextView bez dekorací  kombinovat vlastnosti mezi sebou posuvník + rámeček  přidávat některé vlastnosti vícenásobně dvojitý rámeček  přidávat/odebírat konkrétní vlastnosti za běhu

1. pokus o řešení: „supertřída“  obsahuje stavy (flagy) pro všechny možné dekorace  vykreslovací metoda kontroluje přítomnost jednotlivých dekorací Motivační příklad – GUI Toolkit class TextView { public void Draw() { /* Main drawing logic here. */ if (isBordered) { /* Border drawing logic here. */ } if (isScrollable) { /* Scrollbar drawing logic here. */ } private bool isBordered;// Is TextView bordered? private int borderWidth;// Used only by bordered TextViews. private bool isScrollable;// Is TextView scrollable? private int scrollBarPosition;// Used only by scrollable TextViews. }

1. pokus o řešení: „supertřída“  můžeme instancím přidávat/odebírat vlastnosti za běhu  nemusíme dekorovat vůbec  můžeme kombinovat vlastnosti  netřeba rozlišovat mezi obyčejnou a dekorovanou instancí  nemůžeme jednu vlastnost použít vícekrát   instance ví, že je dekorována   silně neflexibilní řešení    nerozšiřitelné bez modifikace TextView Motivační příklad – GUI Toolkit

2. pokus o řešení: dědičnost  bázová třída – TextView  odvozené – BorderedTextView, ScrollableTextView, BorderedScrollableTextView Motivační příklad – GUI Toolkit class TextView { public void Draw() {... } } class BorderedTextView extends TextView { public void Draw() {... } } class ScrollableTextView extends TextView { public void Draw() {... } } class BorderedScrollableTextView extends ScrollableTextView { public void Draw() {... } }

2. pokus o řešení: dědičnost  statické nemožno měnit vlastnosti instance za běhu   pro každou kombinaci vlastností je třeba vytvořit novou třídu BorderedScrollableBorderedTextView...  vede k explozi tříd (n vlastností → 2 n tříd)    podstatně zvyšuje komplexitu systému Motivační příklad – GUI Toolkit

3. pokus o řešení: Decorator Motivační příklad – GUI Toolkit Reference na dekorovaný objekt Společný (abstraktní) předek – def. interface pro kreslení Delegace vykreslování na dekorovaný objekt Konkrétní vizuální komponenta Konkrétní dekorátory vyjma delegace implementují navíc své vlastní vykreslování Konkrétní dekorátor Abstraktní dekorátor

3. pokus o řešení: Decorator Motivační příklad – GUI Toolkit public interface VisualComponent { public void Draw(); } class TextView implements VisualComponent { public void Draw() { // draw window } abstract class Decorator implements VisualComponent { protected VisualComponent vc; // component being decorated public Decorator(VisualComponent vc) { this.vc = vc; } public void Draw() { vc.draw(); //delegation } class ScrollDecorator extends Decorator { public ScrollDecorator(VisualComponent vc) { super(vc); public void Draw() { super.Draw(); // draw component drawScrollBar(); // draw scrollbar } private void drawScrollBar() {...} private int scroll_position; public void ScrollTo(int pos) { scroll_position = pos; } class BorderDecorator extends Decorator {... }

3. pokus o řešení: Decorator  dekorátory přidávají jednotlivé vlastnosti (dekorace)  můžeme instancím přidávat/odebírat vlastnosti za běhu  máme k dispozici i obyčejný TextView  dekorace jsou navzájem nezávislé lze je libovolně kombinovat lze je používat i vícekrát  je to transparentní z hlediska klienta není rozdíl mezi obyčejným a dekorovaným TextView TextView o dekoracích vůbec neví Motivační příklad – GUI Toolkit VisualComponent window = new BorderDecorator( new ScrollDecorator( new TextView())); window.Draw();

Účastníci:  Component – def. rozhraní pro objekty, které je možné dynamicky rozšiřovat  ConcreteComponent – def. objekt, který je možné dynamicky rozšířit  Decorator – def. rozhraní pro všechny dekorátory obsahuje refenci na objekt, který dekoruje všechna volání deleguje na dekorovaný objekt  ConcreteDecorator – přidává dodatečné chování komponentě Decorator – struktura a účastníci

Výhody  vyšší flexibilita pro přidávání funkcionality než při statickém dědění  vlastnosti lze přidávat/odebírat za běhu aplikace  několikanásobné použití stejné dekorace  transparentnost  „pay-as-you-go“  není třeba předvídat všechny potřeby klienta jednoduché inkrementální přidávání funkcionality Nevýhody  komponenta a její dekorovaná verze nejsou identické dekorátor se chová jako transparentní zapouzdření při použití dekorátorů nespoléhat na identitu objektů!  mnoho podobných (malých) objektů potenciálně horší orientace v kódu Decorator – výhody a nevýhody

Použití typicky pomocí řetězení konstruktorů: Rozhraní dekorátoru musí být shodné s rozhraním dekorovaného objektu  dědění od společného předka nebo implementace společného interface Abstraktní dekorátor lze vynechat  za předpokladu, že potřebujeme přidat pouze jediné rozšíření  často v případě, kdy potřebujeme rozšířit existující kód  delegování na komponentu se pak děje přímo v tomto jediném dekorátoru Společný předek (Component) by měl zůstat odlehčený  definice rozhraní, nikoli uložení dat  jinak hrozí, že dekorátory budou příliš těžkotonážní Dobré zvážit, zda měnit povrch objektu, či jeho vnitřnosti  návrhový vzor Strategy Decorator – implementace Component c = new ConcreteDecoratorA( new ConcreteDecoratorB( new ConcreteComponent(...))); c.Operation();

Grafické toolkity  X Windows System  Java Swing  System.Windows.Controls Čtení vstupu, zapisování výstupu  System.IO.Stream  java.io Reálně využívané Decoratory Component ConcreteComponent Decorator ConcreteDecorator DataInputStream dis = new DataInputStream( new GzipInputStream( new BufferedInputStream( new FileInputStream("file.gz")))); dis.Read(...);

Adapter  Decorator mění pouze chování objektu, ne jeho rozhraní  Adapter dá objektu zcela nové rozhraní Composite  Decorator lze technicky vnímat jak zdegenerovaný Composite s jedinou komponentou  Decorator přidává dodatečné chování není určen pro agregaci objektů Strategy  Decorator umožňuje měnit skin (povrch, kůži...) objektu v zásadě obaluje nějaký objekt a mění při tom jeho chování zatímco Strategy umožňuje měnit „vnitřnosti“ (guts) objektu  komponenta ve Strategy ví o možných extenzích, u Decoratoru nikoli: Související vzory