Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:

Slides:



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

Stručný úvod do UML.
Vývoj aplikací s využitím JavaFX
Seminář C++ 5. cvičení Dědičnost Ing. Jan Mikulka.
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.
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
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.
C++ Přednáška 3 Konstantní a statické členy tříd, ukazatel this, konstantní instance třídy Ing. Jiří Kulhánek , kat. 352, VŠB TU Ostrava 2004.
Čtvrté cvičení Objektové programování Objektový model v Javě
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
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.
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.
Čísla Desetinná čísla. čísla desetinná se v PC ukládají jiným způsobem než čísla celá – výpočty s nimi provádí dvě odlišné části procesoru při výpočtech.
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.
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
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.
13/04/20151 Datový typ třída – class (1) Datový typ definovaný uživatelem Poskytuje mechanismus pro modelování entit, s nimiž manipulují aplikace Charakterizuje.
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.
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.
Vzor na všechno. Vzor – úvod Problém .. Příklad: widgety .. Jak na to? .. Známý také jako...
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í.
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(); //
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
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é.
Programování v jazyce C++ Speciality jazyka C++, úvod do OOP.
Vývojová prostředí Objektově Orientované Programování OB21-OP-EL-KON-DOL-M Orbis pictus 21. století.
SOLID principy v OOP návrhu
Y36PJC Programování v jazyce C/C++
Úvod do C# - OOP Jaroslav BURDYS 4IT.
Y36PJC Programování v jazyce C/C++
Decorator Radek Zikmund NPRG024, LS 2016/17.
NÁZEV ŠKOLY: Střední odborná škola Net Office, spol. s r. o
Návrhový vzor Flyweight
Počítače a programování 2 pro obor EST BPC2E PŘEDNÁŠKA 3
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:

Adapter

Adapter – pojem

Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:  Adapter (also adaptor) a type of plug which makes it possible to connect two or more pieces of equipment to the same electrical supply a device which is used to connect two pieces of equipment

Adapter – návrhový vzor Také známý jako Wrapper Propojení již vytvořených tříd  Bez jejich změny!  Asymetrické – jednu třídu „připojujeme k druhé“

Adapter – účastníci Client (pro něj přizpůsobujeme) Target (definuje cílové rozhraní) Adapter (přizpůsobuje Adaptee na interface Target) Adaptee (implementuje požadované operace)

Adapter – účastníci Client  pro něj přizpůsobujeme  využívá rozhraní Target Target  definuje rozhraní, které vyžaduje Client často abstraktní třída / interface Adaptee (= adaptovaný, přizpůsobovaný)  implementuje požadované operace  má ale jiné rozhraní než Target  často se jedná o převzatý kód, který nelze měnit Adapter  přizpůsobuje Adaptee na interface Target

Class Adapter Object Adapter (private inheritance) „is-implemented-in-terms-of“ (composition) „has-a“ Adapter – dvě možnosti zapojení (public inheritance) „is-a“ (inherited implementation)

Adapter – příklad

class Shape { virtual void BoundingBox(Point& bottomLeft, Point& topRight ) const; virtual Manipulator* CreateManipulator() const; }; class TextView { void GetOrigin(Coord& x, Coord& y); void GetExtent(Coord& width, Coord& height); virtual bool IsEmpty() const; }; Adaptee TextView implementuje některé metody, ale v jiném rozhraní Target Shape definuje cílové rozhraní

Object Adapter

Object Adapter – příklad Adaptee (má vlastní rozhraní) Adapter (přizpůsobuje TextView na interface třídy Shape) Client (pracuje s potomky Shape) Target (definuje cílové rozhraní)

Object Adapter – příklad Object Adapter TextShape class TextShape: public Shape { public: TextShape(TextView* t); virtual void BoundingBox(Point& bottomLeft, Point& topRight) const; virtual bool IsEmpty() const; virtual Manipulator* CreateManipulator() private: TextView* _text }; Object Adapter TextShape veřejně dědí od Targetu Shape Adaptee TextView je privátním členem Adapteru TextShape

Object Adapter – příklad Object Adapter TextShape – implementace metod TextShape::TextShape(TextView* t) { _text = t; } void TextShape::BoundingBox(Point& bottomLeft, Point& topRight ) const { Coord bottom, left, width, height; _text->GetOrigin(bottom, left); _text->GetExtent(width, height); topRight = Point(bottom + height, left + width); bottomLeft = Point(bottom,left); } bool TextShape::IsEmpty() const { return _text->IsEmpty(); } Manipulator* TextShape::CreateManipulator() const { return new TextManipulator(this); } konstruktor vyžaduje již existující instanci Adaptee

Object Adapter – vlastnosti Využívá kompozici  adaptee je private položkou adapter  jednoduchá konstrukce ve všech jazycích (žádná vícenásobná dědičnost) Nemá přístup k protected položkám samotného adaptee Nelze předefinovat položky adaptee  jedině vytvořit podtřídu adaptee, v ní předefinovat a pak použít v adapteru místo adaptee Může vzniknout jako wrapper kolem již existující instance adaptee  úvodní příklad: TextShape::TextShape(TextView* t) Může adaptovat všechny potomky adaptee  úvodní příklad – jako parametr konstruktoru předat libovolného potomka TextView

Class Adapter

Class Adapter – příklad Adapter dědí od Targetu i od Adaptee Adapter může při implementaci Targetu přímo volat metody Adaptee

Class Adapter – příklad Class Adapter TextShape class TextShape: public Shape, private TextView { public: TextShape(); virtual void BoundingBox(Point& bottomLeft, Point& topRight ) const; virtual bool IsEmpty() const; virtual Manipulator* CreateManipulator() }; Vícenásobná dědičnost public od Target private od Adaptee

