Page 57 - 4190
P. 57

ступним користувачеві, тому наслідування має бути закритим.
                  Цілі, які переслідують використовуючи відкрите і закрите наслі-
            дування, різні. Якщо відкрите наслідування застосовують для наслі-
            дування інтерфейсу і реалізації, то закрите наслідування – тільки для

            наслідування реалізації.
                  Переваги патерну Adapter полягають у тому, що він дозволяє по-
            вторно використати вже наявний код, адаптуючи його несумісний ін-

            терфейс до виду, придатного для використання.
                  Недоліки патерну Adapter полягають у тому, що завдання пере-
            творення  інтерфейсів  може  виявитися  непростим  у  випадку,  якщо
            клієнтські виклики і (або) параметри, що передаються, не мають фун-

            кціональної відповідності в об'єкті, що адаптується.
                  Патерн Decorator
                  Існують випадки коли необхідно додати нові обов'язки в поведін-

            ці або стані окремих об'єктів під час виконання програми. Викорис-
            тання наслідування не  є  можливим,  оскільки  це  рішення статичне  і
            поширюється на увесь клас. У цьому випадку доцільним є викорис-

            тання патеру Decorator.
                  1. Патерн Decorator динамічно додає нові обов'язки об'єкту. Деко-
            ратори  є  гнучкою  альтернативою  породження  підкласів  для  розши-

            рення функціональності.
                  2. Рекурсивно декорує основний об'єкт.
                  3. Патерн  Decorator  використовує  схему  "обгорнули  подарунок,
            кладемо його в коробку, обгорнули коробку".

                  Припустимо, ви працюєте над бібліотекою для побудови графіч-
            них інтерфейсів, призначених для користувача і хочете мати можли-
            вість додавати у вікно рамку і смугу прокрутки. Тоді ми могли б ви-

            значити ієрархію спадкоємства таким чином (рис. 6.2).
                  Ця схема має істотний недолік, оскільки кількість класів сильно
            розростається.
                  Патерн  Decorator  дає  клієнтові  можливість  задавати  будь-які

            комбінації бажаних "особливостей".
                  Гнучкість може бути досягнута наступним дизайном (рис 6.3).
                  Іншим прикладом з’єднання є каскадне з'єднання властивостей (у

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

            основний  об'єкт  наслідують  від  цього  абстрактного  інтерфейсу.  Ін-
            терфейс використовує рекурсивну композицію для додавання до ос-

                                                              57
   52   53   54   55   56   57   58   59   60   61   62