Adapter (wzorzec projektowy)

Z Wikipedii

Skocz do: nawigacji, szukaj

Adapter (inne nazwy: Opakowanie, en. Wrapper) – jeden ze strukturalnych wzorców projektowych (zarówno klasowy jak i obiektowy), którego celem jest umożliwienie współpracy dwóm klasom o niekompatybilnych interfejsach. Adapter przekształca interfejs jednej z klas na interfejs drugiej klasy[1]. Innym zadaniem omawianego wzorca jest opakowanie istniejącego interfejsu w nowy[2].

Spis treści

[edytuj] Zastosowanie

Wzorzec adaptera stosowany jest najczęściej w przypadku, gdy wykorzystanie istniejącej klasy jest niemożliwe ze względu na jej niekompatybilny interfejs. Drugim powodem użycia może być chęć stworzenia klasy, która będzie współpracowała z klasami o nieokreślonych interfejsach[3].

[edytuj] Struktura

Struktura i sposób wykorzystania adapteru klasowego różni się nieznacznie od struktury i sposobu wykorzystania adapteru obiektowego. W celu stworzenia adaptera klasowego wykorzystywane jest wielokrotne dziedziczenie. Klasa adaptera dziedziczy prywatnie interfejs klasy adaptowanej oraz publicznie interfejs klienta[1]. W przypadku tego adaptera wywołanie funkcji jest przekierowywane przez jego interfejs do interfejsu obiektu adaptowanego[4].

W przypadku adaptera obiektowego jest inaczej. Klasa adaptera dziedziczy interfejs klienta oraz zawiera w sobie klasę adaptowaną. Rozwiązanie takie umożliwia oddzielenie klasy klienta od klasy adaptowanej[1]. Komplikuje to proces przekazywania żądania: klient wysyła żądanie do adaptera wywołując jedną z jego metod. Następnie adapter konwertuje wywołanie na jedno bądź kilka wywołań i kieruje je do obiektu/obiektów adaptowanych. Te przekazują wyniki działania bezpośrednio do klienta[1][4].

[edytuj] Adapter dwukierunkowy

Zadaniem adaptera dwukierunkowego jest adaptowanie interfejsów klienta oraz adaptowanego. Dzięki takiemu rozwiązaniu każda z klas może pełnić zarówno funkcję klienta jak i adaptowanego. Ten typ adaptera można zaimplementować tylko za pomocą wielokrotnego dziedziczenia[4].

[edytuj] Konsekwencje stosowania

Konsekwencje stosowania wzorca są różne w zależności od tego z jakim typem mamy do czynienia. W przypadku typu klasowego możemy mówić o następujących konsekwencjach:

  • brak możliwości adaptowania klasy wraz z jej podklasami
  • możliwość przeładowania metod obiektu adaptowanego

Do konsekwencji stosowania adaptera obiektowego należą:

  • możliwość adaptacji klasy wraz z jej podklasami (związane jest to z wykorzystaniem składania obiektów)
  • możliwość dodawania nowej funkcjonalności
  • brak możliwości przeładowania metod obiektu adaptowanego

W obu przypadkach należy liczyć się z narzutem na wydajność - tym większym, im większa jest niekompatybilność interfejsów.

[edytuj] Przykłady

[edytuj] Zobacz też

Przypisy

  1. 1,0 1,1 1,2 1,3 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Inżynieria oprogramowania: Wzorce projektowe (Wyd. II). Warszawa: Wydawnictwo Naukowo-Techniczne, 2008, ss. 157-170. ISBN 978-83-204-3472-9. 
  2. Opis wzorca na stronie SourceMaking (ang.). [dostęp 2009-03-06].
  3. Opis wzorca na stronie NetObjectives (ang.). [dostęp 2009-03-07].
  4. 4,0 4,1 4,2 Sneha Prashant: Informacje na temat wzorca dwukierunkowego (ang.). 2008-08-28. [dostęp 2009-03-06].

[edytuj] Bibliografia

  1. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Inżynieria oprogramowania: Wzorce projektowe (Wyd. II). Warszawa: Wydawnictwo Naukowo-Techniczne, 2008, ss. 157-170. ISBN 978-83-204-3472-9. 

[edytuj] Linki zewnętrzne