Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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

Podobné prezentace


Prezentace na téma: "Adapter. Adapter – pojem Součástka navržená k propojení dvou „nekompatibilních“ zařízení Definice slova podle Cambridge Advanced Learner's Dictionary:"— Transkript prezentace:

1 Adapter

2 Adapter – pojem

3 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

4 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é“

5 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)

6 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

7 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)

8 Adapter – příklad

9 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í

10 Object Adapter

11 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í)

12 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

13 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

14 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

15 Class Adapter

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

17 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

18 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

19 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

20 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(); }

21 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?

22 Pluggable Adapter

23 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.

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

25 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)

26 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

27 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

28 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

29 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)

30 Adapter – Q&A


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

Podobné prezentace


Reklamy Google