Dizayn naqshlari: adapter. Strukturaviy andozalar: Adapter Java-dagi adapterlar uchun tayyor kodi

    Adapter (dizayn namunasi)/kod misollari- Asosiy maqola: Adapter (dizayn namunasi) System yordamida C# da naqshni amalga oshirishga misol; nom maydoni adapteri ( sinf MainApp ( statik void Main() ( ... Vikipediya

    Proksi namunasi (dizayn namunasi)

    Dizayn namunasi- Bu atamaning boshqa maʼnolari ham bor, qarang. Dasturiy ta'minotni ishlab chiqishda dizayn namunasi muammoning yechimini ifodalovchi takrorlanadigan me'moriy dizayndir... ... Vikipediya

    Interfeys (dizayn namunasi)- Dizayn namunasi Interfeys Dizayn naqshlarida tasvirlangan Yo'q Informatika fanida interfeys naqshlari dizayn naqshlari orasida alohida naqsh emas. Bu tuzilishning umumiy usuli kompyuter dasturlari Buning uchun... Vikipediya

    O'rinbosar (dizayn namunasi)- Proksi namunasi (o'rinbosari) dizayn namunasi. Kirishni boshqarish ob'ektini taqdim etadi, unga barcha qo'ng'iroqlarni ushlab turadi. Mundarija 1 Maqsad 1.1 Muammo 1.2 Yechim 2 Taroziga 3 ... Vikipediya

    Guardian (dizayn namunasi)- Dizayn namunasi Guardian Yodgorlik turi: dizayn naqshlarida tasvirlangan xatti-harakatlar Ha Guardian (shuningdek, Memento, Token, Token deb nomlanadi) xatti-harakat dizayn namunasidir. Inkapsulyatsiyani buzmasdan tuzatish imkonini beradi... Vikipediya

    Iterator (dizayn namunasi)- Dizayn namunasi Iterator iterator turi: xatti-harakat dizayn naqshlarida tasvirlangan Ha Iterator naqsh (shuningdek, kursor sifatida ham tanilgan) Xulq-atvor namunalariga ishora qiluvchi dizayn namunasi. Bu sizga ... Vikipediya olish imkonini beradi ob'ekt hisoblanadi

    Tarjimon (dizayn namunasi)- Dizayn namunasi Tarjimon turi: xulq-atvor Maqsad: tez-tez uchraydigan, o'zgarishi mumkin bo'lgan muammoni hal qiladi Dizayn naqshlarida tasvirlangan Ha tarjimon namunasi (inglizcha ... Vikipediya)

    Bog'lovchi (dizayn namunasi)- Dizayn namunasi Kompozit turi: konstruktiv Dizayn naqshlarida tasvirlangan Ha Kompozit naqsh dizayn naqshidir, strukturaviy naqshlarga ishora qiladi, ob'ektni birlashtiradi ... Vikipediya

    Davlat (dizayn namunasi)- Davlat dizayn namunasi Turi: xatti-harakatlar Dizayn naqshlarida tasvirlangan Ha Holat - dizayn namunasi. U dasturni bajarish jarayonida ob'ekt ... Vikipediya bo'lgan hollarda qo'llaniladi

    Asosiy maqola: Adapter (dizayn namunasi) System yordamida C# da naqshni amalga oshirishga misol; nom maydoni adapteri ( sinf MainApp ( statik void Main() ( ... Vikipediya

    Bu atamaning boshqa maʼnolari ham bor, qarang. Dasturiy ta'minotni ishlab chiqishda dizayn namunasi muammoning yechimini ifodalovchi takrorlanadigan me'moriy dizayndir... ... Vikipediya

    Interfeys dizayn namunasi Interfeys dizayn naqshlarida tasvirlangan Yo'q Informatika fanida interfeys namunasi dizayn naqshlari orasida alohida naqsh emas. Bu... Vikipediya uchun kompyuter dasturlarini tizimlashtirishning umumiy usuli

    Proksi namunasi dizayn namunasi. Kirishni boshqarish ob'ektini taqdim etadi, unga barcha qo'ng'iroqlarni ushlab turadi. Mundarija 1 Maqsad 1.1 Muammo 1.2 Yechim 2 Taroziga 3 ... Vikipediya

    Dizayn namunasi Guardian Memento turi: dizayn naqshlarida tasvirlangan xatti-harakatlar Ha Guardian (shuningdek, Memento, Token, Token nomi bilan ham tanilgan) xatti-harakatlar dizayni namunasidir. Inkapsulyatsiyani buzmasdan tuzatish imkonini beradi... Vikipediya

    Dizayn namunasi iterator iterator turi: dizayn naqshlarida tasvirlangan xatti-harakatlar Ha Iterator naqsh (shuningdek, kursor sifatida ham tanilgan) Xulq-atvor namunalariga ishora qiluvchi dizayn namunasi. Bu sizga ... Vikipediya olish imkonini beradi ob'ekt hisoblanadi

    Dizayn namunasi Tarjimon turi: xulq-atvor Maqsad: tez-tez uchraydigan, o'zgarishi mumkin bo'lgan muammoni hal qiladi Dizayn naqshlarida tasvirlangan Ha Tarjimon namunasi (inglizcha ... Vikipediya

    Dizayn namunasi Kompozit turi: konstruktiv Dizayn naqshlarida tasvirlangan Ha Kompozit naqsh dizayn naqshidir, strukturaviy naqshlarga ishora qiladi, ob'ektni birlashtiradi ... Vikipediya

    Dizayn namunasi Holat turi: xulq-atvor Dizayn naqshlarida tasvirlangan Ha Holat - dizayn namunasi. U dasturni bajarish jarayonida ob'ekt ... Vikipediya bo'lgan hollarda qo'llaniladi

O'qishdan oldin, iltimos, quyidagi konventsiya va tushunchalarni ko'rib chiqing. Ushbu maqola bir necha chastota bilan yangilanadi, shuning uchun agar siz uni ilgari o'qigan bo'lsangiz, ma'lumotlar o'zgarmaganligi haqiqat emas.

Adapter sinfga tegishli strukturaviy naqshlar. U mijoz tomonidan talab qilinadigan bir interfeysni boshqasiga aylantirish uchun ishlatiladi. Adapter qatlamni amalga oshirish orqali mos kelmaydigan interfeyslarning mosligini ta'minlaydi.

Ish printsipi

Adapter maqsadli interfeysni ochiq tarzda meros qilib oladi (uni chaqiraylik Maqsad) va yopiq tarzda moslashuvchan interfeys ( Moslashuvchan). Maqsadli interfeys usullarini amalga oshirishda so'rovlar moslashuvchan interfeysga ega bo'lgan sinfga yo'naltiriladi (delegatsiya qilinadi).

Misol

// Maqsadli interfeys, mijoz faqat u bilan ishlashi mumkin iTarget interfeysi ( umumiy funktsiya query(); ) // Moslashuvchan interfeys. Mijoz u bilan qanday ishlashni bilmaydi, lekin haqiqatan ham iAdaptee interfeysini xohlaydi ( public function request(); ) // Moslashuvchan interfeys sinfini amalga oshiradigan sinf Adaptee iAdaptee ( public function request() ( return __CLASS__ . ":: " . __METHOD__; ) ) klassi Adapter iTarget (himoyalangan $adaptee = null; umumiy funktsiya __construct() ( $this -> adaptee = new Adaptee(); ) umumiy funktsiya query() ni amalga oshiradi ($this -> adaptee -> so'rovni qaytarish (); ) ) $ Nishon = yangi adapter(); $Target -> query(); // "Adaptee::request"

Xulosa

Adapter bir vaqtning o'zida bir nechta interfeyslarni bittasiga moslashtira oladi; bu naqsh deyiladi ob'ekt adapteri Ushbu naqshdan foydalanish bir necha hollarda oqlanadi. Agar siz boshqa interfeysga ega mavjud sinfdan foydalanmoqchi bo'lsangiz. Agar siz moslashuvchan interfeysni bir nechta joyda ishlatmoqchi bo'lsangiz va uni hamma joyda bir xil qilish imkoniyati bo'lmasa, almashtiriladigan adapterlardan foydalanish yaxshi fikr bo'lishi mumkin.

Adapter naqshining maqsadi

Ko'pincha yangi dasturiy ta'minot loyihasi Mavjud kodni qayta ishlatib bo‘lmaydi. Misol uchun, mavjud sinflar kerakli funksionallikka ega bo'lishi mumkin, ammo mos kelmaydigan interfeyslarga ega. Bunday hollarda siz Adapter naqshidan foydalanishingiz kerak.

Mavjud sinflar bo'yicha dasturiy ta'minot o'rami bo'lgan Adapter namunasi ularning interfeyslarini keyingi foydalanish uchun mos shaklga aylantiradi.

Keling, Adapter naqshini qachon ishlatish kerakligi haqidagi oddiy misolni ko'rib chiqaylik. Keling, atrof-muhit haroratini belgilangan chegaralarda avtomatik ravishda ushlab turish uchun mo'ljallangan iqlim nazorati tizimini ishlab chiqaylik. Muhim komponent Bunday tizim harorat sensori bo'lib, uning yordamida atrof-muhit harorati keyingi tahlil uchun o'lchanadi. Ushbu sensor uchun allaqachon tayyor mavjud dasturiy ta'minot tegishli interfeysga ega sinf bo'lgan uchinchi tomon ishlab chiquvchilaridan. Biroq, siz ushbu sinfdan to'g'ridan-to'g'ri foydalana olmaysiz, chunki sensor ko'rsatkichlari Farengeyt darajasida olinadi. Sizga haroratni Selsiyga aylantiradigan adapter kerak.

Standart STL shablon kutubxonasining navbat, prioritet_navbat va stek konteynerlari ketma-ket ro'yxat, deque va vektor konteynerlari asosida ularning interfeyslarini kerakli shaklga moslashtirib amalga oshiriladi. Shuning uchun bu konteynerlar adapter konteynerlari deb ataladi.

Adapter naqshining tavsifi

Interfeysi kerakli shaklga moslashtirilishi kerak bo'lgan sinf Adaptee deb nomlansin. Uning interfeysini o'zgartirish muammosini hal qilish uchun Adapter namunasi quyidagi sinf ierarxiyasini taqdim etadi:

  • Maqsadli virtual tayanch sinf. Bu yerda e'lon qilingan foydalanuvchi interfeysi mos tur. Foydalanuvchi uchun faqat ushbu interfeys mavjud.
  • Target interfeysini amalga oshiradigan adapterning olingan klassi. Bu sinf, shuningdek, Adaptee misoliga ko'rsatgich yoki havolani o'z ichiga oladi. Adapter namunasi mijoz qo'ng'iroqlarini Adaptee-ga yo'naltirish uchun ushbu ko'rsatgichdan foydalanadi. Adaptee va Target interfeyslari bir-biriga mos kelmasligi sababli, bu qo'ng'iroqlar odatda konvertatsiya qilishni talab qiladi.

Adapter naqshini amalga oshirish

Adapter naqshining klassik amalga oshirilishi

Bu erda Adapter naqshining amalga oshirilishi. Yuqoridagi misol uchun biz iqlim nazorati tizimining harorat sensori o'qishlarini moslashtiramiz, ularni Farengeyt darajasidan Selsiy gradusiga aylantiramiz (bu sensor uchun kodni o'zgartirish uchun mavjud emas deb taxmin qilinadi).

