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.