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

Print Friendly, PDF & Email