Class Adapter – příklad Class Adapter TextShape – implementace metod void BoundingBox(Point& bottomLeft, Point& topRight) const { Coord bottom, left, width, height; GetOrigin(bottom, left); GetExtent(width, height); topRight = Point(bottom + height, left + width); bottomLeft = Point(bottom,left); } bool TextShape::IsEmpty() const { return TextView::IsEmpty(); } Manipulator* TextShape::CreateManipulator() const { return new TextManipulator(this); } Přímé volání metody předka Přímé volání metody předka Přímé volání metody předka

Class Adapter – vlastnosti Využívá vícenásobnou dědičnost  přístup ke všem položkám adaptee, lze předefinovat  je svázán s konkrétní třídou (nelze dosadit potomky adaptee) Na rozdíl od Object Adapteru tu není indirekce při delegaci metod  Object adapter: return _text->IsEmpty(); Vícenásobnou dědičnost mnoho jazyků nemá  ale lze dědit od více interfaců je-li target deklarován jako interface, lze pattern použít obojí dědičnost pak bude public – adapter může zastupovat jak adaptee tak target Overhead při vytváření z existujícího adaptee  adaptee lze předat do konstruktoru v něm se ale musí okopírovat položky

Poznámky k implementaci Kolik práce musí odvést samotný Adapter?  Jednoduchá konverze mezi různě pojmenovanými metodami  Podpora kompletně nové množiny operací, z nichž některé implementuje Adapter bez pomoci Adaptee. Adapter nemusí nutně adaptovat pouze jednu třídu. Manipulator* TextShape::CreateManipulator() const { return new TextManipulator(this); } bool TextShape::IsEmpty() const { return TextView::IsEmpty(); }

Některé další variace implementace Two-way Adapter  Objekty typu Adapter nejsou zaměnitelné za objekty typu Adaptee  Někdy je třeba, aby se objekty chovaly transparentně jako Target nebo Adaptee  Two-way Adapter poskytuje společné metody, které převádí na vhodnou implementaci  Typická implementace pomocí vícenásobné dědičnosti. Pluggable Adapter  Do této chvíle: jeden Client, jeden Target, jeden Adapter  Jiná situace: implementace knihovny pro zobrazování obecné stromové struktury  Potencionálně mnoho Adapterů pro mnoho Adaptovaných tříd  Jak co nejvíce ulehčit práci uživatelům knihovny?

Pluggable Adapter

Pluggable Adapter – příklad TreeDisplay Třída TreeDisplay vykresluje stromy Reprezentace stromové struktury může být různá Vytvoříme jednotný interface pro adaptaci všech reprezentací Měl by být co nejmenší – „narrow interface“ Každou reprezentaci „připojíme“ vytvořením Adapteru mezi narrow interface a třídou dané reprezentace.

Pluggable Adapter – příklad TreeDisplay Client – TreeDisplay Target – buď také TreeDisplay nebo delegát Adaptee – FileSystemEntity Adapter – DirectoryTreeDisplay

Pluggable Adapter I – Abstraktní metody I. Abstraktní metody Teprve potomci implementují narrow interface narrow interface součástí TreeDisplay (jako abstraktní metody) Implementace zobrazení stromu společná pro potomky (Volá abstraktní metody narrow interface) „adaptace“ (zde Object Adapter)

Pluggable Adapter II – Delegát Kompozice Narrow interface v samostatné třídě/rozhraní Potomci implementují narrow interface Přístup k narrow interface přes delegáta II. Delegát

Pluggable Adapter – vlastnosti Pluggable Adapter s abstraktními metodami  client je zároveň target, dědí se přímo od něj  propojení s adaptee vhodné pouze přes kompozici (object adapter) target není pouze interface class adapter by vyžadoval vícenásobnou dědičnost Pluggable Adapter pomocí delegáta  je možné využít oba přístupy (object i class adapter)  úplné oddělení narrow interface do delegované třídy přístup k těmto metodám přes ukazatel nutnost předávat ukazatel zpátky na clienta přístup z adapteru do clienta opět přes ukazatel  musí se vytvářet 2 objekty (client, adapter)  client plní částečně roli targetu rozhraní pro přetěžování je oddělené, ale logicky patří k objektu target proto je vhodné (nebo nutné) předávat do adapteru ukazatel na clienta

Adapter – použití Kdy použít  Použití existující třídy s nekompatibilním rozhraním  Vytváření znovupoužitelné třídy, která používá třídy s potenciálně nekompatibilním rozhraním  Použití několika existujících podtříd - nepraktické adaptovat dědičností Adaptujeme rodiče Pouze Object Adapter Známé použití  Pluggable Adapter ve Swing nebo GTK javax.swing.tree.TreeModel – definuje rozhraní, které musí uživatel adaptovat, aby mohl svou datovou strukturu zobrazovat pomocí komponenty JTree. GtkTreeModel – obdoba pro zobrazení datové struktury pomocí widgetu GtkTreeView.  Java I/O StringBufferInputStream – adaptuje třídu StringBuffer tak, aby k ní bylo možné přistupovat jako k InputStreamu  Java wrapper třídy pro primitivní typy  D-Bus – meziprocesový komunikační systém D-Bus object – Target, existuje utilita pro generování C++ adapteru z XML definice

Adapter – související NV Související NV  Bridge odděluje rozhraní od implementace  Adapter mění rozhraní existujících objektů Bridge se používá v době návrhu  Adapter propojuje již existující rozhraní „Bridges are big things, Adapters small“  Decorator nemění rozhraní objektu, přidává nové funkcionality podporuje rekurzivní kompozici  Proxy nemění rozhraní objektu, navenek se chová stejně jako tento objekt skrývá skutečné umístnění objektu (např. objekt na disku, na jiném počítači)

Adapter – Q&A