Adapter (wzorzec projektowy)

Adapter

Adapter (znany również jako: opakowanie, ang. wrapper) to wzorzec projektowy, którego głównym celem jest umożliwienie współpracy dwóch klas, które mają niekompatybilne interfejsy. Adapter przekształca interfejs jednej klasy tak, aby był zgodny z interfejsem drugiej klasy. Innym jego zadaniem jest opakowanie już istniejącego interfejsu w nowy.

Problem

Wzorzec adaptera jest najczęściej stosowany, gdy nie można wykorzystać istniejącej klasy z powodu jej niekompatybilnego interfejsu. Drugim powodem jego zastosowania może być potrzeba stworzenia klasy, która będzie mogła współpracować z klasami o nieokreślonych interfejsach.

Struktura

Wzorzec adaptera występuje w dwóch wariantach:

  • klasowy,
  • obiektowy.

Obie wersje różnią się nieznacznie budową oraz właściwościami. W przypadku adaptera klasowego wykorzystywane jest wielokrotne dziedziczenie. Klasa adaptera dziedziczy prywatnie po klasie adaptowanej oraz publicznie implementuje interfejs klienta. W tym przypadku wywołania funkcji są przekierowywane do bazowej klasy adaptowanej.

Natomiast adapter obiektowy dziedziczy interfejs, który wykorzystuje klient, i zawiera klasę adaptowaną. Takie rozwiązanie pozwala na oddzielenie klasy klienta od klasy adaptowanej. Proces przekazywania żądań jest bardziej skomplikowany: klient wysyła żądanie do adaptera, wywołując jedną z jego metod. Adapter konwertuje to wywołanie na jedno lub kilka wywołań i kieruje je do obiektu/obiektów adaptowanych, które następnie przekazują wyniki bezpośrednio do klienta.

Adapter dwukierunkowy

Adapter dwukierunkowy ma na celu dostosowanie interfejsów zarówno klienta, jak i adaptowanego. Dzięki temu każda z klas może pełnić rolę zarówno klienta, jak i adaptowanego. Tego typu adapter można zaimplementować wyłącznie przy użyciu wielokrotnego dziedziczenia.

Konsekwencje stosowania

Konsekwencje wprowadzenia wzorca są różne, w zależności od jego typu. Dla adaptera klasowego są to:

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

Natomiast dla adaptera obiektowego konsekwencje obejmują:

  • możliwość adaptacji klasy wraz z jej podklasami (co jest związane 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 wydajnościowym – tym większym, im większa jest niekompatybilność interfejsów.

Zobacz też

  • most
  • dekorator
  • pełnomocnik

Przypisy

Bibliografia

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku. Helion, 2010, s. 141-151. ISBN 978-83-246-2662-5.

Linki zewnętrzne