Видео курс Шаблоны проектирования

Основные темы, рассматриваемые на уроке:
00:43 1 Метафора
07:12 2 Программный код метафоры
12:30 3 Структура паттерна на языке UML
13:14 4 Структура паттерна на языке C#
19:36 5 Применимость Паттерна
24:48 6 Назначение паттерна
27:35 7 Использование паттерна

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

Для просмотра полной версии видеокурса и получения доступа к дополнительным учебным материалам Вам необходимо оформить подписку
Оформить подписку

Паттерн Strategy

Название

Стратегия

Также известен как

Policy (политика)

Классификация

По цели: поведенческий

По применимости: к объектам

Частота использования

Выше средней    -   1 2 3 4 5

Назначение

Паттерн Strategy - определяет набор алгоритмов (часто схожих по роду деятельности), инкапсулирует каждый из имеющихся алгоритмов (в отдельный класс) и делает их подменяемыми. Паттерн Strategy позволяет подменять алгоритмы без участия клиентов, которые используют эти алгоритмы.

Введение

Что такое стратегия в широком понимании? Стратегия - это план действий человека в жизненных или деловых ситуациях, которые могут возникнуть. Стратегию можно сравнить с компьютерным алгоритмом который описывает действия, выполняемые для реализации плана. Стратегии принято разделять на два типа: чистые стратегии и смешанные стратегии.

  • Чистая стратегия - описывает каким образом человек выполнит действия в определенной ситуации.
  • Смешанная стратегия - описывает использование сочетаний, различных вариантов чистых стратегий, выбранных наугад или с определенной вероятностью.

В программировании, стратегия как способ действий становится необходимой в ситуации, когда для прямого достижения основной цели (выполнения программы) недостаточно наличных ресурсов (объема оперативной памяти, вычислительной мощности процессора или видеокарты). Соответственно, основной задачей стратегии является эффективное использование наличных ресурсов для достижения основной цели.

Важно понимать, что достижение основной цели подразумевает два совершенно разных вида деятельности - это стратегия и тактика.

  • Тактика – это организация отдельных алгоритмов и выполнение их.
  • Стратегия – это увязка алгоритмов с общей целью выполнения программы.

Правильно выбранная стратегия называется доминирующей стратегией. Доминирование - это ситуация, при которой одна из правильно выбранных стратегий дает больший выигрыш (в производительности) нежели другая. При выборе стратегии из множества всех допустимых стратегий, следует сравнить по предпочтительности исходы от применения имеющихся стратегий.

Принято различать строгое (сильное) доминирование и слабое доминирование. Строгое доминирование стратегии A над стратегией B, когда применение стратегии A дает больший выигрыш чем применение стратегии B. Слабое доминирование стратегии A над стратегией B, когда применение стратегии A дает меньший выигрыш чем применение стратегии B.

Понятие стратегии иногда (ошибочно) путают с понятием шага. Например, шаг можно сравнить с одиночным действием алгоритма сортировки в какой-то момент его работы (сравнение двух элементов массива и их перестановка). Стратегию можно сравнить с полным алгоритмом сортировки определенного типа (быстрая сортировка, сортировка Шелла, сортировка вставками, пузырьковая сортировка, сортировка выбором и т.д.) для выполнения сортировки всего массива. Алгоритмы сортировки оцениваются по скорости выполнения (время - основной параметр, характеризующий быстродействие алгоритма) и эффективности использования памяти (ряд алгоритмов требует выделения дополнительной памяти под временное хранение результатов промежуточных вычислений). Соответственно, основной задачей стратегии выбора алгоритма сортировки является эффективное использование аппаратных ресурсов вычислительной машины для достижения основной цели - упорядочивания элементов в списке.

См. пример к главе: \021_Strategy\002_StrategySort

Структура паттерна на языке UML

См. пример к главе: \021_Strategy\001_Strategy

Структура паттерна на языке C#

См. пример к главе: \021_Strategy\001_Strategy

Участники

  • Strategy - Стратегия:

Предоставляет интерфейс для реализаций конкретных стратегий.

  • ConcreteStrategy - Конкретная стратегия:

Классы конкретных стратегий реализуют интерфейс предоставляемый классом Strategy. Реализации интерфейса, предоставляемого классом Strategy представляют собой алгоритмы (заданного вида деятельности) направленные на достижение определенной цели.

  • Context - Контекст:

Объект класса Context конфигурируется объектом класса ConcreteStrategy.

Отношения между участниками

Отношения между классами

  • Конкретные классы ConcreteStrategy связаны связями отношения наследования с абстрактным классом Strategy.
  • Конкретный класс Context связан связью отношения агрегации с абстрактным классом Strategy.

Отношения между объектами

  • Классы Context и Strategy взаимодействуют друг с другом для реализации техники абстрагирования вариантов использования конкретных стратегий. Контекст может передавать определенной стратегии (ConcreteStrategy) все необходимые данные которые будут использоваться алгоритмом из этой стратегии. Также контекст может передавать стратегии ссылку на себя, а стратегия сможет получать доступ к необходимым членам контекста (но, такой подход не способствует построению повторно используемого дизайна, так как каждая стратегия будет делать предположение о контексте который ее использует).
  • Обычно клиент создает экземпляр класса Context и конфигурирует его экземпляром класса одной из конкретных стратегий (ConcreteStrategy), после чего клиент общается только с контекстом, который переадресует запросы клиентов объекту стратегии.

© 2017 ITVDN, все права защищены