Wraz z rozwojem architektury zorientowanej na usługi (SOA) coraz więcej organizacji korzysta z usług innych firm w swoich systemach korporacyjnych. Firmy te muszą nadążać za szybko zmieniającym się otoczeniem biznesowym, co może oznaczać rezygnację z usług jednego usługodawcy na rzecz innego.
W takich przypadkach istniejąca architektura firmy może być niekompatybilna z architekturą nowego dostawcy. Zamiast marnować miesiące na przepisywanie kodu przedsiębiorstwa w celu zapewnienia zgodności z nowym oprogramowaniem, firma może skorzystać z wzorca projektowego adaptera.
Co to jest wzorzec projektowy adaptera?
Wzorzec adaptera umożliwia współpracę klas, które mają niekompatybilne interfejsy. Czyni to poprzez konwersję interfejsu istniejącej klasy (lub oprogramowania) na taki, jakiego oczekuje klient (lub usługa). Istnieją dwa rodzaje adapterów: adaptery obiektów i adaptery klas.
Adapter obiektowy wykorzystuje kompozycję, aby owinąć adaptowanego adapterem, skutecznie tworząc interfejs, którego oczekuje klient. Tak więc, jeśli klient oczekuje ciągu znaków, adapter przyjmie liczbę całkowitą (osobę adaptującą) i nada jej charakterystykę ciągu znaków.
Powyższy diagram klas przedstawia adapter obiektowy. The klasa adaptera realizuje docelowy interfejs, skutecznie uzyskując dostęp do wszystkich metod interfejsu. Następnie dostosowuje się adaptant i owija to adaptant z docelowy interfejs metody.
Adapter klasy wykorzystuje dziedziczenie wielokrotne, gdzie klasa adaptera jest podklasą zarówno adaptera, jak i klasy docelowej. Poniższy diagram klas przedstawia adapter klas, którego możesz używać w językach programowania obsługujących dziedziczenie wielokrotne.
Implementacja wzorca projektowego adaptera w Javie
Ta aplikacja zaimplementuje adapter obiektu. Ta przykładowa aplikacja symuluje przejście organizacji finansowej z używania i przetwarzania kart obciążeniowych na karty kredytowe. Ta organizacja pierwotnie używała następującego interfejsu kart płatniczych:
publicznyinterfejsDodładowywać kartę{
publicznypróżniasaldo miesięczne();
publicznypróżniaspóźniona opłata();
publicznypróżniaRoczna opłata();
}
Popularnym rodzajem karty obciążeniowej, którą przetwarza system tej organizacji, jest karta śliwkowa:
publicznyklasaśliwkowa kartaprzyboryDodładowywać kartę{
prywatnyint numer karty;
prywatny Ciąg nazwa_klienta;
prywatnypodwójnie balansować;// główny konstruktor
publicznyśliwkowa karta(int nr karty, Ciąg Nazwa klienta, podwójnie balansować){
Ten.Nr karty = Nr karty;
Ten.nazwaklienta = nazwaklienta;
Tenrównowaga = równowaga;
}
// pobierające i ustawiające
publicznyintpobierz nr karty(){
powrót numer karty;
}
publicznypróżniaustaw nr karty(int numer karty){
Ten.Nr karty = Nr karty;
}
publiczny Strunowy pobierzNazwęKlienta(){
powrót nazwa klienta;
}
publicznypróżniaustawNazwaKlienta(Ciąg nazwa_klienta){
Ten.nazwaklienta = nazwaklienta;
}
publicznypodwójnieuzyskać równowagę(){
powrót balansować;
}
publicznypróżniaustaw równowagę(podwójnie balansować){
Tenrównowaga = równowaga;
}
@Nadpisanie
publicznypróżniasaldo miesięczne(){
System.out.println("W styczniu " + Ten.nazwa klienta + " zużyty " + Ten.balansować);
}
@Nadpisanie
publicznypróżniaspóźniona opłata(){
System.out.println(Ten.nazwa klienta + „miesięczna opłata za spóźnienie wynosi 80,00 USD”);
}
@Nadpisanie
publicznypróżniaRoczna opłata(){
System.out.println(Ten.nazwa klienta + „opłata roczna wynosi 200,00 USD”);
}
}
Ta instytucja finansowa przechodzi na karty kredytowe i wycofuje karty płatnicze, więc niektórzy jej klienci mają teraz karty kredytowe:
publicznyinterfejsKarta kredytowa{
publicznypróżniamiesięczna Min.Płatność();
publicznypróżniaodsetki();
publicznypróżniaRoczna opłata();
}
System korporacyjny instytucji finansowej przetwarza obecnie tylko karty kredytowe, ponieważ zamierza zaprzestać korzystania z kart płatniczych w nadchodzącym roku. Ale większość ich klientów nadal korzysta z kart płatniczych. Dlatego inżynierowie zdecydowali, że najlepiej będzie wdrożyć adapter, dopóki wszyscy ich klienci nie przejdą na kartę kredytową.
publicznyklasaAdapter karty obciążeniowejprzyboryKarta kredytowa{
Karta obciążeniowa Karta obciążeniowa;publicznyAdapter karty obciążeniowej(Karta obciążeniowa Karta obciążeniowa){
Ten.chargeCard = chargeCard;
}@Nadpisanie
publicznypróżniamiesięczna Min.Płatność(){
Ten.chargeCard.monthlyBalance();
}@Nadpisanie
publicznypróżniaodsetki(){
Ten.chargeCard.lateFee();
}
@Nadpisanie
publicznypróżniaRoczna opłata(){
Ten.dodładowywać kartę. Roczna opłata();
}
}
Ten adapter karty obciążeniowej klasa Javy wdraża kartę kredytową Interfejs Javy. Dostosowuje ChargeCard (osobę adaptującą), nadając jej cechy karty kredytowej. Na przykład system przetworzy opłatę odsetkową karty kredytowej, która jest opłatą za opóźnienie klienta karty obciążeniowej, który jeszcze nie dokonał konwersji.
Zalety korzystania ze wzorca adaptera
Główną zaletą korzystania z wzorca adaptera jest to, że umożliwia on klientom korzystanie z nowych usług, bibliotek i funkcji bez zmiany ich kodu. Zwiększa to skalowalność aplikacji.
Kolejną zaletą jest to, że ten wzór jest również elastyczny. Wzorzec adaptera udostępnia dwie metody implementacji: adaptery obiektowe i adaptery klas.