Uzorci dizajna: adapter. Strukturalni predlošci: Adapter Ready kod za adaptere u Javi

    Adapter (uzorak dizajna)/primjeri koda- Glavni članak: Adapter (design pattern) Primjer implementacije uzorka u C# koristeći System; Adapter prostora imena ( class MainApp ( static void Main() ( ... Wikipedia

    Proxy uzorak (uzorak dizajna)

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

    Sučelje (uzorak dizajna)- Dizajn uzorak Sučelje Opisano u obrascima dizajna Ne U računalnoj znanosti, uzorak sučelja nije poseban uzorak među uzorcima dizajna. To je opća metoda za strukturiranje računalni programi za to... Wikipedia

    Zamjenik (uzorak dizajna)- Proxy uzorak (zamjenik) uzorak dizajna. 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)- Uzorak dizajna Guardian Memento Vrsta: bihevioralni Opisano u uzorcima dizajna Da Guardian (također poznat kao Memento, Token, Token) je bihevioralni obrazac dizajna. Omogućuje popravak bez prekidanja enkapsulacije... Wikipedia

    Iterator (uzorak dizajna)- Uzorak iteratora dizajna Tip iteratora: bihevioralni Opisano u obrascima dizajna Da Uzorak iteratora (također poznat kao pokazivač) Uzorak dizajna koji se odnosi na obrasce ponašanja. To je objekt koji vam omogućuje da dobijete ... Wikipedia

    Tumač (uzorak dizajna)- Design pattern Interpreter Type: bihevioralni Svrha: rješava problem koji se često pojavljuje, sklon promjenama Opisano u Design Patterns Da Interpreter Pattern (engleski ... Wikipedia

    Linker (uzorak dizajna)- Uzorak dizajna Kompozitni tip: strukturalni Opisano u uzorcima dizajna Da Kompozitni uzorak je uzorak dizajna, odnosi se na strukturne uzorke, kombinira objekt ... Wikipedia

    Stanje (uzorak dizajna)- State design pattern Tip: bihevioralni Opisano u Design Patterns Da State je dizajn pattern. Koristi se u slučajevima kada se tijekom izvođenja programa objekt ... Wikipedia

    Glavni članak: Adapter (uzorak dizajna) Primjer implementacije uzorka u C# pomoću sustava; Adapter prostora imena ( class MainApp ( static void Main() ( ... Wikipedia

    Ovaj pojam ima i druga značenja, vidi obrazac. U razvoju softvera, uzorak dizajna je ponovljivi arhitektonski dizajn koji predstavlja rješenje problema... ... Wikipedia

    Uzorak dizajna sučelja Sučelje opisano u obrascima dizajna Ne U informatici, uzorak sučelja nije poseban uzorak među uzorcima dizajna. To je opća metoda za strukturiranje računalnih programa kako bi se... Wikipedia

    Uzorak dizajna proxy uzorka. 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

    Uzorak dizajna Guardian Memento Vrsta: bihevioralni Opisano u uzorcima dizajna Da Guardian (također poznat kao Memento, Token, Token) je bihevioralni obrazac dizajna. Omogućuje popravak bez prekidanja enkapsulacije... Wikipedia

    Uzorak dizajna Iterator Vrsta iteratora: Bihevioralni Opisano u uzorcima dizajna Da Uzorak iteratora (također poznat kao kursor) Uzorak dizajna koji se odnosi na obrasce ponašanja. To je objekt koji vam omogućuje da dobijete ... Wikipedia

    Design pattern Interpreter Type: bihevioralni Svrha: rješava problem koji se često pojavljuje, sklon promjenama Opisano u Design Patterns Da Interpreter pattern (engleski ... Wikipedia

    Uzorak dizajna Kompozitni tip: strukturalni Opisano u uzorcima dizajna Da Kompozitni uzorak je uzorak dizajna, odnosi se na strukturalne uzorke, kombinira objekt ... Wikipedia

    Tip stanja uzorka dizajna: bihevioralni Opisano u uzorcima dizajna Da Stanje je obrazac dizajna. Koristi se u slučajevima kada se tijekom izvođenja programa objekt ... Wikipedia

Prije čitanja pregledajte sljedeće konvencije i koncepte. Ovaj se članak često ažurira, pa ako ste ga već pročitali, nije činjenica da se podaci nisu promijenili.

Adapter pripadaju klasi strukturalni uzorci. Koristi se za pretvaranje jednog sučelja u drugo koje zahtijeva klijent. Adapter osigurava kompatibilnost nekompatibilnih sučelja implementacijom sloja.

Princip rada

Adapter nasljeđuje ciljno sučelje na otvoren način (nazovimo ga Cilj), i zatvoreno prilagodljivo sučelje ( Prilagodnik). U implementaciji metoda ciljnog sučelja zahtjevi se preusmjeravaju (delegiraju) u klasu s prilagodljivim sučeljem

Primjer

// Target 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__; ) ) klasa Adapter implementira iTarget ( protected $adaptee = null; javna funkcija __construct() ( $this -> adaptee = new Adaptee(); ) javna funkcija query() ( return $this -> adaptee -> request (); ) ) $ Cilj = novi adapter(); print $Target -> query(); // "Adaptee::request"

Zaključak

Adapter može prilagoditi nekoliko sučelja u jedno odjednom; ovaj obrazac se zove objektni adapter Korištenje ovog uzorka opravdano je u nekoliko slučajeva. Ako želite koristiti postojeću klasu s drugačijim sučeljem. Ako ćete koristiti prilagodljivo sučelje na nekoliko mjesta, a nemate priliku da svugdje izgleda isto, tada bi korištenje zamjenjivih adaptera moglo biti dobra ideja.

Svrha obrasca adaptera

Često u novom softverski projekt Nije moguće ponovno upotrijebiti postojeći kôd. Na primjer, postojeće klase mogu imati željenu funkcionalnost, ali imati nekompatibilna sučelja. U takvim slučajevima trebali biste koristiti uzorak adaptera.

Uzorak adaptera, koji je softverski omotač nad postojećim klasama, pretvara njihova sučelja u oblik prikladan za kasniju upotrebu.

Pogledajmo jednostavan primjer kada treba koristiti obrazac adaptera. Razvijmo sustav kontrole klime dizajniran za automatsko održavanje temperature okoline unutar zadanih granica. Važna komponenta Takav sustav je senzor temperature, s kojim se mjeri temperatura okoline za naknadnu analizu. Za ovaj senzor već postoji gotov softver od programera trećih strana, što je klasa s odgovarajućim sučeljem. Međutim, ovu klasu ne možete koristiti izravno jer se očitanja senzora uzimaju u stupnjevima Fahrenheita. Potreban vam je adapter koji pretvara temperaturu u Celzijeve stupnjeve.

Spremnici queue, priority_queue i stack standardne biblioteke STL predložaka implementirani su na temelju sekvencijalnih popisa, deque i vektorskih spremnika, prilagođavajući svoja sučelja željenom obliku. Zato se ovi spremnici nazivaju adapterski spremnici.

Opis uzorka adaptera

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

  • Ciljana virtualna osnovna klasa. Najavljeno ovdje korisničko sučelje prikladan tip. Korisniku je dostupno samo ovo sučelje.
  • Izvedena klasa adaptera koja implementira Target sučelje. Ova klasa također sadrži pokazivač ili referencu na Adaptee instancu. Uzorak Adapter koristi ovaj pokazivač za prosljeđivanje poziva klijenta Adaptee-u. Budući da su sučelja Adaptee i Target međusobno nekompatibilna, ovi pozivi obično zahtijevaju konverziju.

Implementacija obrasca adaptera

Klasična implementacija uzorka adaptera

Ovdje je implementacija uzorka adaptera. Za gornji primjer prilagođavamo očitanja senzora temperature sustava kontrole klime, pretvarajući ih iz stupnjeva Fahrenheita u stupnjeve Celzijusa (pretpostavlja se da kod za ovaj senzor nije dostupan za modifikaciju).

#uključi // Već postojeća klasa senzora temperature okoline class FahrenheitSensor ( public: // Dohvaćanje očitanja temperature u Fahrenheit float getFahrenheitTemp() ( float t = 32.0; // ... neki kod vraća t; ) ); klasa Senzor ( public: virtualni ~Senzor() () virtualni float getTemperature() = 0; ); class Adapter: public Sensor ( public: Adapter(FahrenheitSensor* p) : p_fsensor(p) ( ) ~Adapter() ( delete p_fsensor; ) float getTemperature() ( return (p_fsensor->getFahrenheitTemp()-32.0)*5.0/9.0 ; ) privatno: FahrenheitSensor* p_fsensor; ); int main() ( Senzor* p = novi adapter(novi FahrenheitSensor); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Implementacija obrasca adaptera na temelju zatvorenog nasljeđivanja

Neka naš senzor temperature sustava kontrole klime podrži funkciju podešavanja za točnija očitanja. Ova se funkcija ne mora koristiti, što je vjerojatno razlog zašto su programeri proglasili zaštićenom odgovarajuću metodu adjust() u postojećoj klasi FahrenheitSensor.

Sustav koji razvijamo mora podržavati prilagodbu mjerenja. Budući da je pristup zaštićenoj metodi putem pokazivača ili veze zabranjen, klasična implementacija obrasca Adapter ovdje više nije prikladna. Jedino rješenje je naslijediti od klase FahrenheitSensor. Sučelje ove klase mora ostati nedostupno korisniku, stoga nasljeđivanje mora biti privatno.

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

#uključi class FahrenheitSensor ( public: float getFahrenheitTemp() ( float t = 32.0; // ... return t; ) protected: void adjust() () // Podešavanje senzora (protected method)); klasa Senzor ( public: virtualni ~Senzor() () virtualni float getTemperature() = 0; virtualni void adjust() = 0; ); class Adapter: public Sensor, private FahrenheitSensor ( public: Adapter() ( ) float getTemperature() ( return (getFahrenheitTemp()-32.0)*5.0/9.0; ) void adjust() ( FahrenheitSensor::adjust(); ) ); int main() ( Sensor * p = new Adapter(); p->adjust(); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Rezultati primjene obrasca adaptera

Prednosti uzorka adaptera

  • Uzorak adaptera omogućuje vam ponovnu upotrebu postojećeg koda prilagođavanjem njegovog nekompatibilnog sučelja u upotrebljiv oblik.

Nedostaci obrasca 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.

Bok svima! Danas ćemo razgovarati o Uzorak dizajna adaptera uzorka. Kao što naziv implicira, služi da osigura nešto prilagoditi, ali što? A ovaj članak će vam odgovoriti na ovo pitanje.

Opis uzorka dizajna adaptera

Odmaknimo se malo od programiranja i pogledajmo adapteri U stvarnom životu. Na primjer, kupili ste neku opremu (na primjer, računalo) u inozemstvu. Došavši kući s njim, otkrili ste da se utikač drugog standarda ne uklapa u našu rusku utičnicu. Što uraditi? Pravo! Morate otići u trgovinu i kupiti adapter, pomoću kojeg možete povezati svoje računalo s mrežom. Dakle ovaj adapter i postoji adapter. U njega umetnemo strani utikač, a sam adapter uključimo u mrežu i sve radi odlično. Oni. služi jednostavno sloj između naše utičnice i stranog utikača.

Pa mislim da si shvatio što je adapter u životu. U programiranju je isto.

Primjer implementacije adaptera u PHP-u

sučelje iMain (
javna funkcija send();
}

Sučelje 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 = new Adaptee();
}

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

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

Evo našeg koda. Hajdemo shvatiti. Imamo sučelje iMain, kod klijenta može raditi s njim. Zatim imamo sučelje iAdaptee, s kojim kod klijenta ne može raditi, ali moramo na neki način komunicirati s njim. Onda imamo nastavu Prilagodnik iAdaptee a unutar sebe ima metodu tzv upit, koji jednostavno vraća niz poput RAZRED::METODA. Evo dolazimo do razreda Adapter, koji nasljeđuje sučelje iMain. Unutar njega stvaramo zaštićenu imovinu prilagođenik, jednako ništavan. Zatim, u konstruktoru kreiramo objekt klase Prilagodnik i upiši ga u našu zaštićenu imovinu. U metodi poslati vraćamo poziv metode upit.

To je sve. Sada stvaramo naš objekt adaptera i pozivamo metodu poslati.

Oni. cijela poanta je u tome da možemo raditi s jednim sučeljem, ali ne možemo s drugim, a kako bismo na neki način komunicirali s tim nama nedostupnim sučeljem, stvaramo adapter, sloj kroz koji provodimo svoj zadatak.

Zaključak

Sada vam se možda čini da je sve jako komplicirano i teško, ali nije tako. Mislim da razumijete značenje adaptera, ali sada vam treba više prakse. Ponovno pogledajte kôd dan u ovom članku i pokušajte ga shvatiti. Prođite kroz njega red po red i recitirajte ga kao da ste tumač php. Također, savjetujem vam da pogledate kod nekog okvira, jer se ovaj predložak tamo dosta često koristi.

Ovime završavamo ovaj prilično dugačak članak, hvala na pažnji!