#o'z ichiga oladi // Allaqachon mavjud atrof-muhit harorati sensori sinfi FahrenheitSensor ( ommaviy: // Fahrenheitda harorat ko'rsatkichlarini oling float getFahrenheitTemp() ( float t = 32.0; // ... ba'zi kodlarni qaytarish t; ) ); sinf Sensor ( ommaviy: virtual ~Sensor() () virtual float getTemperature() = 0; ); sinf Adapter: umumiy Sensor ( umumiy: Adapter(FahrenheitSensor* p) : p_fsensor(p) ( ) ~Adapter() ( p_fsensorni o'chirish; ) float getTemperature() (qaytish (p_fsensor->getFahrenheitTemp()-32.0)*5.0/9.0 ; ) xususiy: FahrenheitSensor* p_fsensor; ); int main() ( Sensor* p = yangi adapter (yangi Fahrenheit Sensor); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Yopiq merosga asoslangan adapter naqshini amalga oshirish

Bizning iqlim nazorati tizimimizning harorat sensori aniqroq o'qish uchun sozlash funktsiyasini qo'llab-quvvatlasin. Ushbu funktsiyadan foydalanish talab qilinmaydi, shuning uchun mos keladigan sozlash() usuli mavjud FahrenheitSensor sinfidagi ishlab chiquvchilar tomonidan himoyalangan deb e'lon qilingan.

