|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Відносини учасників паттерна1. Клієнт звертається з запитом до адаптера, викликаючи його метод через цільовий інтерфейс. 2. Адаптер перетворює запит в один або декілька від викликів до об’єкта, що адаптується (в інтерфейсі останнього). 3. Клієнт одержує результати виклику, навіть не підозрюючи про перетворення, виконані адаптером. Результати використання. Результати застосування адаптерів об’єктів і класів різні. Адаптер класу: 1. Адаптує Adaptee до Target, передоручаючи дії конкретного класу Adaptee, тобто розрахований на один клас, що адаптується. Тому даний паттерн не буде працювати, якщо необхідно одночасно адаптувати клас і його підкласи. 2. Дозволяє Adapter замістити деякі операції класу, що адаптується Adaptee, оскльіки Adapter є не що інше, як підклас Adaptee. 3. Вводить тільки один новий об’єкт (екземпляр). Щоб дістатися до класу, який адаптується, не потрібно ніякого додаткового звернення за покажчиком і екземпляра класу, що адаптується також не потрібно. Адаптер об’єктів: 1. Дозволяє одному адаптеру Adapter працювати з багатьма об’єктами, що адаптуються Adaptee, тобто з самим Adaptee і його підкласами (якщо такі є). Адаптер може додати нову функціональність відразу всім адаптованим об’єктам, тому що використовує композицію. 2. Забезпечує гнучкість, тому делегує виклики об’єкту, що адаптується. 3. Ускладнює заміщення операцій класу Adaptee. Для цього потрібно породити від Adaptee підклас і змусити Adapter посилатися на цей підклас, а не на сам Adaptee. Загальний позитивний результат використання паттерна проектування Adapter полягає в тому, що є можливість гнучко привести інтерфейс деякого класу до інтерфейсу, очікуваному додатком без зміни структури самого класу. Це необхідно, як з погляду усунення надмірності структури типів, так і з погляду модульності створюваних додатків. Надмірність відіграє негативну роль тоді, коли необхідно повторно використовувати написаний код (наприклад, в іншому додатку). Такий код називається reusable -кодом. Створення reusable -коду вважається гарною практикою, оскільки зменшується вартість і збільшується швидкість розробки. А так само збільшується гнучкість і масштабованість створюваних додатків за рахунок модульної структури готового додатка. Розширювати додаток шляхом додавання нових типів значно простіше, ніж цілком заново створювати деякі модулі.
Компонувальник (Composite) Призначення паттерна. Компонувальник – це структурний паттерн, який поєднує об’єкти в деревовидні структури для подання ієрархій частина-ціле. Дозволяє клієнтам одноманітно трактувати індивідуальні та складові об’єкти [26]. Частота використання Мотивація застосування. Паттерн Компонувальник існує тому, що структура типу «дерево» є досить розповсюдженою і часто використовується для організації даних, які мають регулярну структуру. Тобто таку структуру, що реалізує ієрархічну залежність частина-ціле, яка передбачає, що елементом деякої композиції даних може бути не тільки елементарний елемент, але і така ж композиція. Найпростіша реалізація подібної структури з рекурсивною системою вкладеності може бути виражена у вигляді деякої системи типів, що містить класи, які описують елементарні компоненти, і класи, що будуть використовуватися як контейнери для елементарних компонентів. Але подібний підхід має серйозний недолік, що складається в тому, що код, який використовує зазначені класи, повинний окремо обробляти елементи і їхні контейнери, навіть якщо в більшості випадків вони обробляються однаково. Це різко ускладнює реалізацію додатка. Паттерн компоновщик пропонує рекурсивну структуру, при якій не прийдеться приймати рішення про те, як обробляти окремі елементи загальної сукупності даних. Такі додатки, як графічні редактори і редактори електричних схем, дозволяють користувачам будувати складні діаграми з більш простих компонентів. Проектувальник може згрупувати дрібні компоненти для формування більш крупних, які, в свою чергу, можуть стати основою для створення ще більших. У простій реалізації допустимо було б визначити класи графічних примітивів, наприклад тексту та ліній, а також класів, які виступають у ролі контейнерів для цих примітивів. Але у такого рішення є істотний недолік. Програма, в якій ці класи використовуються, повинна по-різному поводитися з примітивами і контейнерами, хоча користувач найчастіше працює з ними одноманітно. Необхідність розрізняти ці об’єкти ускладнює додаток. Паттерн Компонувальник описує, як можна застосувати рекурсивну композицію таким чином, що клієнту не доведеться проводити відмінність між простими та складеними об’єктами. Ключем до паттерну Компонувальник є абстрактний клас, який є одночасно і примітивом, і контейнером. Таким чином, оскільки контейнери й елементарні компоненти знаходяться у відношенні споріднення і мають загальний користувальницький інтерфейс, то контейнер може бути елементом іншого такого ж контейнера, що створює зручну регулярну (рекурсивну) структуру. Паттерн Компонувальник використовується, коли: - потрібно представити ієрархію об’єктів вигляду частина-ціле; - необхідно, щоб клієнти одноманітно трактували складові та індивідуальні об’єкти. Проблемна предметна область. Наприклад перед розробниками постає завдання створити ІС, що підтримує роботу кафе. Кафе містить набір страв, які поєднанні у різного вигляду меню. Перед розробником стає питання яким чином найефективніше представити структуру даних, яка б відповідала структурі меню кафе та забезпечувала би його безболісну та швидку модифікацію (рис. 5.18) [10]. Паттерн Компонувальник дає можливість створити деревоподібну структуру, що може працювати з вкладеними групами меню й елементами меню. Розміщаючи меню й елементи в одній структурі, можна створюємо ієрархію «частина/ціле». Інакше кажучи, дерево об’єктів, що складається з окремих частин (меню й елементи меню), але при цьому може розглядатися як єдине ціле (одне велике «суперменю») Побудувавши «суперменю», можна використовувати паттерн Компонувальник для того, щоб в подальшому можна було б забезпечити можливість виконувати однорідні операції з окремими об’єктами і їх комбінаціями. Що це означає? Якщо є деревоподібна структура з меню, підменю з елементами, кожне меню є комбінацію, тому що воно може містити інші меню і команди меню. Окремими об’єктами є тільки елементи меню – вони не можуть містити інших об’єктів. Застосування в архітектурі паттерна Компонувальник дозволить написати простий код, що застосовує ту саму операцію (наприклад, друк) до всієї структури меню.
Рис. 5.18. Структура схема описаної предметної області
Як же застосувати паттерн Компонувальник при проектуванні системи меню? Для початку необхідно визначити інтерфейс компонента; цей інтерфейс, загальний для меню й елементів меню, дозволяє виконувати з ними однорідні операції. Система меню укладається в структуру паттерна Компонувальник наступним чином (рис. 5.19). Іншими словами, той самий метод викликається як для меню, так і для їхніх елементів. Паттерн Компонувальник дозволяє створювати деревоподібні структури, вузлами яких є як комбінації, так і окремі об’єкти. У такій структурі ті самі операції можуть застосовуватися і до комбінацій, і до окремих об’єктів. Інакше кажучи, у багатьох випадках розходження між комбінаціями й окремими об’єктами ігноруються. Рис. 5.19. Діаграма класів предметної області в термінах паттерна Компонувальник Загальна структура паттерна представлена у вигляді діаграми класів на рисунку 5.20.
Рис. 5.20. Діаграма класів паттерна Компонувальник Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |