Struktural Patternlar

All lectures for UZ purposes
Daraja, Dars
Mavjud

2.1 Adapter

Adapter — struktural dizayn patterni bo'lib, o'zgartirib bo'lmaydigan ob'ektning funksiyalaridan foydalanishni tashkil qilish uchun maxsus interfeys orqali xizmat qiladi.

Rasmiy ta'rif biroz murakkab bo'lsa-da, oddiygina qilib aytganda adapter — bu dizayn patterni bo'lib, mos kelmaydigan interfeyslarga ega ob'ektlarning birgalikda ishlashiga imkon beradi.

Adapter pattern

Foydalaniladi o'zgartirib bo'lmaydigan ob'ektning funksiyalaridan maxsus interfeys orqali foydalanishni tashkil qilish uchun. Kerakli interfeysga ega qo'shimcha sinf yaratiladi, va bu sinf o'z navbatida kerakli ob'ektning metodlarini chaqiradi (unda talab etiladigan interfeys yo'qligi sababli).

Muvofiq! Agar kodda sinfning oxirida Adapter suffiksi borligini ko'rsang, bu sinf adapter rolini bajaradi va yuqorida ta'riflangan sxema bo'yicha ishlaydigan sinflar guruhiga aloqador deb hisoblash huquqiga egasan.

Qo'llaniladi: tizim zaruriy malumot va harakatlarni qo'llab-quvvatlasa, lekin noqulay interfeysga ega bo'lsa. Aksariyat hollarda, agar yangi yoki mavjud abstrakt sinfdan meros olingan sinf yaratish kerak bo'lsa, "Adapter" patterni qo'llaniladi.

Afzalliklari:

  • Tashqi sinflarni ishlatishga o'tish tizimning o'zini qayta tuzishni talab qilmaydi, yana bir Adapter sinfi amalga oshirilishi yetarli.
  • Tashqi sinflar (biz kodini o'zgartira olmaydigan kutubxonalar sinflari) amalga oshirilishidan mustaqillik. Programma tashqi sinflar interfeysidan mustaqil bo'ladi.

2.2 Decorator

Decorator — struktural dizayn patterni bo'lib, ob'ektga dinamik tarzda qo'shimcha xatti-harakatlar qo'shish uchun xizmat qiladi. Decorator patterni funksionallikni kengaytirish uchun subklass yaratish amaliyotiga yaxshi va moslashuvchan alternativani taqdim etadi.

Decorator pattern

Foydalaniladi ob'ektga dinamik ravishda qo'shimcha majburiyatlar ulanadigan joyda.

Ko'pchiligingizdan savol kelishi mumkin: qanday qilib dinamik tarzda (programmani ishlash vaqtida) ob'ektga yangi xatti-harakat qo'shish mumkin? Ob'ektni kichik qismlardan, ya'ni kichik ob'ektlardan yig'ish mumkin. Servletlarda filter zanjirlar esingdami? Yoki Stream API-da filter(), map(), list() funktsiyalarini ishlatib so'rov yozganda?


IntStream.of(50, 60, 70, 80, 90).filter(x -> x < 90).map(x -> x + 10).limit(3).forEach(System.out::print);

Decorator patternining afzalliklari:

  • Ob'ektning funksionalligini kengaytirish uchun subklass yaratishga ehtiyoj yo'q.
  • Yangi funksionallikni istalgan joyda: ConcreteComponent ob'ektining asosiy funksionalligidan oldin yoki keyin dinamik tarzda ulash imkoniyati mavjud.

2.3 Proxy

Proxy — struktural dizayn patterni bo'lib, boshqa ob'ektga kirishni boshqaradigan ob'ektni taqdim etadi, barcha chaqiruvlarini ushlab va o'zidan o'tkazish orqali amalga oshiriladi.

Proxy pattern

Proxy patterni asl ob'ekt o'rniga o'rindoshlash ob'ektini taqdim etadi. Bu ob'ekt asl ob'ektga kirishni boshqaradi. Juda tez-tez ishlatiladi.

Mockito framework-ni esingdami va haqiqiy ob'ektga murojaatni Mockito.spy() metodi yoki @Spy annotatsiyasini qo'llash orqali ushlab olganmiz? O'sha paytda maxsus Proxy ob'ekti yaratilgan edi, bu orqali asl ob'ektga barcha chaqiruvlar o'tkazilardi.

Va biz ob'ektga qoidalarni qo'shish orqali bularni boshqarishga muvaffaq bo'ldik. Mana shunday, asl ob'ekt o'zgarmaydi, lekin u bilan ishlash ancha moslashuvchan bo'ladi. Ayniqsa, bizning kodimizdan proxy ob'ektni chaqirmasdan, qayergadir uzatganimizda foydali bo'ladi. Shu bilan mustaqil ikki ob'ektning muloqotini nazorat qilamiz.

Proxy turlari: maqsadiga ko'ra:

  • Protokollovchi proxy: “Sub'ekt” ga barcha chaqiruvlarni ularning parametrlari bilan birga logga yozadi.
  • Uzoq o'zgaruvchi (remote proxies): boshqa manzilli maydonda yoki uzoq mashinada joylashgan “Sub'ekt” bilan aloqa ta'minlaydi. Shuningdek, so'rov va uning argumentlarini kodlash va kodlangan so'rovni haqiqiy “Sub'ekt” ga yuborishni ta'minlaydi.
  • Virtual o'zgaruvchi (virtual proxies): haqiqiy “Sub'ekt”ni faqat kerak bo'lganida yaratishni ta'minlaydi. Shuningdek, haqiqiy “Sub'ekt”ning ba'zi ma'lumotlarini kechiktirish uchun kesh qilishi mumkin.
  • Yozganda nusxa olish: kliet tomonidan bajarilgan ma'lum harakatlar paytida “Sub'ekt”ni ko'chiradi (virtual proxy'ning xususiy holati).
  • Himoyalovchi o'zgaruvchi (protection proxies): chaqiruvchi ob'ekt so'rovni amalga oshirish uchun zarur bo'lgan huquqlarga ega ekanligini tekshirishi mumkin.
  • Kesh qiluvchi proxy: bir nechta klietlarga, ular bu natijalarni bo'lishishi mumkin, natijalarni hisoblab chiqarish natijalarini vaqtincha saqlashni ta'minlaydi.
  • Yopuvchi proxy: “Sub'ekt”ni xavfli klientlardan (yoki aksincha) himoya qiladi.
  • Sinxronizatsiya qiluvchi proxy: asinxron ko'p tarmoqli muhitda “Sub'ekt”ga sinxronlashtirilgan kirishni boshqaradi.
  • “Aqlli” havola (smart reference proxy): "Sub'ekt" ga havola yaratilganda qo'shimcha harakatlarni amalga oshiradi, masalan, “Sub'ekt” ga faol havolalar sonini hisoblaydi.

2.4 Bridge

Bridge pattern — abtsraktsiyalash va implementatsiyani shunday ajratishni ta'minlaydigan struktural dizayn patterni bo'lib, ular mustaqil ravishda o'zgarishi mumkin.

Bridge patterni inkapsulyatsiya, agregatsiya va meros olishdan foydalanishi mumkin, mas'uliyatni sinflar o'rtasida ajratish uchun.

Bridge pattern

Abstraktsiya va implementatsiya ajratilganida, ular mustaqil ravishda o'zgarishi mumkin. Boshqacha qilib aytganda, bridge pattern orqali interfeys tuzilmasini o'zgartirish, implementatsiya tuzilmasini o'zgartirishga halaqit bermaydi.

Shunday abstraktsiya sifatida figuraning qanday ishlashini ko'rib chiqaylik. Turli xil turlardagi figuralar mavjud, har biri o'z xususiyatlari va metodlari bilan. Lekin, barcha figuralarni birlashtiradigan narsa bor. Masalan, har bir figura o'zini chizishni, skala qilishni va h.k. bilishi kerak.

Biroq, grafik chizish operatsiyasi, OS yoki grafik kutubxonaga qarab o'zgarishi mumkin. Figuralar o'zini turli grafika muhiti uchun chiza olishi kerak. Lekin har bir figurada barcha chizish usullarini amalga oshirish yoki har safar chizish usuli o'zgarganda figuralarni o'zgartirishning iloji yo'q.

Bu holatda bridge patterni yordam beradi, turli grafika muhitida chizishni amalga oshiradigan yangi sinflarni yaratishga imkon beradi. Bunday yondashuvdan foydalanilganda, yangi figuralarni yoki ularning chizish usullarini qo'shish oson bo'ladi.

Diagrammalardagi o'q bilan ko'rsatilgan aloqa 2 ma'noga ega: a) “tur turi”, qisqarib Liskov substitutsiyasi printsipi va b) abstraktsiyani amalga oshirishning bir yo'li. Odatda dasturlash tillarida a) va b) amalga oshirish uchun meros olishdan foydalaniladi, bu esa sinf ierarxiyasini kattalashtirishga olib keladi.

