Композициялық өрнек - Composite pattern

Жылы бағдарламалық жасақтама, композициялық өрнек бөлу болып табылады дизайн үлгісі. Композициялық өрнек бір типтегі объектінің бір данасы сияқты қарастырылатын объектілер тобын сипаттайды. Композиттің мақсаты - біртұтас иерархияларды бейнелеу үшін ағаш құрылымдарына объектілерді «құрастыру». Композициялық үлгіні енгізу клиенттерге жеке заттар мен композицияларға біркелкі қарауға мүмкіндік береді.[1]

Шолу

Композит[2]дизайн үлгісі - белгілі жиырма үштің бірі GoF дизайнының үлгілері икемді және қайта қолданылатын объектілі-бағдарланған бағдарламалық жасақтаманы жобалау үшін қайталанатын жобалық мәселелерді қалай шешуге болатындығын сипаттайтын, яғни іске асыруға, өзгертуге, тексеруге және қайта қолдануға оңай объектілер.

Композиттік дизайн үлгісі қандай мәселелерді шеше алады?[3]

  • Тұтас иерархияны клиенттер бөлік пен тұтас нысандарға біркелкі қарайтындай етіп ұсыну керек.
  • Бүкіл иерархия ағаш құрылымы ретінде ұсынылуы керек.

Анықтау кезінде (1) Бөлім объектілер және (2) Тұтас контейнер рөлін атқаратын заттар Бөлім объектілер, клиенттер оларды бөлек қарастыруы керек, бұл клиент кодын қиындатады.

Композиттік дизайн үлгісі қандай шешімді сипаттайды?

  • Бірыңғай анықтаңыз Компонент екі бөлікке арналған интерфейс (Жапырақ) заттар мен тұтас (Композиттік) объектілер.
  • Жеке Жапырақ нысандар жүзеге асырады Компонент тікелей интерфейс, және Композиттік сұраныстарды өздерінің балалар компоненттеріне бағыттайды.

Бұл клиенттерге арқылы жұмыс істеуге мүмкіндік береді Компонент өңдеуге арналған интерфейс Жапырақ және Композиттік нысандар біркелкі:Жапырақ нысандар сұранысты тікелей орындайды және Композиттік объектілер сұранысты өздерінің компоненттеріне рекурсивті түрде ағаш құрылымына қарай бағыттайды, бұл клиент сыныптарын жүзеге асыруды, өзгертуді, тексеруді және қайта қолдануды жеңілдетеді.

Төменде UML сыныбы мен нысан диаграммасын қараңыз.

Мотивация

Ағаш құрылымды деректермен жұмыс жасағанда, бағдарламашылар көбінесе жапырақ түйіні мен бұтақты айыруға мәжбүр болады. Бұл кодты күрделендіреді, демек, қатеге көп ұрынады. Шешім - бұл күрделі және қарабайыр нысандарды біркелкі емдеуге мүмкіндік беретін интерфейс. Жылы объектіге бағытталған бағдарламалау, композит - бұл бір немесе бірнеше ұқсас объектілердің құрамы ретінде жасалған, барлығы ұқсас функционалдылықты көрсететін объект. Бұл белгілі «бар «объектілер арасындағы қатынас.[4] Негізгі ұғым - сіз объектінің бір данасын, олардың тобын басқарған сияқты басқара аласыз. Композициялық нысандардың барлығында орындай алатын операцияларда а ең кіші ортақ бөлгіш қарым-қатынас. Мысалы, егер экранда топтастырылған фигураларды бейнелейтін жүйені анықтаса, онда фигуралар тобының өлшемін бір фигураның өлшемімен бірдей әсерге ие болу үшін (белгілі бір мағынада) анықтау пайдалы болады.

Қашан пайдалану керек

Композитті клиенттер объектілердің композициясы мен жекелеген объектілер арасындағы айырмашылықты ескермеген кезде қолдану керек.[1] Егер бағдарламашылар бірнеше нысандарды бірдей қолданып жүргенін анықтаса және олардың әрқайсысымен жұмыс істеу үшін бірдей кодтары бар болса, онда композиттік таңдау дұрыс болады; бұл жағдайда примитивтер мен композиттерді біртектес деп қарау онша күрделі емес.

Құрылым

UML класы және объект диаграммасы

Композициялық дизайн үлгісі үшін UML сыныбы мен нысан диаграммасы. [5]

Жоғарыда UML сынып диаграммасы, Клиент сынып сілтеме жасамайды Жапырақ және Композиттік тікелей (бөлек) .Оның орнына Клиент жалпыға сілтеме жасайды Компонент интерфейс және емдей алады Жапырақ және Композиттік біркелкі.
The Жапырақ сыныпта балалар жоқ және оларды жүзеге асырады Компонент тікелей интерфейс.
The Композиттік сынып баланың контейнерін ұстайдыКомпонент нысандар (балалар) және бұған сұрау салады балалар (балалардағы әр балаға: бала.операция ()).

Нысанның ынтымақтастық диаграммасы жұмыс уақытының өзара әрекеттесуін көрсетеді: Бұл мысалда Клиент нысан жоғарғы деңгейге сұраныс жібереді Композиттік объект (тип КомпонентСұраным барлық балаға жіберіледі (орындалады) Компонент нысандар (Жапырақ және Композиттік нысандар) ағаш құрылымынан төмен қарай.

Балаға байланысты операцияларды анықтау
Композициялық дизайн үлгісінде балаға байланысты операцияларды анықтау. [6]

Контейнерге / қосымшадан бала компонентін қосу / алып тастау сияқты балаларға байланысты операцияларды анықтауға және жүзеге асыруға арналған екі дизайн нұсқасы бар (қосу (бала) / алып тастау (бала)) және баланың компонентіне қол жеткізу (getChild ()):

  • Біртектілікке арналған дизайн: Баламен байланысты операциялар Компонент интерфейс. Бұл клиенттерге емделуге мүмкіндік береді Жапырақ және Композиттік нысандар біркелкі. Бірақ қауіпсіздік түрі жоғалады, себебі клиенттер балаға байланысты операцияларды орындай алады Жапырақ нысандар.
  • Қауіпсіздік типіне арналған дизайн: Баламен байланысты операциялар тек Композиттік сынып. Клиенттер емделуі керек Жапырақ және Композиттік нысандар басқаша. Бірақ типтік қауіпсіздік клиенттердің қолынан келетіндіктен пайда болады емес бойынша балаға байланысты операцияларды орындау Жапырақ нысандар.

Композиттік дизайн үлгісі баса назар аударады біртектілік аяқталды қауіпсіздік түрі.

UML сынып диаграммасы

Композиттік өрнек UML.
Компонент
  • бұл барлық компоненттер үшін, соның ішінде құрамдас бөліктер үшін абстракция
  • құрамындағы объектілерге арналған интерфейсті жариялайды
  • (міндетті емес) рекурсивті құрылымдағы компоненттің ата-анасына қол жетімділікке арналған интерфейсті анықтайды және егер қажет болса, оны жүзеге асырады
Жапырақ
  • композициядағы жапырақ нысандарын бейнелейді
  • барлық компоненттер әдістерін жүзеге асырады
Композиттік
  • құрамдас компонентті білдіреді (балалары бар компонент)
  • балаларды манипуляциялау әдістерін жүзеге асырады
  • барлық компоненттер әдістерін, әдетте оларды өз балаларына беру арқылы жүзеге асырады
Композиттік өрнек LePUS3.

Вариация

Бұл туралы сипатталғандай Дизайн үлгілері, үлгі сонымен қатар композиттік ішкі сыныпқа ғана емес, негізгі компонент интерфейсіне балалармен манипуляция әдістерін қосуды қамтиды. Соңғы сипаттамаларда кейде осы әдістер қолданылмайды.[7]

Мысал

Жазылған келесі мысал Java, эллипс немесе бірнеше графиканың композициясы болуы мүмкін графикалық класты жүзеге асырады. Кез-келген графиканы басып шығаруға болады. Жылы Бэкус-Наур формасы,

       Графикалық :: = эллипс | GraphicList GraphicList :: = бос | Graphic GraphicList

Оны бірнеше басқа фигураларды (тіктөртбұрыш және т.б.) және әдістерді (аудару және т.б.).

Java

импорт java.util.ArrayList;/ ** «Компонент» * /интерфейс Графикалық {    // Графиканы басып шығарады.    қоғамдық жарамсыз басып шығару();}/ ** «Композит» * /сынып CompositeGraphic құрал-саймандар Графикалық {    // Балалар графикасының жинағы.    жеке ақтық ArrayList<Графикалық> бала Графика = жаңа ArrayList<>();    // Композицияға графиканы қосады.    қоғамдық жарамсыз қосу(Графикалық графикалық) {        бала Графика.қосу(графикалық);    }        // Графиканы басып шығарады.    @Override    қоғамдық жарамсыз басып шығару() {        үшін (Графикалық графикалық : бала Графика) {            графикалық.басып шығару();  //Делегация        }    }}/ ** «Жапырақ» * /сынып Эллипс құрал-саймандар Графикалық {    // Графиканы басып шығарады.    @Override    қоғамдық жарамсыз басып шығару() {        Жүйе.шығу.println(«Эллипс»);    }}/ ** Клиент * /сынып CompositeDemo {    қоғамдық статикалық жарамсыз негізгі(Жол[] доға) {        // Төрт эллипсті инициализациялау        Эллипс эллипс1 = жаңа Эллипс();        Эллипс эллипс2 = жаңа Эллипс();        Эллипс эллипс3 = жаңа Эллипс();        Эллипс 4. эллипс = жаңа Эллипс();        // Эллипстерден тұратын екі композит жасайды        CompositeGraphic графикалық2 = жаңа CompositeGraphic();        графикалық2.қосу(эллипс1);        графикалық2.қосу(эллипс2);        графикалық2.қосу(эллипс3);                CompositeGraphic графикалық3 = жаңа CompositeGraphic();        графикалық3.қосу(4. эллипс);                // Екі графикадан тұратын басқа графика жасаңыз        CompositeGraphic графикалық1 = жаңа CompositeGraphic();        графикалық1.қосу(графикалық2);        графикалық1.қосу(графикалық3);        // Толық сызбаны басып шығарады («Эллипс» жолынан төрт есе көп).        графикалық1.басып шығару();    }}

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ а б Гамма, Эрих; Ричард Хелм; Ральф Джонсон; Джон М.Влиссидес (1995). Дизайн үлгілері: объектіге бағытталған бағдарламалық жасақтаманың қайта пайдаланылатын элементтері. Аддисон-Уэсли. бет.395. ISBN  0-201-63361-2.
  2. ^ Эрих Гамма, Ричард Хельм, Ральф Джонсон, Джон Влиссидес (1994). Дизайн үлгілері: объектіге бағытталған бағдарламалық жасақтаманың қайта пайдаланылатын элементтері. Аддисон Уэсли. бет.163фф. ISBN  0-201-63361-2.CS1 maint: бірнеше есімдер: авторлар тізімі (сілтеме)
  3. ^ «Композициялық дизайн үлгісі - проблема, шешім және қолдану мүмкіндігі». w3sDesign.com. Алынған 2017-08-12.
  4. ^ Скотт Уолтерс (2004). Perl Design Patterns кітабы. Архивтелген түпнұсқа 2016-03-08. Алынған 2010-01-18.
  5. ^ «Композициялық дизайн үлгісі - құрылым және ынтымақтастық». w3sDesign.com. Алынған 2017-08-12.
  6. ^ «Композициялық дизайн үлгісі - іске асыру». w3sDesign.com. Алынған 2017-08-12.
  7. ^ Джери, Дэвид (13 қыркүйек 2002). «Композициялық дизайн үлгісіне көзқарас». Java дизайнының үлгілері. JavaWorld. Алынған 2020-07-20.

Сыртқы сілтемелер