АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Учасники паттерна

Читайте также:
  1. Відносини учасників паттерна.
  2. Відносини учасників паттерна.
  3. Відносини учасників паттерна.
  4. Відносини учасників паттерна.
  5. Вості, учасники якого зберігають власність на засоби виробництва, але
  6. Сучасники відзначають: найбільшою складністю у Фіхте є те, що він залишає дух
  7. Учасники партерна.
  8. Учасники паттерна.
  9. Учасники паттерна.
  10. Учасники паттерна.
  11. Учасники паттерна.

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. Діаграма класів паттерна Стан

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)