Sobes.tech
Junior

Czym jest wzorzec adaptera?

sobes.tech AI

Odpowiedź od AI

Wzorzec adaptera (Adapter Pattern) jest wzorcem strukturalnym projektowania, który umożliwia współpracę klas z niekompatybilnymi interfejsami. Działa jako opakowanie, które przekształca interfejs jednej klasy w inny, oczekiwany przez klienta.

Zastosowania:

  • Integracja bibliotek zewnętrznych z niekompatybilnymi interfejsami.
  • Użycie istniejących klas w nowych systemach bez ich modyfikacji.
  • Zapewnienie współdziałania między niezależnie opracowanymi klasami.

Przykład implementacji (adapter obiektowy):

Załóżmy, że istnieje klasa LegacyService z metodą oldRequest():

class LegacyService {
    public void oldRequest() {
        // stary kod
    }
}

I nowy interfejs NewService z metodą newRequest():

interface NewService {
    void newRequest();
}

Adapter ServiceAdapter implementuje NewService i zawiera odwołanie do LegacyService:

class ServiceAdapter implements NewService {
    private LegacyService legacyService;

    public ServiceAdapter(LegacyService legacyService) {
        this.legacyService = legacyService;
    }

    @Override
    public void newRequest() {
        // Przekształcenie wywołania nowej metody na starą
        legacyService.oldRequest();
    }
}

Klient może korzystać z LegacyService przez interfejs NewService:

NewService service = new ServiceAdapter(new LegacyService());
service.newRequest(); // Wywoła oldRequest() w LegacyService

Istnieje również wariant — adapter klasowy, który korzysta z wielodziedziczenia (jeśli język to obsługuje) lub dziedziczenia po klasie adaptowanej i implementacji interfejsu docelowego. W Java, ze względu na brak wielodziedziczenia, realizuje się to przez dziedziczenie po klasie adaptowanej i implementację interfejsu adaptera, ale podejście to jest mniej elastyczne. Adapter obiektowy jest bardziej preferowany, ponieważ pozwala na adaptację podklas i unikanie sztywnego powiązania.

Zalety:

  • Umożliwia ponowne użycie niekompatybilnych klas.
  • Encapsuluje szczegóły transformacji interfejsów.
  • Zwiększa elastyczność systemu.

Wady:

  • Może zwiększyć złożoność poprzez dodanie nowej klasy.
  • Wydajność może nieznacznie się obniżyć z powodu dodatkowego poziomu abstrakcji.