Lifehacks

Jaký je rozdíl mezi adaptérem a reduktorem?

Nástavec je strukturální návrhový vzor, ​​který umožňuje objektům s nekompatibilními rozhraními spolupracovat.

problém

Představte si, že vytváříte aplikaci pro obchodování na burze. Vaše aplikace stáhne ceny akcií z více zdrojů v XML a poté kreslí krásné grafy.

V určitém okamžiku se rozhodnete vylepšit svou aplikaci pomocí analytické knihovny třetí strany. Zde je ale problém – knihovna podporuje pouze datový formát JSON, který je nekompatibilní s vaší aplikací.

Knihovnu můžete přepsat tak, aby podporovala formát XML. Nejprve však může narušit stávající kód, který již závisí na knihovně. A za druhé, možná jednoduše nemáte přístup k jeho zdrojovému kódu.

rozhodnutí

Můžete tvořit adaptér. Jedná se o objekt překladače, který transformuje rozhraní nebo data jednoho objektu do takové podoby, aby se stal srozumitelným pro jiný objekt.

V tomto případě adaptér obalí jeden z objektů, takže druhý objekt o přítomnosti prvního ani neví. Můžete například obalit objekt, který pracuje v metrech, pomocí adaptéru, který převádí data na stopy.

Adaptéry mohou nejen překládat data z jednoho formátu do druhého, ale také pomáhají objektům s různými rozhraními spolupracovat. Funguje to takto:

  1. Adaptér má rozhraní, které je kompatibilní s jedním z objektů.
  2. Tento objekt tedy může volně volat metody adaptéru.
  3. Adaptér přijímá tato volání a přesměrovává je na druhý objekt, ale ve formátu a pořadí, kterému druhý objekt rozumí.

Někdy je dokonce možné vytvořit oboustranný adaptér, což by fungovalo oběma způsoby.

V aplikaci pro kurzy akcií byste tedy mohli vytvořit třídu XML_To_JSON_Adapter, která by obalila objekt jedné nebo jiné třídy analytické knihovny. Váš kód by odeslal požadavky do adaptéru ve formátu XML a adaptér by nejprve přeložil příchozí data do formátu JSON a poté je předal metodám zabaleného analytického objektu.

Analogie ze života

Když letíte poprvé do zahraničí, možná vás při pokusu o nabití notebooku čeká překvapení. Normy zásuvek se v jednotlivých zemích liší. Vaše evropská nabíječka bude v USA k ničemu bez speciálního adaptéru, který vám umožní připojení k jinému typu zásuvky.

Struktura

Objektový adaptér

Tato implementace používá agregaci: objekt adaptéru “zabalí”, to znamená, že obsahuje odkaz na objekt služby. Tento přístup funguje ve všech programovacích jazycích.

  1. Zákazník je třída, která obsahuje existující obchodní logiku programu.
  2. Klientské rozhraní popisuje protokol, jehož prostřednictvím může klient pracovat s jinými třídami.
  3. Služba – to je nějaký druh užitečné třídy, obvykle třetí strany. Klient nemůže použít tuto třídu přímo, protože služba má rozhraní, kterému nerozumí.
  4. Nástavec je třída, která může současně pracovat jak s klientem, tak se službou. Implementuje klientské rozhraní a obsahuje odkaz na objekt služby. Adaptér přijímá volání od klienta prostřednictvím metod klientského rozhraní a poté je převádí na volání metod na obaleném objektu ve správném formátu.
  5. Při práci s adaptérem přes rozhraní není klient vázán na konkrétní třídu adaptéru. Díky tomu můžete do programu přidávat nové typy adaptérů bez ohledu na kód klienta. To může být užitečné, pokud se rozhraní služby náhle změní, například po vydání nové verze knihovny třetí strany.
Přečtěte si více
Okurky v srpnu, které a kdy zasadit v roce 2024 pro druhou sklizeň

Adaptér třídy

Tato implementace je založena na dědičnosti: adaptér zdědí obě rozhraní současně. Tento přístup je možný pouze v jazycích, které podporují vícenásobnou dědičnost, jako je C++.

  1. Adaptér třídy nepotřebuje vnořený objekt, protože může současně zdědit jak část existující třídy, tak část služby.

Pseudokód

V tomto vtipném příkladu Nástavec převádí jedno rozhraní na druhé, což umožňuje, aby čtvercové kolíky a kulaté otvory do sebe zapadly.

Adaptér vypočítá nejmenší poloměr kruhu, do kterého se vejde čtvercový kolík, a představuje jej jako kulatý kolík s tímto poloměrem.

// Třídy s kompatibilními rozhraními: RoundHole a // RoundPeg. třída RoundHole je konstruktor RoundHole(poloměr) < . >metoda getRadius() je // Vrátí poloměr díry. metoda fits(peg: RoundPeg) je return this.getRadius() >= třída peg.getRadius() RoundPeg je konstruktor RoundPeg(radius) < . >metoda getRadius() je // Vrátí poloměr kulatého kolíku. // Zastaralá, nekompatibilní třída: SquarePeg. class SquarePeg je konstruktor SquarePeg(width) < . >metoda getWidth() je // Vrátí šířku čtvercového kolíku. // Adaptér umožňuje používat čtvercové kolíky a kulaté // otvory dohromady. class SquarePegAdapter rozšiřuje RoundPeg je soukromé pole peg: konstruktor SquarePeg SquarePegAdapter(peg: SquarePeg) je toto.peg = metoda peg getRadius() je // Vypočítejte polovinu úhlopříčky čtvercového pegu pomocí // Pythagorovy věty. return peg.getWidth() * Math.sqrt(2) / 2 // Někde v kódu klienta. hole = new RoundHole(5) rpeg = new RoundPeg(5) hole.fits(rpeg) // TRUE small_sqpeg = new SquarePeg(5) large_sqpeg = new SquarePeg(10) hole.fits(small_sqpeg) // Chyba kompilace, nekompatibilní typy small_sqpeg_adapter = nový SquarePegAdapter(small_sqpeg) large_sqpeg_adapter = new SquarePegAdapter(large_sqpeg) hole.fits(small_sqpeg_adapter) // TRUE hole.fits(large_sqpeg_adapter) // FALSE

Použitelnost

Když chcete použít třídu třetí strany, ale její rozhraní neodpovídá zbytku kódu aplikace.

Adaptér umožňuje vytvořit objekt shim, který změní volání aplikací do formátu, kterému rozumí třída třetí strany.

Když potřebujete použít několik existujících podtříd, ale postrádají některé společné funkce a nemůžete rozšířit nadtřídu.

Můžete vytvořit další úroveň podtříd a přidat chybějící funkce. Ale v tomto případě budete muset duplikovat stejný kód v obou větvích podtříd.

Elegantnějším řešením by bylo vložit chybějící funkcionalitu do adaptéru a zajistit, aby fungoval s nadtřídou. Takový adaptér bude schopen pracovat se všemi podtřídami hierarchie. Toto řešení se bude velmi podobat vzoru Decorator.

Kroky implementace

  1. Ujistěte se, že máte dvě třídy s nekompatibilními rozhraními:
    • užitečný služba – třída utility, kterou nemůžete změnit (je to buď kód třetí strany, nebo na ní závisí jiný kód);
    • jeden nebo více zákazníci — existující třídy aplikací, které jsou nekompatibilní se službou kvůli nepohodlnému nebo neodpovídajícímu rozhraní.
  2. Popište klientské rozhraní, jehož prostřednictvím by třídy aplikací mohly používat třídu služeb.
  3. Vytvořte třídu adaptéru implementující toto rozhraní.
  4. Umístěte do adaptéru pole, které bude ukládat odkaz na objekt služby. Toto pole je obvykle vyplněno objektem předaným konstruktoru adaptéru. V případě jednoduché adaptace lze tento objekt předat přes parametry metod adaptéru.
  5. Implementujte všechny metody klientského rozhraní v adaptéru. Adaptér musí delegovat hlavní práci na službu.
  6. Aplikace musí používat adaptér pouze prostřednictvím klientského rozhraní. Díky tomu bude v budoucnu snadné měnit a přidávat adaptéry.
Přečtěte si více
Laurel Noble 2 roky | Pavlovolimon

Výhody a nevýhody

  • Odděluje a skrývá detaily převodu různých rozhraní od klienta.
  • To komplikuje programový kód kvůli zavedení dalších tříd.

Vztahy s jinými vzory

  • Most je navržen předem, aby vyvíjel velké části aplikace odděleně od sebe. Adaptér se použije dodatečně, aby přinutil nekompatibilní třídy, aby spolupracovaly.
  • Adaptér poskytuje zcela jiné rozhraní pro přístup k existujícímu objektu. Na druhou stranu, při použití vzoru Dekorátor zůstane rozhraní buď stejné, nebo se rozšíří. Navíc Dekoratér podporuje rekurzivní vnořování, o čemž se nedá říci Adaptér.
  • S Adaptérem přistupujete k existujícímu objektu přes jiné rozhraní. Při použití Substitute zůstane rozhraní nezměněno. Pomocí Dekorátoru přistupujete k objektu prostřednictvím pokročilého rozhraní.
  • Fasáda definuje nové rozhraní, zatímco adaptér znovu používá to staré. Nástavec zabalí pouze jednu třídu a Fasáda obklopuje celý subsystém. Kromě, Nástavec umožňuje, aby dvě existující rozhraní spolupracovala, místo aby definovala zcela nové.
  • Bridge, Strategy a State (a také mírně Adapter) mají podobné struktury tříd – všechny jsou postaveny na principu „kompozice“, tedy delegování práce na jiné objekty. Liší se však tím, že řeší různé problémy. Pamatujte, že vzory nejsou jen receptem na sestavení kódu určitým způsobem, ale také popisem problémů, které vedly k danému řešení.