Bridge patterni bu muammoni hal qilish uchun xizmat qiladi: ob'ektlar juftlikda yaratiladi, A iyerarxiya sinfidan va B iyerarxiyasidan va A sinfida Liskov bo'yicha “tur turi” ma'nosiga ega va “abstraktsiyani amalga oshirish” tushunchasi “A ob'ekti”dan “B ob'ektiga” havolaga ega.

2.5 Facade

Facade pattern — tizimning murakkabligini berkish uchun barcha mumkin bo'lgan tashqi chaqiruvlarni bitta ob'ektga o'zish orqali bartaraf etadigan struktural dizayn patterni.

Facade pattern

Birlashtirilgan interfeysni turli xil o'zboshimcha implementatsiyalar yoki interfeyslar bilan, masalan, pastki tizim bilan, o'rnatish qanday amalga oshiriladi, agar bu pastki tizim bilan juda mustahkam bog'lanish xohlanmasa yoki pastki tizimning implementatsiyasi o'zgarishi mumkin?

Pastki tizim bilan bog'lanish nuqtasini ta'riflang — pastki tizim bilan umumiy interfeys ta'minlaydigan va uning komponentlari bilan o'zaro aloqani ta'minlaydigan facade ob'ektini aniqlang. Facade — bu pastki tizim xizmatlari uchun yagona kirish nuqtasini ta'minlaydigan tashqi ob'ekt.

Pastki tizimning boshqa komponentlarining implementatsiyasi yopiq va tashqi komponentlarga ko'rinmaydi. Facade ob'ekti, GRASP patternining O'zgarishga Bardoshli uchun implementatsiyani mustahkamlik nuqtai nazaridan ta'minlaydi.

Muvofiq! Bu pattern qo'llaniladi, biz bir guruh ob'ektlarni to'liq yashirishni xohlaganimizda va ular bilan barcha kommunikatsiyani o'zimizning ob'ektimiz orqali o'tkazishni xohlaymiz. Agar siz shunchaki ob'ektlar kommunikatsiyasini nazorat qilishni istasangiz va ularni yashirish shart bo'lmasa, Proxy patternidan foydalanish yaxshiroq bo'ladi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION