post_ico4

Wzorce projektowe, cz. 8 Adapter

Wzorzec adapter (znany także pod nazwą wrapper) służy do przystosowania interfejsów obiektowych, tak aby możliwa była współpraca obiektów o niezgodnych interfejsach. Szczególnie przydaje się przypadku wykorzystania gotowych bibliotek o interfejsach niezgodnych ze stosowanymi w aplikacji. W świecie rzeczywistym adapter to przejściówka, np. przejściówka do wtyczki gniazdka angielskiego na polskie.


Diagram klas wzorca Adapter

Struktura wzorca składa się z elementów takich jak: Target, Adaptee, Adapter oraz Client. Target jest abstrakcją (zazwyczaj interfejsem), jakiej oczekuje klient. Elementem dostarczającym żądanej przez klienta funkcjonalności jest Adaptee (np. zewnętrzną biblioteką). Rolą adaptera, który implementuje interfejs Target, jest „przetłumaczenie” wywołania metod należących do interfejsu Target poprzez wykonanie innych, specyficznych metod z klasy Adaptee.

Przykładowa implementacja

interface Target {
    public function  methodA();
}
class Adaptee {
    public function methodB() {
        echo "Metoda B";
    }
}
class Adapter implements Target {
    public function methodA() {
        $adaptee = new Adaptee();
        $adaptee->methodB();
    }
}

//test
$client = new Adapter();
$client->methodA(); // wyswietli "metoda B"
?>

Przykład z życia wzięty

Przejmujemy administrację nad jakimś większym projektem i istnieje potrzeba wymiany starej biblioteki XML na nową. Oczywiście nazwy metod różnią się diametralnie. Zamiast poprawiać nazwy metod w całym projekcie możemy napisać adapter.

interface OldXML {
    public function  writeXml();
}
class NewXML {
    public function xml() {
        echo "Kod XML";
    }
}
class XML implements OldXML {
    public function writeXml() {
        $adaptee = new NewXML();
        $adaptee->xml();
    }
}

//test
$client = new XML();
$client->writeXml(); // wyswietli "Kod XML"
?>

Interfejs OldXML zawiera zestaw metod starej biblioteki. NewXML jest klasą nowej biblioteki. Natomiasr klasa XML jest swoistą przejściówką pomiędzy dwoma wersjami klas.

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.

Powiązane tematy

Co sądzisz o wpisie?
BeżnadziejnySłabyŚredniDobryBardzo dobry (Brak ocen, bądź pierwszy!)
Loading...
  • henio

    zrozumiałem :) dziękuje. Czyli mówiąc krótko przydatny raczej w rozwijanych projektach lub z braku kompatybilności wstecznej np w połączeniu z bazą danych.

    • Tak, inną sytuacją jest wykorzystanie zewnętrznych bibliotek w swoim, rozbudowanym projekcie. Jeżeli stworzysz adapter dla zewnętrznego skryptu, w przypadku aktualizacji go do nowszej wersji, ewentualne poprawki nanosisz w jednym miejscu :)

      • henio

        Dzięki :)

  • Grzegorz

    Słyszałem taki przykład: Mamy sobie kartę SD z funkcją połącz, ale nasz komp ma tylko port usb, potrzebujemy urządzenia (obiektu adapter), który wykonując funkcję połącz po usb, wywoła funkcję połącz. Adapter to taka przejściówka.

  • Paweł Chry

    z 4 stronnicowego omowienia w podreczniku nie zrozumialem tyle ile tu z 1 str.

    • Dzięki. książki mają to do siebie, że często jest lanie wody, byle objętościowo było w porządku. Ja staram się pisać prostym językiem i zwięźle :)