Biz ishlab chiqayotgan tizim o'lchovlarni moslashtirishni qo'llab-quvvatlashi kerak. Himoyalangan usulga ko'rsatgich yoki havola orqali kirish taqiqlanganligi sababli, Adapter naqshining klassik qo'llanilishi bu erda endi mos kelmaydi. Yagona yechim FahrenheitSensor sinfidan meros olishdir. Ushbu sinfning interfeysi foydalanuvchi uchun mavjud bo'lmasligi kerak, shuning uchun meros shaxsiy bo'lishi kerak.

Ochiq va yopiq merosdan foydalanishda ko'zlangan maqsadlar boshqacha. Ochiq meros interfeys va amalga oshirish merosi uchun foydalanilsa, yopiq meros faqat amalga oshirish merosi uchun ishlatiladi.

#o'z ichiga oladi sinf FahrenheitSensor ( ommaviy: float getFahrenheitTemp() ( float t = 32.0; // ... return t; ) himoyalangan: bekor sozlash () () // Sensorni sozlash (himoyalangan usul) ); sinf Sensor ( ommaviy: virtual ~Sensor() () virtual float getTemperature() = 0; virtual bo'shliqni sozlash() = 0; ); sinf Adapter: umumiy Sensor, xususiy FahrenheitSensor ( umumiy: Adapter() ( ) float getTemperature() (qaytish (getFahrenheitTemp()-32.0)*5.0/9.0; ) void adjust() ( FahrenheitSensor::adjust(); ) ); int main() ( Sensor * p = yangi adapter(); p->adjust(); cout<< "Celsius temperature = " << p->getTemperature()<< endl; delete p; return 0; }

