Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПП_методичка(1).doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
440.32 Кб
Скачать

2.2.2 Шаблон проектування Декоратор (Decorator)

Призначення. Покласти додаткові обов'язки (прозорі для клієнтів) на окремий об'єкт, а не на клас в цілому. Вирішення цієї задачі досягається шляхом динамічного додавання об'єкту нових обов'язків не вдаючись при цьому до породження підкласів (наслідування).

Структура шаблона наведена на рис. 2.2. На ньому Component визначає інтерфейс для об'єктів, на які можуть бути динамічно покладені додаткові обов'язки, ConcreteComponent визначає об'єкт, на який покладаються додаткові обов'язки, Decorator – зберігає посилання на об'єкт Component і визначає інтерфейс, відповідний інтерфейсу Component. ConcreteDecorator покладає додаткові обов'язки на компонент. Decorator переадресує запити об'єкту Component. Застосування декількох Decorator до одного Component дозволяє довільним чином поєднувати обов'язки, наприклад, одну властивість можна додати двічі.

Функціональність, що додається, реалізується в невеликих об'єктах. Перевага полягає в можливості динамічно додавати цю функціональність до або після основної функціональності об'єкта ConcreteComponent. Однак ланцюжок створюваних об'єктів завжди повинен закінчуватися об'єктом класу ConcreteComponent.

Рис.2.2. Структура шаблону Decorator

Більша гнучкість, ніж у статичного наслідування: можна додавати і видаляти обов'язки під час виконання програми в той час як при використанні наслідування треба було б створювати новий клас для кожного додаткового обов'язку. Даний шаблон дозволяє уникнути перевантажених методами класів на верхніх рівнях ієрархії - нові обов'язки можна додавати по мірі необхідності.

Decorator і його Component не ідентичні, і, крім того, виходить, що система складається з великої кількості дрібних об'єктів, які схожі один на одного і розрізняються тільки способом взаємозв'язку, а не класом і не значеннями своїх внутрішніх змінних - така система складна в вивченні та налагодженні.

2.2.3 Шаблон проектування Замісник (Proxy)

Призначення. Предоставити обєкт, що контролює доступ до іншого обєкту, перехоплюючи всі виклики (виконує функцію контейнеру). Тобто необхідно створити сурогат громіздкого об'єкту.

Застосування. Використовується коли Необхідно управляти доступом до об'єкта для таких цілей:

  • створювати громіздкі об'єкти "на вимогу" (Virtual Proxy);

  • кешувати дані (SmartLink Proxy);

  • динамічно обмежувати доступ (Security Proxy):

  • забезпечувати доступ до об'єкта в іншому адресному просторі (Remote Proxy).

Структура шаблона наведена на рис. 2.3, де Proxy зберігає посилання, яке дозволяє заступникові звернутися до реального суб'єкту. Proxy контролює доступ до RealSubject, відповідаючи за створення або видалення об'єкту RealSubject. Subject визначає загальний для RealSubject і Proxy інтерфейс, так, що Proxy може бути використаний скрізь, де очікується RealSubject. При необхідності запити можуть бути переадресовані Proxy до RealSubject.

Рис.2.3. Структура шаблону Proxy

Зазначимо, що адаптер – забезпечує відмінний інтерфейс до обєкту, проксі – той самий інтерфейс, а декоратор – розширений.

2.2.4 Шаблон проектування Компонувальник (Composite)

Призначення. Об'єднуе об'єкти в ієрархічну деревовидну структуру, і дозволяе уніфіковане звертання для кожного елемента дерева. Дозволяє користувачам будувати складні структури з простіших компонентів. Проектувальник може згрупувати дрібні компоненти для формування більших, які, в свою чергу, можуть стати основою для створення ще більших.

Структура шаблона наведена на рис. 2.4, де

  • Component (Component) – компонент

    • оголошує інтерфейс для компонуемих об'єктів;

    • надає відповідну реалізацію операцій за замовчуванням, загальну для всіх класів;

    • оголошує єдиний інтерфейс для доступу до нащадків та управління ними;

    • визначає інтерфейс для доступу до батька компонента в рекурсивної структурі і при необхідності реалізує його (можливість необов'язкова);

  • Leaf (Leaf_1, Leaf_2) – лист.

    • об'єкт того ж типу що і Composite, але без реалізації контейнерних функцій;

    • представляє листові вузли композиції і не має нащадків;

    • визначає поведінку примітивних об'єктів в композиції;

    • входить до складу контейнерних об'єктів;

  • Composite (Composite) – складений об'єкт.

    • визначає поведінку контейнерних об'єктів, у яких є нащадки;

    • зберігає ієрархію компонентів-нащадків;

    • реалізує пов'язані з управління нащадками (контейнерні) операції в інтерфейсі класу Component.

Ключем до шаблону компонувальник є абстрактний клас, який є одночасно і примітивом, і контейнером (Component). У ньому оголошені методи, специфічні для кожного виду об'єкта (такі як Operation) і загальні для всіх складових об'єктів, наприклад операції для доступу і управління нащадками. Підкласи Leaf визначають примітивні об'єкти, які не є контейнерами. У них операція Operation реалізована відповідно до їх специфічних потреб. Оскільки у примітивних об'єктів немає нащадків, то жоден з цих підкласів не реалізує операції, пов'язані з управління нащадками (Add, Remove, GetChild). Клас Composite складається з інших примітивніших об'єктів Component. Реалізована в ньому операція Operation викликає однойменну функцію відтворення для кожного нащадка, а операції для роботи з нащадками вже не порожні. Оскільки інтерфейс класу Composite відповідає інтерфейсу Component, то до складу об'єкта Composite можуть входити і інші такі ж об'єкти.

Рис.2.4. Структура шаблону Composite