Uzorak adaptera: opis, funkcije i karakteristike, savjeti za rad

Adapter je obrazac strukturalnog dizajna koji se koristi za organizovanje i implementaciju metoda objekta koji se ne može modifikovati pomoću posebno dizajniranog interfejsa. Inače, možemo reći da je ovo strukturalni obrazac koji omogućava objektima sa nekompatibilnim interfejsima međusobnu interakciju.

Opis

Uzorak Adapter prilagođava između klasa i objekata. Kao i svaki adapter u svijetu oko nas, šablon je interfejs ili most između dva objekta. U stvarnom svijetu imamo adaptere za Napajanja, za čvrste diskove, za slušalice, za memorijske kartice kamere itd. Na primjer, razmotrite nekoliko adaptera za memorijske kartice. Ako nije moguće direktno povezati memorijsku karticu kamere sa prenosnim računarom, možete koristiti adapter: memorijska kartica kamere je povezana sa adapterom, A adapter sa konektorom za laptop. Tako će se riješiti problem nekompatibilnosti interfejsa.

Adapter: uzorak dizajna i interfejs

U slučaju razvoja softvera , sve je otprilike na isti način. Možete zamisliti situaciju u kojoj postoji neka klasa koja čeka neku vrstu objekta, a postoji i objekat koji nudi istu funkcionalnost, ali sa drugačijim interfejsom. Naravno, biće korisno koristiti oba, kako ne bi više puta implementirali jedan od interfejsa i ne menjali postojeće klase. Upravo u ovoj situaciji bilo bi pametno koristiti adapter za dizajn softvera.

Realizacija

Slika ispod prikazuje dijagram UML klase uzorka adaptera.

Adapter: UML dijagram

Klase i objekti uključeni u obrazac dizajna:

  1. (Target) - definiše interfejs specifičan za domenu koji klijent koristi.
  2. (Adapter) - prilagođava interfejs (adapter) ciljnom interfejsu.
  3. (Adaptee) - definiše postojeći interfejs koji treba prilagoditi.
  4. (Klijent) - interakcija sa objektima koji odgovaraju interfejsu (cilj).

Aplikacije

Uzorak adaptera se koristi u sljedećim slučajevima:

  • Kada postoji klasa (cilj) koja poziva metode definisane u interfejsu. Pored toga, postoji još jedna klasa (Adapter) koja ne implementira interfejs, već implementira operacije i metode koje treba pozvati iz prve klase preko interfejsa. Programer nema načina da promijeni bilo koji od postojećih kodova. Adapter implementira svoj interfejs i postaće most između dve klase.
Uzorak adaptera: izgradnja projekta
  • Prilikom pisanja klase (Target) za opštu upotrebu, važno je da se oslonite na neke uobičajene interfejse, a programer ima neke implementirane klase koje ne implementiraju interfejs. Takođe se ova klasa (meta) mora pozvati.

Dobar primjer za korištenje adaptera su omoti koji se koriste za prihvaćanje biblioteka i struktura nezavisnih proizvođača: većina aplikacija koje koriste biblioteke nezavisnih proizvođača koriste adapter kao srednji sloj između aplikacije i biblioteke treće strane za odvajanje aplikacije od Biblioteka. Ako trebate koristiti drugu biblioteku, za novu biblioteku potreban je samo adapter bez promjene koda aplikacije.

Adapteri objekata zasnovani na delegiranju

Objekat adaptera je klasičan primer šablona adaptera. Ona koristi sastav, i (Adaptee) delegata poziva na sebe, koji nije dostupan adapterima klase koje proširuju (Adaptee). Ovo ponašanje nam daje nekoliko prednosti u odnosu na adaptere klase, ali adapteri klase mogu se implementirati na jezicima koji omogućavaju višestruko nasljeđivanje. Glavna prednost je ta što (Adapter) prilagođava ne samo (Adaptee), već i sve njegove podklase. Sve ove podklase postoje sa jednom "mali" ograničenje: svi oni ne mogu dodati nove metode jer mehanizam koji se koristi delegira. Dakle, za bilo koju novu metodu, adapter mora biti izmijenjen ili proširen kako bi se pružile nove metode. Glavni nedostatak je što zahtijeva pisanje novog koda za delegiranje svih potrebnih zahtjeva na adapter.

Klase adapteri na osnovu (više) nasljeđivanja

Klase adapteri mogu se implementirati na jezicima koji podržavaju više nasljeđivanja. Programski jezici Java, C# ili PHP ne podržavaju višestruko nasljeđivanje, ali imaju interfejse. Stoga se takvi obrasci ne mogu lako implementirati na ovim jezicima. Dobar primjer programskog jezika u kojem možete lako implementirati dizajn je jezik C.