Adapter naqshini qo'llash natijalari

Adapter naqshining afzalliklari

  • Adapter naqshi mos kelmaydigan interfeysni foydalanish mumkin bo'lgan shaklga moslashtirish orqali mavjud kodni qayta ishlatishga imkon beradi.

Adapter naqshining kamchiliklari

  • Agar mijoz qo'ng'iroqlari va/yoki o'tkazilgan parametrlar moslashtirilayotgan ob'ektda funktsional yozishmalarga ega bo'lmasa, interfeyslarni konvertatsiya qilish vazifasi qiyin bo'lishi mumkin.

Hammaga salom! Bugun biz bu haqda gaplashamiz Pattern Adapter dizayn namunasi. Nomidan ko'rinib turibdiki, u nimanidir ta'minlash uchun xizmat qiladi moslashish, lekin nima? Va bu maqola siz uchun bu savolga javob beradi.

Adapter dizayni naqshining tavsifi

Keling, dasturlashdan biroz uzoqlashib, ko'rib chiqaylik adapterlar haqiqiy hayotda. Masalan, siz chet elda ba'zi uskunalar (masalan, kompyuter) sotib oldingiz. U bilan uyga kelganingizda, siz boshqa standartdagi vilka bizning rus rozetkamizga mos kelmasligini aniqladingiz. Nima qilsa bo'ladi? To'g'ri! Siz do'konga borib, sotib olishingiz kerak adapter, uning yordamida kompyuteringizni tarmoqqa ulashingiz mumkin. Shunday qilib, bu adapter va bor adapter. Biz unga chet el vilkasini joylashtiramiz va adapterni tarmoqqa ulaymiz va hamma narsa ajoyib ishlaydi. Bular. oddiygina xizmat qiladi qatlam rozetkamiz va chet el vilkasi o'rtasida.

