Page 57 - 4190
P. 57
ступним користувачеві, тому наслідування має бути закритим.
Цілі, які переслідують використовуючи відкрите і закрите наслі-
дування, різні. Якщо відкрите наслідування застосовують для наслі-
дування інтерфейсу і реалізації, то закрите наслідування – тільки для
наслідування реалізації.
Переваги патерну Adapter полягають у тому, що він дозволяє по-
вторно використати вже наявний код, адаптуючи його несумісний ін-
терфейс до виду, придатного для використання.
Недоліки патерну Adapter полягають у тому, що завдання пере-
творення інтерфейсів може виявитися непростим у випадку, якщо
клієнтські виклики і (або) параметри, що передаються, не мають фун-
кціональної відповідності в об'єкті, що адаптується.
Патерн Decorator
Існують випадки коли необхідно додати нові обов'язки в поведін-
ці або стані окремих об'єктів під час виконання програми. Викорис-
тання наслідування не є можливим, оскільки це рішення статичне і
поширюється на увесь клас. У цьому випадку доцільним є викорис-
тання патеру Decorator.
1. Патерн Decorator динамічно додає нові обов'язки об'єкту. Деко-
ратори є гнучкою альтернативою породження підкласів для розши-
рення функціональності.
2. Рекурсивно декорує основний об'єкт.
3. Патерн Decorator використовує схему "обгорнули подарунок,
кладемо його в коробку, обгорнули коробку".
Припустимо, ви працюєте над бібліотекою для побудови графіч-
них інтерфейсів, призначених для користувача і хочете мати можли-
вість додавати у вікно рамку і смугу прокрутки. Тоді ми могли б ви-
значити ієрархію спадкоємства таким чином (рис. 6.2).
Ця схема має істотний недолік, оскільки кількість класів сильно
розростається.
Патерн Decorator дає клієнтові можливість задавати будь-які
комбінації бажаних "особливостей".
Гнучкість може бути досягнута наступним дизайном (рис 6.3).
Іншим прикладом з’єднання є каскадне з'єднання властивостей (у
ланцюжок) для надання об'єкту потрібних характеристик.
Вирішення даного класу завдань припускає інкапсуляцію почат-
кового об'єкту в абстрактний інтерфейс. Як об'єкти-декоратори, так і
основний об'єкт наслідують від цього абстрактного інтерфейсу. Ін-
терфейс використовує рекурсивну композицію для додавання до ос-
57