Uzorak adaptera koristi nasljeđivanje umjesto kompozicije. To znači da ga umjesto delegiranja poziva (Adaptee) nasljeđuje. Zaključno, adapter klase treba podijeliti na podklase i (cilj) i sam (Adapter).

Adapter na osnovu višestrukog nasljeđivanja

Ovaj pristup ima svoje prednosti i mane:

  • Uzorak prilagođava određenu klasu (Adaptee). Klasa proširuje ovu adaptaciju. Ako je ta potklasa, ne može se prilagoditi postojećim adapterom.
  • Šablon ne zahtijeva sav kod, neophodno za delegacija, koja mora biti napisana za klasu (Adapter).
  • Ako je objekat (cilj) predstavljen interfejsom, a ne klasom, možemo govoriti o "klasa" adapteri, jer možemo implementirati onoliko interfejsa koliko želimo.

Dvosmjerni adapteri

Dvosmjerni adapteri su adapteri koji implementiraju oba interfejsa: oba (Meta)i (adapter). Prilagođeni objekat se može koristiti kao (Target) u novim sistemima koji rade sa klasama (Target) ili kao (Adaptee) u ostali sistemi, rad sa klasama (Adaptee). Ako idemo dalje u ovom pravcu, onda možemo imati adaptere koji implementiraju n-ti broj interfejsa koji se prilagođavaju n-sistemima. Dvosmjerni adapteri i n-smjerni adapteri teško je implementirati u sisteme koji ne podržavaju višestruko nasljeđivanje. Ako adapter mora proširiti klasu (Target), ne može proširiti drugu klasu kao što je (Adaptee), stoga (Adaptee)mora biti interfejs i svi pozivi mogu biti delegirani sa adaptera na objekat (Adaptee).

Korišćenje šablona adaptera u VR razvoju

Osim toga, ako su (Target) i (Adapter) slični, tada adapter treba jednostavno delegirati zahtjeve iz klase (Target) na klasu (Adapter), a ako (Target) i (Adaptee) nisu slični jedni drugima, tada adapter možda treba da transformiše strukture podataka između njih i implementira operacije potrebne za (Target), ali nisu implementirane u (Adaptee) klasi.

Primjer implementacije

Pretpostavimo da imamo klasu (ptica) sa metodama fly () i makeSound (). I takođe klasa (ToyDuck) sa metodom Squeak (). Recimo da imamo malo objekata (ToyDuck) i želimo koristiti objekte (ptica) umjesto njih. Ptice imaju sličnu funkcionalnost, ali implementiraju drugačiji interfejs, tako da ih ne možemo direktno koristiti. Stoga ćemo koristiti šablon adaptera. Ovdje će naš (klijent) biti (ToyDuck), a (Adaptee) će biti (Bird). Ispod je primer implementacije dizajna uzorka adaptera u Javi, jedan od najčešćih programski jezici.

okruženjeBird{javnovoidfly();javnovoidmakeSound();}klasaSparrowalatiBird{javnovoidfly(){Sistem.napolje.println("Leteći");}javnovoidmakeSound(){Sistem.napolje.println("Cvrkut Cvrkut Cvrkut");}}okruženjeToyDuck{javnovoidsqueak();}klasaPlasticToyDuckalatiToyDuck{javnovoidsqueak(){Sistem.napolje.println("Squeak");}}klasaBirdAdapteralatiToyDuck{Bird;javnoBirdAdapter(Bird){ovo.bird = bird;}javnovoidsqueak(){bird.makeSound();}}klasaGlavni{javnostatičkivoidglavni(Args[]){Vrabac vrabac =noviSparrow();ToyDuck toyDuck =noviPlasticToyDuck();ToyDuck birdAdapter =noviBirdAdapter(sparrow);Sistem.napolje.println("Sparrow...");sparrow.fly();sparrow.makeSound();Sistem.napolje.println("ToyDuck...");toyDuck.squeak();Sistem.napolje.println("BirdAdapter...");birdAdapter.squeak();}}

Pretpostavimo da imamo pticu sposobnu za zvuk i plastičnu patku koja može škripati-škripati. Sada pretpostavimo da naš (klijent) promijeni uslov i želi (ToyDuck) da izvrši zvuk (), ali kako?

Primjer dizajna zasnovanog na obrascu adaptera

Rješenje je da jednostavno promijenimo klasu implementacije u novu klasu adaptera i kažemo klijentu da proslijedi instancu ptice u ovu klasu. To je sve. Sada mijenjajući samo jedan red, naučit ćemo (ToyDuck) da tvituje kao vrabac.