Shunday qilib, siz buni tushundingiz deb o'ylayman adapter nima hayotda. Dasturlashda ham xuddi shunday.

PHP da adapterni amalga oshirishga misol

iMain interfeysi (
umumiy funktsiya send();
}

iAdaptee interfeysi (
jamoat vazifalari so'rovi();
}

Class Adaptee iAdaptee (
jamoat funktsiyasi so'rovi() (
qaytish __CLASS__."::".__METHOD__;
}
}

Class Adapter iMain-ni qo'llaydi (
himoyalangan $adaptee = null;

Umumiy funktsiya __construct() (
$this->adaptee = new Adaptee();
}

Umumiy funksiya send() (
$this->adaptee->inquiry();
}
}

$maqsad = yangi adapter();
echo $gol->send(); // "Adaptee::so'rov"
?>

Shunday qilib, bizning kodimiz. Keling, buni aniqlaylik. Bizda interfeys mavjud iMain, mijoz kodi u bilan ishlashi mumkin. Keyin biz interfeysga egamiz iAdaptee, mijoz kodi bilan ishlay olmaydi, lekin biz u bilan qandaydir tarzda o'zaro aloqada bo'lishimiz kerak. Keyin darsimiz bor Moslashuvchan iAdaptee va uning ichida deb nomlangan usul mavjud so'rov, bu oddiygina kabi qatorni qaytaradi KLASS::METOD. Mana biz sinfga keldik Adapter, bu interfeysni meros qilib oladi iMain. Uning ichida biz himoyalangan mulkni yaratamiz moslashuvchi, teng null. Keyinchalik, konstruktorda biz sinf ob'ektini yaratamiz Moslashuvchan va uni himoyalangan mulkimizga yozing. Usulda yuborish biz usul chaqiruvini qaytaramiz so'rov.

Ana xolos. Endi biz adapter ob'ektimizni yaratamiz va usulni chaqiramiz yuborish.

Bular. Gap shundaki, biz bitta interfeys bilan ishlay olamiz, lekin boshqasi bilan ishlay olmaymiz va biz uchun mavjud bo'lmagan ushbu interfeys bilan qandaydir tarzda o'zaro aloqada bo'lish uchun biz yaratamiz. adapter, biz vazifamizni amalga oshiruvchi qatlam.

Xulosa

Endi sizga hamma narsa juda murakkab va qiyin bo'lib tuyulishi mumkin, ammo unday emas. O'ylaymanki, siz adapterning ma'nosini tushunasiz, lekin endi sizga ko'proq amaliyot kerak. Ushbu maqolada keltirilgan kodni qayta ko'rib chiqing va uni tushunishga harakat qiling. Uni satr satrdan o'tkazing va xuddi tarjimon kabi o'qing php. Bundan tashqari, men sizga ba'zi bir ramka kodini ko'rib chiqishni maslahat beraman, chunki bu shablon u erda juda tez-tez ishlatiladi.

Bu juda uzoq maqolani yakunlaydi, e'tiboringiz uchun rahmat!