Wzorce projektowe: Adapter(Adapter)

W tym artykule jak wynika z tytułu o wzorcu projektowym Adapter(Adapter), z którego nazwy można się domyśleć umożliwia współpracę obiektów niepasujących do siebie, a jak dokładnie się to dzieje o tym dalej 🙂

 

Opis i sposób implementacji

Dokładniej we wzorcu Adapter chodzi o to, żeby możliwa była współpraca obiektów o niezgodnych interfejsach. Przydaje się np w wykorzystaniu nowszych wersji jakichś bibliotek np gdy używaliśmy jakieś starej biblioteki, ale wyszła nowa biblioteka i chcemy tą starą dostosować do tej nowej. Innym zadaniem Adaptera jest też opakowanie starego interfejsu w nowy.

W rzeczywistym świecie Adapter to jakby taka przejściówka np do wtyczki monitora, np niedawno musiałem nowy monitor kupić i wtyczka od tego monitora nie pasowała do wejścia w komputerze, więc musiałem iść do sklepu po przejściówkę, w świecie programowania Adapter ma bardzo podobną funkcję.

 

Struktura

Spójrzmy na diagram UML wzorca adapter

Scheme of Adapter

Widać na nim, że klasa Rectangle korzysta z interfejsu Shape a klasa LegacyRectangle korzysta z klasy Rectangle.

 

Przykład

Schemat działania

Zróbmy jakiś przykład, żeby pokazać o co chodzi w adapterze:

Zrobiłem to na bardzo prostym przykładzie, jest nowa klasa i my chcemy żeby była kompatybilna z interfejsem starej klasy bez zmieniania nazw metod, utworzyłem w tym celu klasę adapter, która implementuje interfejs IClientInterface, czyli musimy utworzyć stare metody w tej klasie i tak robimy i wewnątrz metody SomeMethod1() tworzymy instancję nowej klasy(już nie skupiajmy się na zasadach czystego kodu, ważne żeby przekazać idee adaptera) i wywołujemy jej metodę.

Zauważ co się stało, skorzystaliśmy z metody nowej klasy, ale w klasie Adapter, która używa nazw metod starej klasy, mniej więcej tak działa adapter.

Wynik

 

Modele telefonów

Zróbmy teraz jakiś przykład, który lepiej odnosi się do codziennego życia, zróbmy adapter do nowej wersji iphone z 6 do 7:

Klasa iphone6 wygląda tak:

A klasa iphone7 tak:

Widzimy, że interfejsy tych klas do siebie nie pasują, mają inne nazwy metod, nazwy metod w klasach iphone6 i iphone7, również się zmieniły, a my chcemy użyć starych nazw metod, w takim wypadku musimy utworzyć Adapter, który będzie implementował metody ze starymi nazwami i w tych metodach będzie wywoływał metody z nowej klasy iphone7, wygląda to tak:

Tworzymy najpierw instancję klasy iphone7 o typie abstrakcyjnym, następnie implementujemy metody z interfejsu iphone6 i w nich wywołujemy metody z nowej klasy.

W kliencie, czyli w metodzie „Main” wywołujemy to tak:

Najpierw wywołujemy starą wersję iphone6, potem klasę Adapter, która ma stare metody klasy iphone6, w obu przypadkach działa tak samo.

Wynik

 

Zmiana systemu elektryczności

Ten przykład musiał się znaleźć, w tym przykładzie przesiądziemy z polskiego systemu elektryczności na amerykański, dobrze to obrazuje poniższy obrazek.

Przejdźmy do kodu, ten przykład będzie wyglądał bardzo podobnie jak poprzedni z telefonami. Zacznijmy od klasy PolandElectricalSocket, czyli od polskiego systemu elektryczności.

I zobaczmy też jak wygląda klasa od amerykańskiego systemu elektryczności.

Oraz zobaczmy klasę adaptera przełączającego system polski na system amerykański.

I na końcu klient

Widać, że wygląda to bardzo podobnie jak w poprzednim przykładzie. Jak przerobiłeś przykład z telefonami to nie wiem czy jest tu coś do tłumaczenia.

Wynik

 

Powiązania z innymi wzorcami

  • Fasada używa nowego interfejsu, adapter używa starego interfejsu.
  • Adapter zapewnia inny interfejs dla obiektu. Proxy zapewnia ten sam interfejs. Dekorator zapewnia rozszerzony interfejs.
  • Most jest zaprojektowany tak aby abstrakcja i implementacja były niezależne od siebie. Dzięki adapterowi niepowiązane ze sobą klasy mają ze sobą współpracować.
  • Adapter służy do zmiany interfejsu istniejącego obiektu. Dekorator ulepsza inny obiekt bez zmiany jego interfejsu.

 

Podsumowanie

I to wszystko na temat wzorca Adapter(Adapter)🙂

Link do githuba ze wszystkimi przykładami:  https://github.com/Slaw145/AdapterTutorial

W następnym artykule, będzie mowa o wzorcu Dekorator(Decorator).

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz🙂

Do zobaczenia 🙂

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

2 Comments to "Wzorce projektowe: Adapter(Adapter)"

avatar
  Subscribe  
newest oldest evaluated
Notify about
CodeFinger
Guest

W drugim przykładzie jest mały błąd:

public class PolandToUKPlugConnectorAdapter : UKPlugConnector

PolandToUKPlugConnectorAdapter powienien implementować interfejst PolandPlugConnector.