Dizajnerski uzorci: Adapter. Strukturni predlošci: Adapter Ready kod za adaptere u Javi

    Adapter (uzorak dizajna)/Primjeri koda- Glavni članak: Adapter (uzorak dizajna) Primjer implementacije šablona u C# koristeći System; Adapter prostora imena ( klasa MainApp ( static void Main() ( ... Wikipedia

    Proxy uzorak (uzorak dizajna)

    Design Pattern- Ovaj izraz ima druga značenja, pogledajte Uzorak. U razvoju softvera, obrazac dizajna je ponovljivi arhitektonski dizajn koji predstavlja rješenje problema... ... Wikipedia

    Interfejs (uzorak dizajna)- Dizajn dizajna Interfejs Opisano u obrascima dizajna Ne U računarskoj nauci, obrazac interfejsa nije poseban obrazac među obrascima dizajna. To je opći metod za strukturiranje kompjuterski programi za to... Wikipedia

    Zamjenik (obrazac dizajna)- Proxy uzorak (zamjenik) Dizajn uzorak. Pruža objekt za kontrolu pristupa, presrećući sve pozive prema njemu. Sadržaj 1 Cilj 1.1 Problem 1.2 Rješenje 2 Prednosti 3 ... Wikipedia

    Čuvar (uzorak dizajna)- Design Pattern Guardian Memento Tip: Behavioral opisan u dizajnerskim obrascima Da Guardian (također poznat kao Memento, Token, Token) je obrazac ponašanja. Omogućava vam da popravite bez prekida enkapsulacije... Wikipedia

    Iterator (uzorak dizajna)- Dizajn iteratora Tip iteratora: bihejvioralni Opisan u obrascima dizajna Da Uzorak iteratora (također poznat kao kursor) Dizajnerski obrazac koji se odnosi na obrasce ponašanja. To je objekat koji vam omogućava da dobijete ... Wikipedia

    Prevoditelj (uzorak dizajna)- Dizajn obrazac Interpreter Type: bihevioralni Svrha: rješava problem koji se često javlja, sklon promjenama. Opisan u Design Patterns Da Uzorak tumača (engleski ... Wikipedia

    Linker (uzorak dizajna)- Oblik dizajna Kompozitni tip: strukturni Opisan u obrascima dizajna Da Kompozitni uzorak je obrazac dizajna, odnosi se na strukturalne obrasce, kombinuje objekt... Wikipedia

    Država (uzorak dizajna)- Tip šablona dizajna stanja: bihevioralni Opisano u obrascima dizajna Da Stanje je obrazac dizajna. Koristi se u slučajevima kada se tokom izvršavanja programa objekt ... Wikipedia

    Glavni članak: Adapter (uzorak dizajna) Primjer implementacije obrasca u C# koristeći System; Adapter prostora imena ( klasa MainApp ( static void Main() ( ... Wikipedia

    Ovaj izraz ima druga značenja, pogledajte Obrazac. U razvoju softvera, obrazac dizajna je ponovljivi arhitektonski dizajn koji predstavlja rješenje problema... ... Wikipedia

    Obrazac dizajna interfejsa Interfejs opisan u obrascima dizajna Ne U računarskoj nauci, obrazac interfejsa nije poseban obrazac među obrascima dizajna. To je opći metod za strukturiranje kompjuterskih programa kako bi se... Wikipedia

    Proxy Pattern Design pattern. Pruža objekt za kontrolu pristupa, presrećući sve pozive prema njemu. Sadržaj 1 Cilj 1.1 Problem 1.2 Rješenje 2 Prednosti 3 ... Wikipedia

    Design Pattern Guardian Memento Tip: Behavioral Opisan u obrascima dizajna Da Guardian (također poznat kao Memento, Token, Token) je obrazac ponašanja. Omogućava vam da popravite bez prekida enkapsulacije... Wikipedia

    Obrazac dizajna Iterator Tip iteratora: Behaviorski Opisan u obrascima dizajna Da Uzorak iteratora (također poznat kao kursor) Dizajnerski obrazac koji se odnosi na obrasce ponašanja. To je objekat koji vam omogućava da dobijete ... Wikipedia

    Dizajn obrazac Interpreter Tip: bihevioralni Svrha: rješava problem koji se često javlja, sklon promjenama Opisano u Dizajnerskim obrascima Da Obrasca tumača (engleski ... Wikipedia

    Dizajn obrazac Kompozitni tip: strukturni Opisan u obrascima dizajna Da Kompozitni uzorak je obrazac dizajna, odnosi se na strukturalne obrasce, kombinuje objekat ... Wikipedia

    Tip stanja obrasca dizajna: bihevioralno Opisano u obrascima dizajna Da Stanje je obrazac dizajna. Koristi se u slučajevima kada se tokom izvršavanja programa objekt ... Wikipedia

Prije čitanja, molimo pregledajte sljedeće konvencije i koncepte. Ovaj članak se s određenom učestalošću ažurira, pa ako ste ga već čitali, nije činjenica da se podaci nisu promijenili.

Adapter pripadaju klasi strukturalni uzorci. Koristi se za pretvaranje jednog interfejsa u drugi koji zahteva klijent. Adapter osigurava kompatibilnost nekompatibilnih interfejsa implementacijom sloja.

Princip rada

Adapter nasljeđuje ciljni interfejs na otvoren način (nazovimo ga Target), i zatvoren način prilagodljiv interfejs ( Adaptee). U implementaciji metoda ciljnog interfejsa, zahtjevi se preusmjeravaju (delegiraju) na klasu s prilagodljivim sučeljem

Primjer

// Ciljno sučelje, klijent može raditi samo s njim sučelje iTarget ( public function query(); ) // Prilagodljivo sučelje. Klijent ne zna kako raditi s njim, ali stvarno želi sučelje iAdaptee ( public function request(); ) // Klasa koja implementira prilagodljivu klasu sučelja Adaptee implementira iAdaptee ( public function request() ( return __CLASS__ . ":: " . __METHOD__; ) ) adapter klase implementira iTarget (zaštićeno $adaptee = null; javna funkcija __construct() ( $this -> adaptee = new Adaptee(); ) javna funkcija query() (vrati $this -> adaptee -> zahtjev (); ) ) $ Target = novi adapter(); print $Target -> query(); // "Prilagođeni::zahtjev"

Zaključak

Adapter može prilagoditi nekoliko interfejsa u jedan odjednom; ovaj obrazac se zove objektni adapter Upotreba ovog obrasca opravdana je u nekoliko slučajeva. Ako želite da koristite postojeću klasu sa drugačijim interfejsom. Ako ćete koristiti prilagodljivo sučelje na nekoliko mjesta, a nemate priliku da svugdje izgledate isto, onda bi korištenje zamjenjivih adaptera moglo biti dobra ideja.

Svrha uzorka adaptera

Često u novom softverski projekat Ne može ponovo koristiti postojeći kod. Na primjer, postojeće klase mogu imati željenu funkcionalnost, ali imaju nekompatibilna sučelja. U takvim slučajevima, trebali biste koristiti obrazac Adapter.

Adapter obrazac, koji je softverski omotač preko postojećih klasa, pretvara njihova sučelja u oblik pogodan za kasniju upotrebu.

Pogledajmo jednostavan primjer kada treba koristiti Adapter obrazac. Hajde da razvijemo sistem kontrole klime dizajniran da automatski održava temperaturu okoline u određenim granicama. Važna komponenta Takav sistem je temperaturni senzor, kojim se mjeri temperatura okoline za naknadnu analizu. Za ovaj senzor već postoji gotov softver od programera trećih strana, što je klasa sa odgovarajućim interfejsom. Međutim, ne možete direktno koristiti ovu klasu, jer se očitanja senzora uzimaju u stepenima Farenhajta. Potreban vam je adapter koji pretvara temperaturu u Celzijuse.

Kontejneri queue, priority_queue i stek standardne biblioteke STL šablona implementirani su na osnovu sekvencijalne liste, deque i vektorskih kontejnera, prilagođavajući svoje interfejse željenom obliku. Zbog toga se ovi kontejneri nazivaju adapterski kontejneri.

Opis obrasca adaptera

Neka se klasa čiji interfejs treba prilagoditi željenom obliku nazove Adaptee. Da bi riješio problem transformacije svog sučelja, obrazac Adapter uvodi sljedeću hijerarhiju klasa:

  • Ciljna virtuelna bazna klasa. Najavljeno ovdje korisnički interfejs pogodan tip. Samo ovaj interfejs je dostupan korisniku.
  • Izvedena klasa Adaptera koja implementira Target interfejs. Ova klasa također sadrži pokazivač ili referencu na Adaptee instancu. Adapter obrazac koristi ovaj pokazivač za prosljeđivanje klijentskih poziva Adaptee-u. Budući da su Adaptee i Target interfejsi međusobno nekompatibilni, ovi pozivi obično zahtijevaju konverziju.

Implementacija obrasca adaptera

Klasična implementacija Adapter šablona

Ovdje je implementacija obrasca adaptera. Za gornji primjer prilagođavamo očitanja temperaturnog senzora sistema za kontrolu klime, pretvarajući ih iz stupnjeva Farenhajta u stupnjeve Celzijusa (pretpostavlja se da kod za ovaj senzor nije dostupan za modifikaciju).

#include // Već postojeća klasa senzora temperature okoline FahrenheitSensor (javno: // Dobijte očitanja temperature u Fahrenheit float getFahrenheitTemp() (float t = 32.0; // ... neki kod vraća t; ) ); klasa Senzor ( public: virtual ~Sensor() () virtual float getTemperature() = 0; ); klasa Adapter: public Sensor ( public: Adapter(FahrenheitSensor* p) : p_fsensor(p) ( ) ~Adapter() ( izbriši p_fsensor; ) float getTemperature() ( return (p_fsensor->getFahrenheitTemp()-32.0)*5. ; ) privatno: FahrenheitSensor* p_fsensor; ); int main() ( Senzor* p = novi adapter (novi senzor Farenhajta); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Implementacija obrasca adaptera zasnovanog na zatvorenom nasljeđivanju

Neka naš senzor temperature klima uređaja podržava funkciju podešavanja za preciznija očitavanja. Ovu funkciju nije potrebno koristiti, što je vjerovatno razlog zašto je odgovarajuća metoda adapt() deklarirana zaštićenom od strane programera u postojećoj klasi FahrenheitSensor.

Sistem koji razvijamo mora podržavati prilagođavanje mjerenja. Pošto je pristup zaštićenoj metodi preko pokazivača ili veze zabranjen, klasična implementacija obrasca adaptera ovde više nije prikladna. Jedino rješenje je naslijediti klasu FahrenheitSensor. Interfejs ove klase mora ostati nedostupan korisniku, tako da nasljeđivanje mora biti privatno.

Ciljevi kojima se teži korištenjem otvorenog i zatvorenog nasljeđivanja su različiti. Dok se otvoreno nasljeđivanje koristi za nasljeđivanje interfejsa i implementacije, zatvoreno nasljeđivanje se koristi samo za nasljeđivanje implementacije.

#include class FahrenheitSensor ( public: float getFahrenheitTemp() (float t = 32.0; // ... return t; ) protected: void adjust() () // Podešavanje senzora (zaštićena metoda) ); class Sensor ( public: virtual ~Sensor() () virtual float getTemperature() = 0; virtual void adjust() = 0; ); klasa Adapter: javni senzor, privatni FahrenheitSensor ( public: Adapter() ( ) float getTemperature() ( return (getFahrenheitTemp()-32.0)*5.0/9.0; ) void adjust() ( FahrenheitSensor::adjust(); ) ); int main() ( Senzor * p = novi adapter(); p->prilagodi(); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Rezultati primjene obrasca adaptera

Prednosti šablona adaptera

  • Adapter obrazac vam omogućava da ponovo koristite postojeći kod prilagođavanjem njegovog nekompatibilnog interfejsa u upotrebljiv oblik.

Nedostaci modela adaptera

  • Zadatak pretvaranja sučelja može biti težak ako klijentski pozivi i/ili proslijeđeni parametri nemaju funkcionalnu korespondenciju u objektu koji se prilagođava.

Zdravo svima! Danas ćemo pričati o Pattern Adapter dizajn uzorak. Kao što naziv govori, služi da se nešto osigura prilagoditi, ali šta? I ovaj članak će vam odgovoriti na ovo pitanje.

Opis obrasca dizajna adaptera

Odmaknimo se malo od programiranja i pogledajmo adapteri u stvarnom životu. Na primjer, kupili ste neku opremu (na primjer, računar) u inostranstvu. Stigavši ​​kući s njim, otkrili ste da se utikač drugog standarda ne uklapa u našu rusku utičnicu. sta da radim? Tačno! Morate otići u prodavnicu i kupiti adapter, pomoću koje možete povezati svoj računar na mrežu. Dakle, ovaj adapter i postoji adapter. U njega ubacimo strani utikač, a sam adapter utaknemo u mrežu i sve radi odlično. One. služi jednostavno sloj između naše utičnice i stranog utikača.

Tako da mislim da ste shvatili šta je adapter u životu. U programiranju je isto.

Primjer implementacije adaptera u PHP-u

interfejs iMain (
javna funkcija send();
}

Interfejs iAdaptee (
upit javne funkcije();
}

Class Adaptee implementira iAdaptee (
upit javne funkcije() (
return __CLASS__."::".__METHOD__;
}
}

Class Adapter implementira iMain (
zaštićeno $adaptee = null;

Javna funkcija __construct() (
$this->adaptee = novi Adaptee();
}

Javna funkcija send() (
vrati $this->adaptee->inquiry();
}
}

$goal = novi adapter();
echo $goal->send(); // "Prilagođeni::upit"
?>

Evo našeg koda. Hajde da to shvatimo. Imamo interfejs iMain, klijentski kod može raditi s njim. Zatim imamo interfejs iAdaptee, s kojim klijentski kod ne može raditi, ali mi moramo nekako komunicirati s njim. Onda imamo čas Adaptee iAdaptee a unutar njega ima metod tzv upit, koji jednostavno vraća niz poput KLASA::METOD. Evo nas na času Adapter, koji nasljeđuje interfejs iMain. Unutar njega stvaramo zaštićeno dobro adaptee, jednako null. Zatim, u konstruktoru kreiramo objekat klase Adaptee i zapišite ga u našu zaštićenu imovinu. U metodi poslati vraćamo poziv metode upit.

To je sve. Sada kreiramo naš objekat adaptera i pozivamo metodu poslati.

One. cijela poenta je u tome da možemo raditi sa jednim interfejsom, ali ne možemo sa drugim, i da bismo nekako stupili u interakciju sa ovim nama nedostupnim interfejsom, kreiramo adapter, sloj kroz koji implementiramo naš zadatak.

Zaključak

Sada vam se možda čini da je sve vrlo komplikovano i teško, ali nije tako. Mislim da razumijete značenje adaptera, ali sada vam treba više vježbe. Pogledajte ponovo kod dat u ovom članku i pokušajte ga shvatiti. Prođite kroz nju red po red i recitujte kao da ste prevodilac php. Također, savjetujem vam da pogledate kod nekog frameworka, jer se ovaj šablon tamo dosta često koristi.

Ovim je završen ovaj prilično dug članak, hvala na pažnji!