Wzorzec projektowy jest sposobem osiągnięcia zamierzonego celu przy wykorzystaniu klas i metod w ramach obiektowego języka programowania. Doświadczeni programiści potrafią zauważyć korzyści płynące z wykorzystaniem wzorców projektowych. Ich kod jest prostszy, spójniejszy, ładniejszy. Przy pomocy kilku klas i interfejsów potrafią osiągnąć zamierzone cele. Wzorce projektowe to tak naprawdę zbiór dobrych praktyk opracowanych na przestrzeni lat by umożliwić rozwiązanie danego zadana sprawdzonymi metodami.
Jeśli chcesz zaadaptować istniejącą metodę do postaci oczekiwanej przez klasę kliencką zastosuj wzorzec Adapter. Czasami zachodzi potrzeba przystosowania już napisanego kodu do potrzeb nowej klasy klienckiej. Może się okazać, że nowa klasa kliencka uwzględnia taką możliwość. Dzieje się tak za pomocą np. wystawionego interfejsu. Rozpatrzmy przykładową sytuacje. Klient wywołuje potrzebną mu metodę WymaganaMetoda() zadeklarowaną w interfejsie WymaganyInterfejs. Operacje, które mają się wykonać są już zaimplementowane w innej klasie. By zapobiec redundancji kodu możemy zaadoptować istniejące rozwiązanie do potrzeb klasy klienckiej. Wystarczy, że utworzymy naszą klasę adaptacyjną, która będzie dziedziczyć po klasie InnaKlasa i interfejsie klasy klienckiej WymaganyInterfejs. Opisany przykład został zaprezentowany na poniższym diagramie.
public class NowaKlasa : InnaKlasa, WymaganyInterfejs
{
public NowaKlasa()
{
}
public void WymaganaMetoda()
{
GotowaMetoda();
}
}
Jeśli klasa kliencka nie ma zdefiniowanego interfejsu możemy skorzystać z adaptera obiektu. (Jedyne wymaganie – metody, które będziemy chcieli wykorzystać do adaptacji muszą być wirtualne.) Zobaczmy kolejny przykład. Klasa kliencka WymaganaKlasa dostarcza metodę WymaganaMetoda() do naszych celów chcemy wykorzystać bardziej szczegółową zaimplementowanej logiki, która znajduje się w klasie InnaKlasa. Adapter obiektu można utworzyć dziedzicząc po WymaganaKlasa i obsługując metodę WymaganaMetoda() za pomocą obiektu klasy InnaKlasa. Opisany przykład został zaprezentowany na poniższym diagramie.
public class NowaKlasa : WymaganaKlasa
{
private InnaKlasa _innaKlasa;
public NowaKlasa(InnaKlasa i)
{
_innaKlasa = i;
}
public override void WymaganaMetoda()
{
_innaKlasa.GotowaMetoda();
}
}
Podsumowanie
Wzorzec Adapter pozwala nam wykorzystać już zaimplementowany kod do spełnienia wymagań klasy klienckiej. W przypadku zdefiniowanych interfejsów klienckich lub umożliwienia przesłaniania metod klas klienckich w łatwy sposób możemy zaadoptować istniejące rozwiązanie na potrzeby nowej klasy. Takie podejście przyspiesza proces wytwarzania oprogramowania i zmniejsza nadmiarowość kodu.