Příklady implementace vzoru

Nedávejte to do MHD

Raději si přečtěte naši knihu o designových vzorech.

Nyní je to pohodlné i při cestování veřejnou dopravou.

Tento článek je součástí našeho eBooku Ponořte se do návrhových vzorů.

  • Prémiový obsah
    • Kniha o vzorech
    • Refaktoringový kurz
    • Úvod do Refaktoringu
      • Čistý kód
      • Technický dluh
      • Kdy Refaktorovat
      • Jak refaktorovat
      • Dmychadla
        • Dlouhá metoda
        • Velká třída
        • Posedlost elementárními typy
        • Dlouhý seznam možností
        • Datové skupiny
        • Přepnout příkazy
        • Dočasné pole
        • Odmítnutí dědictví
        • Alternativní třídy s různými rozhraními
        • Divergentní modifikace
        • Střelba
        • Paralelní hierarchie dědičnosti
        • Komentáře
        • Duplikace kódu
        • Líná třída
        • Třída dat
        • Mrtvý kód
        • Teoretická komunita
        • Závistivé funkce
        • Nevhodná intimita
        • Řetězec hovorů
        • Prostředník
        • Neúplná knihovnická třída
        • Metody skládání
          • Metoda extrakce
          • Metoda vkládání
          • Načítání proměnné
          • Vložení proměnné
          • Nahrazení proměnné voláním metody
          • Variabilní dělení
          • Odstranění přiřazení parametrů
          • Nahrazení metody objektem metod
          • Nahrazení algoritmu
          • Přesouvání metody
          • Přesouvání pole
          • Načítání třídy
          • Vkládání třídy
          • Skrytí delegace
          • Odstranění prostředníka
          • Zavedení externí metody
          • Zavedení místního rozšíření
          • Samozapouzdření v terénu
          • Nahrazení jednoduchého pole objektem
          • Nahrazení hodnoty odkazem
          • Nahrazení reference hodnotou
          • Nahrazení pole pole objektem
          • Duplicitní viditelná data
          • Nahrazení jednosměrné komunikace obousměrnou komunikací
          • Nahrazení obousměrné komunikace jednosměrnou komunikací
          • Nahrazení magického čísla symbolickou konstantou
          • Polní zapouzdření
          • Zapouzdření kolekce
          • Nahrazení kódování typu třídou
          • Nahrazení typového kódování podtřídami
          • Nahrazení typového kódování stavem/strategií
          • Nahrazení podtřídy poli
          • Rozdělení podmíněného příkazu
          • Kombinování podmíněných příkazů
          • Kombinování duplikátů v podmíněných příkazech
          • Odstranění kontrolního příznaku
          • Nahrazení vnořených podmíněných příkazů hraničním operátorem
          • Nahrazení podmíněného operátoru polymorfismem
          • Úvod do objektu Null
          • Zavedení kontroly tvrzení
          • Přejmenování metody
          • Přidání parametru
          • Smazat parametr
          • Oddělování dotazu a modifikátoru
          • Parametrizace metod
          • Nahrazení parametru sadou specializovaných metod
          • Přenesení celého objektu
          • Nahrazení parametru voláním metody
          • Nahrazení parametrů objektem
          • Odstranění setra
          • Skrytí metody
          • Nahrazení konstruktoru tovární metodou
          • Nahrazení chybového kódu výjimkou
          • Nahrazení výjimky stavovým testem
          • Zvyšování pole
          • Metoda vzestup
          • Zvedání těla konstruktéra
          • Metoda sestup
          • Sestupové pole
          • Extrahování podtřídy
          • Extrahování supertřídy
          • Načítání rozhraní
          • Sbalit hierarchii
          • Vytvoření metody šablony
          • Nahrazení dědictví delegováním
          • Nahrazení delegování dědictvím
          • Úvod do vzorů
            • Co je vzor?
            • Historie vzorů
            • Proč znát vzory?
            • Kritika vzorů
            • Klasifikace vzorů
            • Tovární metoda
            • Abstraktní továrna
            • Tvůrce
            • Prototyp
            • Osamělejší
            • Nástavec
            • Most
            • Linker
            • Dekoratér
            • Fasáda
            • Lehký
            • Zástupce
            • Řetězec odpovědnosti
            • Tým
            • Iterátor
            • Prostředník
            • Fotografie
            • Pozorovatel
            • Stav
            • strategie
            • Metoda šablony
            • Посетитель
            • C#
            • C + +
            • Go
            • Jáva
            • PHP
            • PYTHON
            • Rubín
            • Rez
            • Rychlý
            • TypeScript

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Back to top button