Стратегія (шаблон проектування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Стратегія (англ. Strategy ) —шаблон проектування, відноситься до класу шаблонів поведінки. Відомий ще під іншою назвою - "Policy". Його суть полягає у тому, щоб створити декілька схем поведінки для одного об'єкту та винести в окремий клас. Шаблон Стратегія(Strategy) дозволяє міняти вибраний алгоритм незалежно від об'єктів-клієнтів, які його використовують.

Зміст

Основні характеристики [ред.]

Завдання [ред.]

За типом клієнта (або за типом оброблюваних даних) вибрати підходящий алгоритм, який слід застосувати. Якщо використовується правило, яке не піддається змінам, немає необхідності звертатися до шаблону «стратегія».

Структура [ред.]

  • Strategy Pattern.jpg
    Strategy pattern in LePUS3.gif

Мотиви [ред.]

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

Спосіб вирішення [ред.]

Відділення процедури вибору алгоритму від його реалізації. Це дозволяє зробити вибір на підставі контексту.

Учасники [ред.]

  • Клас Strategy визначає, як будуть використовуватися різні алгоритми.
  • Конкретні класи ConcreteStrategy реалізують ці різні алгоритми.
  • Клас Context використовує конкретні класи ConcreteStrategy допомогою посилання на конкретний тип абстрактного класу Strategy . Класи Strategy і Context взаємодіють з метою реалізації обраного алгоритму (в деяких випадках класу Strategy потрібно посилати запити класу Context ). Клас Context пересилає класу Strategy запит, що надійшов від його класу-клієнта.

Слідства [ред.]

  • Шаблон Strategy визначає сімейство алгоритмів.
  • Це дозволяє відмовитися від використання перемикачів і / або умовних операторів.
  • Виклик всіх алгоритмів повинен здійснюватися стандартним чином (всі вони повинні мати однаковий інтерфейс).

Реалізація [ред.]

Клас, який використовує алгоритм ( Context ), включає абстрактний клас ( Strategy ), що володіє абстрактним методом, визначальним спосіб виклику алгоритму. Кожен похідний клас реалізує один необхідний варіант алгоритму.

Використання [ред.]

Архітектура Microsoft WDF заснована на цьому паттерні. У кожного об'єкта "драйвер" і "пристрій" є незмінна частина, вшита в систему, в якій реєструється змінна частина (стратегія), написана в конкретній реалізації. Змінна частина може бути і зовсім порожній, що дасть нічого не робить драйвер, але при цьому здатний брати участь у PnP і управління живленням.

Бібліотека ATL містить у собі набір класів threading model, які є стратегіями (різними реалізаціями Lock / Unlock, які потім використовуються основними класами системи). При цьому в цих стратегіях використовується статичний поліморфізм через параметр шаблону, а не динамічний поліморфізм через віртуальні методи.

Призначення шаблону проектування Стратегія [ред.]

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

Приклад. Є програма(інтерфейс) через яку обраховується ціна на товар для покупців у яких є знижка та ціна за сезонною знижкою - обираємо необхідний алгоритм. Об'єктно-орієнтованиий дизайн такої програми будується на ідеї використання поліморфізму. Результатом є набір "класів-родичів" - у яких єдиний інтерфейс та різна реалізація алгоритмів.
  • Недоліками такого алгоритму є те, що реалізація жорстко прив'язана до підкласу, що ускладнює внесення змін.
  • Вирішенням даної проблеми є використання патерну Стратегія (Strategy).

Переваги [ред.]

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

Недоліки [ред.]

  1. Збільшення кількості об'єктів.
  2. Клієнт має знати особливості реалізацій стратегій для вибору найбільш вдалої.

Використання [ред.]

Архітектура Microsoft WDF заснована на цьому шаблоні. У кожного об'єкта "драйвер" і "пристрій" є незмінна частина, вшита в систему, в якій реєструється змінна частина (стратегія), написана в конкретній реалізації. Змінна частина може бути і зовсім порожній, що дасть нічого не робить драйвер, але при цьому здатний брати участь у PnP і управління живленням.

Бібліотека ATL містить у собі набір класів threading model, які є стратегіями (різними реалізаціями Lock / Unlock, які потім використовуються основними класами системи). При цьому в цих стратегіях використовується статичний поліморфізм через параметр шаблону, а не динамічний поліморфізм через віртуальні методи.

Приклади [ред.]

Приклад на Java

Приклад на C + +

Приклад на C #

Приклади на D

Приклад на Delphi

Приклади на Javascript

Приклад з використанням динамічних (first-class) функцій

Приклади на PHP5

Приклад на Python

Висновки [ред.]

Останнім часом розроблено багато мов програмування, але в кожній з них для досягнення найкращого результату роботи необхідно використовувати шаблони програмування, одним з яких є Стратегія (Strategy).

Джерела [ред.]

Design Patterns: Elements of Reusable Object-Oriented Software

Література [ред.]

  • Bishop, Judith. C# 3.0 Design Patterns. Sebastopol, California: O’Reilly, 2008.
  • Tomas Petricek, Jon Skeet. Functional Programming for the Real World. б.м.: Manning Publications, 2010.

Посилання [ред.]