Oblikovalski vzorci: Adapter. Strukturne predloge: Adapter Ready koda za adapterje v Javi

    Adapter (vzorec oblikovanja)/primeri kode- Glavni članek: Adapter (design pattern) Primer implementacije vzorca v C# z uporabo System; Adapter imenskega prostora ( class MainApp ( static void Main() ( ... Wikipedia

    Vzorec posrednika (vzorec oblikovanja)

    Oblikovalski vzorec- Ta izraz ima druge pomene, glejte Vzorec. V razvoju programske opreme je vzorec načrtovanja ponovljiva arhitekturna zasnova, ki predstavlja rešitev problema... ... Wikipedia

    Vmesnik (vzorec oblikovanja)- Oblikovalski vzorec Vmesnik Opisano v načrtovalnih vzorcih Ne V računalništvu vzorec vmesnika ni poseben vzorec med načrtovalnimi vzorci. Je splošna metoda za strukturiranje računalniški programi za to ... Wikipedia

    Namestnik (vzorec oblikovanja)- Nadomestni vzorec (namestnik) Oblikovalski vzorec. Zagotavlja objekt za nadzor dostopa in prestreže vse klice do njega. Vsebina 1 Cilj 1.1 Problem 1.2 Rešitev 2 Prednosti 3 ... Wikipedia

    Varuh (vzorec oblikovanja)- Oblikovalski vzorec Guardian Memento Vrsta: vedenjski, opisan v načrtovalnih vzorcih Da Guardian (znan tudi kot spominek, žeton, žeton) je vedenjski vzorec načrtovanja. Omogoča vam, da popravite brez zloma enkapsulacije... Wikipedia

    Iterator (načrtovalni vzorec)- Oblikovalski vzorec Iterator Vrsta iteratorja: vedenjski Opisano v načrtovalnih vzorcih Da Iteratorski vzorec (znan tudi kot kazalec) Oblikovalski vzorec, ki se nanaša na vedenjske vzorce. To je predmet, ki vam omogoča, da dobite ... Wikipedia

    Tolmač (načrtovalni vzorec)- Vrsta tolmača načrtovalnega vzorca: vedenjski Namen: rešuje pogosto pojavljajočo se težavo, ki je nagnjena k spremembam. Opisano v vzorcih načrtovanja Da Vzorec tolmača (angleško ... Wikipedia

    Linker (vzorec oblikovanja)- Oblikovalski vzorec Sestavljeni tip: strukturni Opisano v načrtovalnih vzorcih Da Sestavljeni vzorec je oblikovalski vzorec, nanaša se na strukturne vzorce, združuje objekt ... Wikipedia

    Stanje (vzorec oblikovanja)- Vrsta načrtovalnega vzorca stanja: vedenjski Opisano v načrtovalnih vzorcih Da Stanje je načrtovalski vzorec. Uporablja se v primerih, ko med izvajanjem programa objekt ... Wikipedia

    Glavni članek: Adapter (načrtovalni vzorec) Primer implementacije vzorca v C# z uporabo sistema; Adapter imenskega prostora ( class MainApp ( static void Main() ( ... Wikipedia

    Ta izraz ima druge pomene, glejte Vzorec. V razvoju programske opreme je vzorec načrtovanja ponovljiva arhitekturna zasnova, ki predstavlja rešitev problema... ... Wikipedia

    Vzorec načrtovanja vmesnika Vmesnik, opisan v vzorcih načrtovanja Ne V računalništvu vzorec vmesnika ni poseben vzorec med vzorci načrtovanja. Je splošna metoda za strukturiranje računalniških programov z namenom... Wikipedia

    Vzorec oblikovanja proxy vzorca. Zagotavlja objekt za nadzor dostopa in prestreže vse klice do njega. Vsebina 1 Cilj 1.1 Problem 1.2 Rešitev 2 Prednosti 3 ... Wikipedia

    Oblikovalski vzorec Guardian Memento Vrsta: vedenjski, opisan v načrtovalnih vzorcih Da Guardian (znan tudi kot spominek, žeton, žeton) je vedenjski vzorec načrtovanja. Omogoča vam, da popravite brez zloma enkapsulacije... Wikipedia

    Oblikovalski vzorec Iterator Vrsta iteratorja: vedenjski Opisano v načrtovalnih vzorcih Da Vzorec iteratorja (znan tudi kot kazalec) Oblikovalski vzorec, ki se nanaša na vedenjske vzorce. To je predmet, ki vam omogoča, da dobite ... Wikipedia

    Vrsta tolmača načrtovalnega vzorca: vedenjski Namen: rešuje pogosto pojavljajočo se težavo, nagnjeno k spremembam. Opisano v vzorcih načrtovanja Da vzorec tolmača (angleško ... Wikipedia

    Oblikovalski vzorec Sestavljena vrsta: strukturni Opisano v načrtovalnih vzorcih Da Sestavljeni vzorec je oblikovalski vzorec, nanaša se na strukturne vzorce, združuje objekt ... Wikipedia

    Oblikovalski vzorec Vrsta stanja: vedenjski Opisano v načrtovalnih vzorcih Da Stanje je načrtovalski vzorec. Uporablja se v primerih, ko med izvajanjem programa objekt ... Wikipedia

Pred branjem preglejte naslednje konvencije in koncepte. Ta članek se do neke mere posodablja, tako da, če ste ga že prebrali, ni dejstvo, da se podatki niso spremenili.

Adapter spadajo v razred strukturno vzorcev. Uporablja se za pretvorbo enega vmesnika v drugega, ki ga zahteva odjemalec. Adapter zagotavlja združljivost nekompatibilnih vmesnikov z implementacijo sloja.

Načelo delovanja

Adapter podeduje ciljni vmesnik na odprt način (recimo mu Tarča) in zaprt način prilagodljiv vmesnik ( Prilagojen). Pri implementaciji metod ciljnega vmesnika se zahteve preusmerijo (delegirajo) v razred s prilagodljivim vmesnikom

Primer

// Target vmesnik, odjemalec lahko dela samo z njim vmesnik iTarget ( javna funkcija query(); ) // Prilagodljiv vmesnik. Odjemalec ne ve, kako delati z njim, ampak resnično želi vmesnik iAdaptee ( public function request(); ) // Razred, ki implementira prilagodljiv vmesnik vmesnika, Adaptee implementira iAdaptee ( public function request() ( return __CLASS__ . ":: " . __METHOD__; ) ) class Adapter izvaja iTarget ( protected $adaptee = null; javna funkcija __construct() ( $this -> adaptee = new Adaptee(); ) javna funkcija query() ( return $this -> adaptee -> request (); ) ) $ Target = new Adapter(); natisni $Target -> poizvedba(); // "Adaptee::request"

Zaključek

Adapter lahko prilagodi več vmesnikov v enega samega; ta vzorec se imenuje objektni adapter Uporaba tega vzorca je upravičena v več primerih. Če želite uporabiti obstoječi razred z drugačnim vmesnikom. Če boste prilagodljivi vmesnik uporabljali na več mestih in nimate možnosti, da bi bil povsod videti enako, je uporaba zamenljivih adapterjev morda dobra ideja.

Namen vzorca adapterja

Pogosto v novem projekt programske opreme Obstoječe kode ni mogoče ponovno uporabiti. Na primer, obstoječi razredi imajo lahko želeno funkcionalnost, vendar imajo nezdružljive vmesnike. V takih primerih uporabite vzorec adapterja.

Vzorec Adapter, ki je programski ovoj nad obstoječimi razredi, pretvori njihove vmesnike v obliko, primerno za nadaljnjo uporabo.

Oglejmo si preprost primer, kdaj je treba uporabiti vzorec Adapter. Razvijmo sistem za nadzor klime, zasnovan tako, da samodejno vzdržuje temperaturo okolice v določenih mejah. Pomembna komponenta Tak sistem je temperaturni senzor, s katerim se meri temperatura okolja za kasnejšo analizo. Za ta senzor je že pripravljen programsko opremo od razvijalcev tretjih oseb, ki je razred z ustreznim vmesnikom. Vendar pa tega razreda ne morete uporabiti neposredno, saj se odčitki tipala vzamejo v stopinjah Fahrenheita. Potrebujete adapter, ki pretvori temperaturo v Celzije.

Vsebniki queue, priority_queue in stack standardne knjižnice predlog STL so implementirani na podlagi vsebnikov zaporednih seznamov, deque in vektorjev, pri čemer njihove vmesnike prilagajajo želeni obliki. Zato se te posode imenujejo adapterske posode.

Opis vzorca adapterja

Naj se razred, katerega vmesnik je treba prilagoditi želeni obliki, imenuje Adaptee. Da bi rešil problem preoblikovanja svojega vmesnika, vzorec Adapter uvaja naslednjo hierarhijo razredov:

  • Ciljni virtualni osnovni razred. Napovedano tukaj Uporabniški vmesnik primerna vrsta. Uporabniku je na voljo samo ta vmesnik.
  • Izpeljan razred vmesnika, ki implementira ciljni vmesnik. Ta razred vsebuje tudi kazalec ali sklic na primerek Adaptee. Vzorec Adapter uporablja ta kazalec za posredovanje klicev strank Adapteeju. Ker sta vmesnika Adaptee in Target med seboj nezdružljiva, ti klici običajno zahtevajo pretvorbo.

Izvedba vzorca adapterja

Klasična izvedba vzorca Adapter

Tukaj je izvedba vzorca Adapter. Za zgornji primer prilagodimo odčitke temperaturnega senzorja klimatskega sistema in jih pretvorimo iz stopinj Fahrenheita v stopinje Celzija (predpostavlja se, da koda za ta senzor ni na voljo za spreminjanje).

#vključi // Že obstoječi razred tipala temperature okolja class FahrenheitSensor ( public: // Pridobi odčitke temperature v Fahrenheitu float getFahrenheitTemp() ( float t = 32.0; // ... neka koda vrne t; ) ); class Sensor ( public: virtual ~Sensor() () virtual 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 ; ) zasebno: FahrenheitSensor* p_fsensor; ); int main() ( Senzor* p = nov adapter(nov FahrenheitSensor); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Implementacija vzorca Adapter, ki temelji na zaprtem dedovanju

Naj naš senzor temperature klimatskega sistema podpira funkcijo prilagajanja za natančnejše odčitke. Te funkcije ni treba uporabljati, kar je verjetno razlog, zakaj so razvijalci v obstoječem razredu FahrenheitSensor razglasili zaščito ustrezne metode adjust().

Sistem, ki ga razvijamo, mora podpirati prilagajanje meritev. Ker je dostop do zaščitene metode prek kazalca ali povezave prepovedan, klasična izvedba vzorca Adapter tukaj ni več primerna. Edina rešitev je dedovanje iz razreda FahrenheitSensor. Vmesnik tega razreda mora ostati uporabniku nedostopen, zato mora biti dedovanje zasebno.

Cilji, ki jih zasledujemo pri uporabi odprtega in zaprtega dedovanja, so različni. Medtem ko se odprto dedovanje uporablja za dedovanje vmesnika in izvedbe, se zaprto dedovanje uporablja samo za dedovanje implementacije.

#vključi razred FahrenheitSensor (javno: float getFahrenheitTemp() ( float t = 32.0; // ... return t; ) protected: void adjust() () // Prilagodi senzor (zaščitena metoda)); class Sensor ( public: virtual ~Sensor() () virtual float getTemperature() = 0; virtual 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 uporabe vzorca Adapter

Prednosti vzorca adapterja

  • Vzorec Adapter vam omogoča ponovno uporabo obstoječe kode tako, da njen nezdružljiv vmesnik prilagodite v uporabno obliko.

Slabosti vzorca adapterja

  • Naloga pretvorbe vmesnikov je lahko težavna, če klici odjemalca in/ali posredovani parametri nimajo funkcionalne korespondence v objektu, ki se prilagaja.

Pozdravljeni vsi skupaj! Danes bomo govorili o Vzorec oblikovanja adapterja vzorca. Kot že ime pove, služi za zagotovitev, da nekaj prilagoditi, ampak kaj? In ta članek vam bo odgovoril na to vprašanje.

Opis vzorca zasnove adapterja

Odmaknimo se malo od programiranja in poglejmo adapterji v resničnem življenju. V tujini ste na primer kupili nekaj opreme (na primer računalnik). Ko ste z njim prišli domov, ste ugotovili, da vtič drugega standarda ne ustreza naši ruski vtičnici. Kaj storiti? Prav! Morate iti v trgovino in kupiti adapter, s katerim lahko svoj računalnik povežete v omrežje. Torej ta adapter in obstaja adapter. Vanj vstavimo tuji vtič, sam adapter pa vtaknemo v omrežje in vse deluje odlično. Tisti. služi preprosto plast med našo vtičnico in tujim vtičem.

Torej mislim, da ste ugotovili kaj je adapter v življenju. Pri programiranju je enako.

Primer implementacije adapterja v PHP

vmesnik iMain (
javna funkcija send();
}

vmesnik iAdaptee (
poizvedba javne funkcije ();
}

Class Adaptee izvaja iAdaptee (
javna funkcija poizvedba() (
return __CLASS__."::".__METHOD__;
}
}

Class Adapter izvaja iMain (
zaščiten $adaptee = null;

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

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

$goal = nov adapter();
echo $goal->send(); // "Adaptee::povpraševanje"
?>

Torej, tukaj je naša koda. Ugotovimo. Imamo vmesnik iMain, lahko koda odjemalca deluje z njim. Nato imamo vmesnik iAdaptee, s katerim odjemalska koda ne more delovati, vendar moramo z njim nekako komunicirati. Potem imamo razred Prilagojen iAdaptee in znotraj ima metodo, imenovano povpraševanje, ki preprosto vrne niz, kot je RAZRED::METODA. Prišli smo do razreda Adapter, ki podeduje vmesnik iMain. Znotraj njega ustvarimo zaščiteno lastnino prilagojenec, enako nič. Nato v konstruktorju ustvarimo objekt razreda Prilagojen in ga zapišite v našo zaščiteno lastnino. V metodi poslati vrnemo klic metode povpraševanje.

To je vse. Zdaj ustvarimo naš objekt adapterja in pokličemo metodo poslati.

Tisti. bistvo je v tem, da lahko delamo z enim vmesnikom, ne moremo pa z drugim, in da bi nekako sodelovali s tem nam nedostopnim vmesnikom, ustvarimo adapter, plast, skozi katero izvajamo svojo nalogo.

Zaključek

Zdaj se vam morda zdi, da je vse zelo zapleteno in težko, vendar ni tako. Mislim, da razumete pomen adapterja, vendar potrebujete več prakse. Ponovno si oglejte kodo v tem članku in jo poskusite razumeti. Preglejte vrstico za vrstico in jo recitirajte, kot bi bili tolmač php. Prav tako vam svetujem, da pogledate kodo nekega ogrodja, ker se ta predloga tam pogosto uporablja.

S tem zaključujem ta precej dolg članek, hvala za vašo pozornost!