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.