|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Учасники паттерна1. Strategy – стратегія: - оголошує загальний для всіх підтримуваних алгоритмів інтерфейс. Клас Context користується цим інтерфейсом для виклику конкретного алгоритму, визначеного в класі ConcreteStrategy. 2. ConcreteStrategy – конкретна стратегія: - реалізує алгоритм, що використовує інтерфейс, оголошений в класі Strategy. 3. Context – контекст: - конфігурується об’єктом класу ConcreteStrategy; - зберігає посилання на об’єкт класу Strategy; - може визначати інтерфейс, який дозволяє об’єкту Strategy отримати доступ до даних контексту. Відносини учасників паттерна. Взаємодію класів паттерна Стратегія можна описати наступним чином: - класи Strategy і Context взаємодіють для реалізації обраного алгоритму. Контекст може передати Стратегії всі необхідні алгоритму дані в момент його виклику. Замість цього Контекст може дозволити звертатися до своїх операцій у потрібні моменти, передавши посилання на самого себе операціям класу Strategy; - контекст переадресує запити своїх клієнтів об’єкту-стратегії. Зазвичай, клієнт створює об’єкт ConcreteStrategy і передає його Контексту, після чого клієнт «спілкується» винятково з Контекстом. Часто в розпорядженні клієнта знаходиться декілька класів ConcreteStrategy, з яких він може вибирати. Результати використання паттерна. Переваги паттерну Strategy: - систему простіше підтримувати і модифікувати, оскільки сімейство алгоритмів перенесено в окрему ієрархію класів; - паттерн Strategy надає можливість заміни одного алгоритму іншим в процесі виконання програми; - паттерн Strategy дозволяє приховати деталі реалізації алгоритмів від клієнта. Недоліки паттерну Strategy: - для правильного налаштування системи користувач повинен знати про особливості алгоритмів; - кількість класів у системі, побудованої із застосуванням паттерну Strategy, зростає.
Паттерн Стан (State) Призначення. Паттерн Стан – це паттерн поведінки, що дозволяє об’єкту змінювати свою поведінку в залежності від внутрішнього стану. Зовні створюється враження, що змінився клас об’єкта. Що означає «немов змінився клас об’єкта»? Уявіть, що відбувається з точки зору клієнта: якщо використовуваний об’єкт повністю змінює свою поведінку, для клієнта це рівнозначно переходу на роботу з об’єктом іншого класу. Зазвичай, на практиці зміна класу імітується простим перемиканням на інший об’єкт стану, задіяного в композиції [17]. Частота використання Мотивація застосування. Поведінка об’єкта залежить від його стану і повинна змінюватися під час виконання програми. Таку схему можна реалізувати, застосувавши безліч умовних операторів: на основі аналізу поточного стану об’єкта робляться певні дії. Однак, при великій кількості станів умовні оператори будуть розкидані по всьому коду, і таку програму буде важко підтримувати. Паттерн State вирішує зазначену проблему наступним чином: - вводить клас Context, в якому визначається інтерфейс для зовнішнього світу; - вводить абстрактний клас State; - представляє різні «стани» кінцевого автомата у вигляді підкласів State; - у класі Context є покажчик на поточний стан, який змінюється при зміні стану кінцевого автомата. Рекомендовано використовувати паттерн коли: - поведінка об’єкта залежить від його стану і повинна змінюватися під час виконання; - в коді операцій зустрічаються умовні оператори, що складаються з багатьох гілок, вибір гілки в яких залежить від стану. Зазвичай, в такому випадку стан представляється перерахованими константами. Часто одна і та ж структура умовного оператора повторюється в декількох операціях. Паттерн Стан пропонує помістити кожну гілку в окремий клас. Це дозволяє трактувати стан об’єкта як самостійний об’єкт, який може змінюватися незалежно від інших. Проблемна предметна область. Паттерн State дозволяє об’єкту змінювати свою поведінку в залежності від внутрішнього стану. Схожа картина може спостерігатися в роботі торговельного автомата (рис. 6.34) [10].
Рис. 6.34. Схема предметної області
Автомати можуть мати різні стани в залежності від наявності товарів, суми отриманих монет, можливості розміну грошей і т.д. Після того, як покупець вибрав і оплатив товар, можливі наступні ситуації (стани): - видати покупцю товар, видавати решту не потрібно; - видати покупцю товар і решту; - товару покупець не одержить через відсутність достатньої суми грошей; - товар покупець не одержить через його відсутність. Розглянемо приклад автомата, що видає жуйки. Перетворити діаграму станів на програмний код можна таким чином, як це показано на рис. 6.35: 1. Зберіть усі стани. 2. Створіть змінну екземпляра для збереження поточного стану, визначите значення для кожного можливого стану. 3. Зберіть всі дії, що можуть виконуватися в системі. 4. Створіть клас, що моделює кінцевий автомат. Для кожної дії створюється метод, що використовує умовні конструкції для вибору поведінки, яка відповідає кожному стану.
Рис. 6.35. Предметна область в термінах паттерна Стан
Створену архітектуру можна вдосконалити, інкапсулюючи об’єкти стану в окремих класах, а потім при виконанні дії делегувати операції об’єкту поточного стану. Такий підхід відповідає основним принципам проектування, тому отримана в кінцевому рахунку архітектура буде більш простою в супроводі. Основна послідовність дій: 1. Визначаємо інтерфейс State, що містить метод для кожної можливої дії. 2. Реалізуємо клас State для кожного стану автомата. Ці класи визначають поведінку автомата, яка знаходиться у відповідному стані. 3. Нарешті, ми рятуємося від усього зайвого коду і делегуємо виконання операцій класу стану. Ця реалізація торговельного автомата на структурному рівні відрізняється від першої версії, але при цьому зберігає колишню функціональність. Переваги структурної зміни реалізації: - локалізація поведінки кожного стану в окремому класі; - видалення численних конструкцій іf, що ускладнювали супровід коду; - кожний стан – закритий для змін, однак сам автомат відкритий для розширення за допомогою додавання нових класів стану; - створені кодова база і структура класів є наближеними до діаграми переходів автомата, а отже – більш прості для читання і розуміння. Діаграма класів паттерна Стан представлена на рис. 6.36.
Рис. 6.36. Діаграма класів паттерна Стан
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |