JavaRush /Курсхо /All lectures for TG purposes /Паттернҳои сохтивӣ

Паттернҳои сохтивӣ

All lectures for TG purposes
Сатҳи , Дарс
дастрас

2.1 Adapter

Adapter — паттерни сохтивии лоиҳакашӣ, ки барои ташкил кардани истифодаи функсияҳои объекти тағйирнопазири, тавассути интерфейси махсус сохташуда таъин шудааст.

Тафсири расмӣ каме мураккаб ба назар мерасад, вале агар онро бо суханони худ фаҳмонда диҳем, пас адаптер — ин паттерни лоиҳакашӣ мебошад, ки объектҳоро бо интерфейсҳои носозгор якҷоя кор карданро имкон медиҳад.

Adapter pattern

Истифода мешавад барои ташкил кардани истифодаи функсияҳои объекти тағйирнопазир, тавассути интерфейси махсус сохташуда. Класи иловагӣ сохта мешавад, ки интерфейси заруриро дорад, ва ин класс аллакай методҳои объекти заруриро мефиристад (объекте, ки интерфейси заруриро надорад).

Муҳим! Агар дар код ту дар класс суффикси Adapter-ро бинӣ, пас пури ҳаққӣ онро ҳисоб мекунӣ, ки ин класс роли адаптер мебозад ва бо гурӯҳи классҳо алоқаманд аст, ки тибқи схемае, ки дар боло тавсиф шудааст, кор мекунанд.

Истифода мешавад дар ҳолатҳо, ки система маълумот ва рафтори талабшударо дастгирӣ мекунад, лекин интерфейси мувофиқ надорад. Маъмулан, паттерни Адаптер истифода бурда мешавад, агар даркор бошад, ки класс сохта шавад, ки аз класи абстрактии нав ё мавҷуда ирсият гирифтааст.

Тарафҳои қавӣ:

  • Гузариш ба истифодаи дигар классҳои беруна аз навсозии худи системаро талаб намекунад, кофӣ аст, ки як класс Adapter амалисозӣ шавад.
  • Истиқлолият аз татбиқи классҳои беруна (классҳо аз китобхонаҳо, ки коди онҳо тағйиронида намешавад). Барномаи ту аз интерфейси классҳои беруна истиқлол мешавад.

2.2 Decorator

Декоратор (Decorator) — паттерни сохтивии лоиҳакашӣ, ки барои динамикӣ пайваст кардани рафтори иловагӣ ба объект таъин шудааст. Паттерни Декоратор алтернативаи хуб ва чандир ба таҷрибаи эҷоди зергурӯҳҳои нав барои васеъ кардани функсионалӣ пешниҳод мекунад.

Декоратор (Decorator) pattern

Истифода мешавад барои динамикӣ пайвастан ба объект уҳдадориҳои иловагӣ.

Бисёре аз шумо хоҳед пурсид: чӣ гуна мумкин аст, ки динамикӣ (дар вақти кор кардани барнома) ба объект рафтори нав илова кард? Объектро метавон аз қисмҳо, ки ин бачаки объектҳо аст, ҷамъ овард. Чӣ қадар занҷири филтрҳоро дар сервлетҳо ё Stream API дар ёд доред, вақте ки шумо бо filter(), map(), list() навиштед?


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

Тарафҳои қавӣ паттерни Decorator:

  • На даркор аст, ки зергурӯҳҳои нави барои васеъ кардани функсионалии объект эҷод шавад.
  • Имконият барои динамикӣ пайвастани функсионалии нав дар ҳар ҷой: пеш ё баъд аз функсионалии асосии объект ConcreteComponent.

2.3 Proxy

Заместитель (Proxy) — паттерни сохтивии лоиҳакашӣ, ки объектиеро пешниҳод мекунад, ки ба объекти дигар дастрасиро назорат мекунад, ҳамаи зангҳоро мегирад ва тавассути худ мегузаронад.

Заместитель (Proxy)

Паттерн Proxy объекти-ивазкунанда пешниҳод мекунад ба ҷои объекти воқеӣ. Ин объект дастрасиро ба объекти аслӣ назорат мекунад. Бисёр маъмул истифода мешавад.

Ба ёд доред, чӣ гуна фреймворки Mockito-ро истифода бурдем ва бо истифодаи метода Mockito.spy() ё аннотатсияи @Spy муроҷиат ба объекти воқеиро гирифтем? Маҳз он замон Proxy-объекти махсус офарида мешуд, ки ҳамаи зангҳое, ки ба объекти аслӣ мерафтанд, тавассути он мегузаштанд.

Ва мо он вақт бо илова кардани қоидаҳо ба объекти худ метавонистем ин зангҳоро идора кунем. Маҳз ҳамин тавр — объекти аслӣ тағйир намеёбад, ва кор бо он худро чандиртар мекунад. Хусусан муфид аст, вақте ки proxy-объекти худро намеовардем, балки онро ба ҷое медодем. Бо ин роҳ муоширати ду объекти мустақили худро назорат мекунем.

Намудҳои прокси аз рӯи таъинот:

  • Проксии протоколӣ: ҳамаи даъватҳои “Ифода” бо параметрҳояшон дар лог захира мекунад.
  • Ивази дурдаст (remote proxies): робитаро бо “Ифода”, ки дар фазои адреси дигар ё дар мошини дурдаст ҷойгир аст, таъмин мекунад. Ҳамчунин метавонад барои кодкунонии дархост ва аргументҳои он ва фиристодани дархост ба “Ифода”-и воқеӣ ҷавобгар бошад.
  • Ивази виртуалӣ (virtual proxies): эҷоди “Ифода”-и воқеиро танҳо вақте ки он воқеан лозим мешавад, таъмин мекунад. Ҳамчунин метавонад қисме аз маълумоти “Ифода”-и воқеиро кэш кунад, то эҷоди онро дер кунад.
  • Нусха-бари-навишт: нусхаи “ифода”-ро бо амалҳои муайяни мизоҷ таъмин мекунад (ҳолати хусусии “проксии виртуалӣ”).
  • Ивази муҳофизатӣ (protection proxies): мумкин аст санҷад, ки объекти даъваткунанда барои иҷрои дархост ҳуқуқи лозимиро дорад.
  • Проксии кешир: таъмин кардани нигаҳдории муваққатии натиҷаҳои ҳисоб то ба мизоҷони бисёр, ки метавонанд ин натиҷаҳоро тақсим кунанд.
  • Проксии муҳофизатӣ: “Ифодаро” аз мизоҷони хатарнок муҳофизат мекунад (ё баръакс).
  • Проксии ҳамоҳангкунанда: назорати дастрасии ҳамоҳангшуда ба “Ифода” дар муҳити асинхрони бисёррӯяшавӣ таъмин мекунад.
  • “Силсилаи оқилона” (smart reference proxy): амалҳои иловагиро анҷом медиҳад, вақте ки ба “Ифода” ишора эҷод мешавад, масалан, шумораи ишораҳои фаъол ба “Ифода”-ро ҳисоб мекунад.

2.4 Bridge

Шаблони Мост (Bridge) — паттерни сохтивии лоиҳакашӣ, ки барои “ҷудо кардани абстраксия ва татбиқ, ба тавре ки онҳо мустақилона тағйир ёбанд” истифода мешавад.

Шаблони мост инкапсуляция, агрегатсияро истифода мебарад ва метавонад ирсиятро истифода кунад, то ки масъулиятро байни классҳо тақсим кунад.

Мост (Bridge)

Вақте ки абстраксия ва татбиқ ҷудо мешаванд, онҳо метавонанд мустақилона тағйир ёбанд. Баръакс, вақте ки татбиқ тавассути мост иҷро мешавад, тағйири сохтори интерфейс ба тағйири сохтори татбиқ намеандозад.

Мисоли чунин абстраксия ҳамчун фигура гиред. Бисёр намудҳои фигураҳо мавҷуданд, ҳар яке бо хосиятҳо ва методҳои хоси худ. Аммо чизе ҳаст, ки ҳамаи фигураҳоро муттаҳид мекунад. Масалан, ҳар як фигура бояд тавонад худро кашад, андозаи худро тағйир диҳад ва ғайра.

Дар айни замон расми тасвирӣ вобаста ба навъи ОС ё китобхонаи графикӣ фарқ карда метавонад. Фигураҳо бояд тавонанд худро дар муҳитҳои гуногуни графикӣ кашанд. Аммо ба ҳар як фигура ҳамаи усулҳои кашиданро татбиқ кардан ё ҳар бор тағйири усули кашиданро тағйир додан ғайриамалӣ аст.

Дар ин ҳолат шаблони мост кӯмак мекунад, ки анҷумани классҳои навро имкон медиҳад, ки расмро дар муҳитҳои гуногуни графикӣ татбиқ кунанд. Бо истифодаи чунин усул, ҳам фигураҳои нави зиёд ва ҳам усулҳои нав барои кашидани онҳо илова кардан осон аст.

Пайванд, ки бо тир дар диаграммаҳо намоиш дода шудааст, метавонад 2 маъно дошта бошад: а) “навъи”, мувофиқи принсипи ивазкунии Лисков ва б) яке аз татбиқҳои абстраксия. Одатан дар забонҳо ирсият барои татбиқ кардани ҳам а) ва ҳам б) истифода мешавад, ки ба номуайянии иерархияи классҳо мебарад.

Мост барои ҳалли ин мушкилот истифода мешавад: объектҳо ҷуфтҳо офарида мешаванд аз объекти класи иерархияи А ва иерархияи B, ирсият дар иерархияи А маънои “навъи” дар Лисков дорад, ва барои яке аз татбиқҳои абстраксия бо ишораи аз объекти A ба объекти B истифода мешавад.

2.5 Facade

Шаблони Фасад (Facade) — паттерни сохтивии лоиҳакашӣ, ки мураккабии системаро пинҳон мекунад тавассути коҳиш додани ҳамаи даъватҳои беруна ба як объект, ки онҳоро ба объектҳои мувофиқи системаи интиқол медиҳад.

Шаблони Фасад (Facade)

Чӣ тавр як интерфейси ягонаи бо маҷмӯи амалисозӣ ё интерфейсҳои пароканда таъмин кардан метавонад, масалан, бо як иловасистема, агар пайвастагии зич бо ин иловасистема нохушоянд бошад ё амалисозии иловасистема тағйир ёбад?

Як нуқтаи пайвастшавӣ бо иловасистема, яъне объекти фасад, ки интерфейси асосӣ бо иловасистема таъмин мекунад, таъин кунед ва вазифаи мушорикати онро бо компонентҳои он ба ӯҳда диҳед. Фасад — ин объекти беруна, ки нуқтаи ягонаи воридшавӣ барои хидматҳои иловасистемаро таъмин мекунад.

Амалисозии дигар компонентҳои иловасистема пӯшида аст ва ба компонентҳои беруна намоён нест. Объекти фасад амалисозии GRASP паттерни Устувори ба тағйиротро аз нуқтаи назари ҳифозат аз бозсозиҳои амалисозии иловасистемаро таъмин мекунад.

Муҳим! Ин шаблон истифода мешавад, вақте ки мо мехоҳем як гурӯҳи объектҳоро комилан пинҳон кунем ва тамоми иртиботро бо онҳо тавассути объекти худ гузаронем. Агар шумо танҳо мехоҳед назорати муайяни иртиботи объектҳоро таъмин кунед ва онҳоро пинҳон кардан зарур нест, беҳтараш бо паттерни Proxy истифода шавад.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION