- •Предисловие 15
- •Предисловие
- •От авторов
- •Об авторах
- •Благодарности
- •Принятые в книге обозначения
- •Технические рекомендации
- •Дополнительные ресурсы
- •Глава 1. Введение
- •1.1. Понятие паттерна проектирования
- •Определение
- •Метафора
- •1.2. Формат описания паттернов проектирования
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •1.3. Каталог паттернов проектирования
- •Порождающие
- •Структурные
- •Поведенческие
- •1.4. Техники ООП
- •Фабрика - Продукт
- •Фасад - Подсистема
- •Диспетчеризация
- •Цепочка объектов
- •Издатель-Подписчик
- •1.5. Принципы организации каталога
- •Цель паттерна
- •Уровень паттерна
- •1.6. Рекомендации по изучению паттернов
- •1.7. Рекомендации по применению паттернов
- •Глава 2. Порождающие паттерны
- •Игра - Лабиринт
- •Паттерн Abstract Factory
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Builder
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Factory Method
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Prototype
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Паттерн Singleton
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода игры «Лабиринт»
- •Известные применения паттерна в .Net
- •Глава 3. Структурные паттерны
- •Паттерн Adapter
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Adapter уровня классов
- •Adapter уровня объектов
- •Структура паттерна на языке C#
- •Adapter уровня классов
- •Adapter уровня объектов
- •Участники
- •Отношения между участниками
- •Отношения между классами (для адаптера уровня классов)
- •Отношения между классами (для адаптера уровня объектов)
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Adapter уровня классов
- •Adapter уровня объектов
- •Особенности применения паттерна Adapter
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн Bridge
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Composite
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Паттерн Decorator
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Паттерн Facade
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Flyweight
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн Proxy
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Глава 4. Паттерны поведения
- •Паттерн Chain of Responsibility
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Command
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн Interpreter
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Паттерн Iterator
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Классическое представление
- •Представление Microsoft .NET
- •Структура паттерна на языке C#
- •Классическое представление
- •Представление Microsoft .NET
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Паттерн Mediator
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Паттерн Memento
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Реализация
- •Паттерн Observer
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Модель вытягивания (Pull model)
- •Модель проталкивания (Push model)
- •Структура паттерна на языке C#
- •Модель вытягивания (Pull model)
- •Модель проталкивания (Push model)
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Реализация
- •Пример кода
- •Известные применения паттерна в .Net
- •Паттерн State
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Мотивация
- •Применимость паттерна
- •Результаты
- •Паттерн Strategy
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Применимость паттерна
- •Паттерн Template Method
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Применимость паттерна
- •Результаты
- •Реализация
- •Паттерн Visitor
- •Название
- •Также известен как
- •Классификация
- •Частота использования
- •Назначение
- •Введение
- •Структура паттерна на языке UML
- •Структура паттерна на языке C#
- •Участники
- •Отношения между участниками
- •Отношения между классами
- •Отношения между объектами
- •Применимость паттерна
- •Результаты
- •Реализация
- •Известные применения паттерна в .Net
- •Библиография
265
Паттерн Strategy
Название
Стратегия
Также известен как
Policy (политика)
Классификация
По цели: поведенческий По применимости: к объектам
Частота использования
Выше средней - 1 2 3 4 5
Назначение
Паттерн Strategy - определяет набор алгоритмов (часто схожих по роду деятельности), инкапсулирует каждый из имеющихся алгоритмов (в отдельный класс) и делает их подменяемыми. Паттерн Strategy позволяет подменять алгоритмы без участия клиентов, которые используют эти алгоритмы.
Введение
Что такое стратегия в широком понимании? Стратегия - это план действий человека в жизненных или деловых ситуациях, которые могут возникнуть. Стратегию можно сравнить с компьютерным алгоритмом, который описывает действия, выполняемые для реализации плана. Стратегии принято разделять на два типа: чистые стратегии и смешанные стратегии.
Чистая стратегия - описывает каким образом человек выполнит действия в определенной ситуации.
Смешанная стратегия - описывает использование сочетаний, различных вариантов чистых стратегий, выбранных наугад или с определенной вероятностью.
Впрограммировании, стратегия как способ действий становится необходимой в ситуации, когда для прямого достижения основной цели (выполнения программы) недостаточно наличных ресурсов (объема оперативной памяти, вычислительной мощности процессора или видеокарты). Соответственно, основной задачей стратегии является эффективное использование наличных ресурсов для достижения основной цели.
Важно понимать, что достижение основной цели подразумевает два совершенно разных вида деятельности - это стратегия и тактика.
Тактика – это организация отдельных алгоритмов и выполнение их.
Стратегия – это увязка алгоритмов с общей целью выполнения программы.
Правильно выбранная стратегия называется доминирующей стратегией. Доминирование - это ситуация, при которой одна из правильно выбранных стратегий дает больший выигрыш (в производительности) нежели другая. При выборе стратегии из множества всех допустимых стратегий, следует сравнить по предпочтительности исходы от применения имеющихся стратегий.
Принято различать строгое (сильное) доминирование и слабое доминирование. Строгое доминирование стратегии A над стратегией B, когда применение стратегии A дает больший выигрыш чем применение стратегии B. Слабое доминирование стратегии A над стратегией B, когда применение стратегии A дает меньший выигрыш чем применение стратегии B.
266
Понятие стратегии иногда (ошибочно) путают с понятием шага. Например, шаг можно сравнить с одиночным действием алгоритма сортировки в какой-то момент его работы (сравнение двух элементов массива и их перестановка). Стратегию можно сравнить с полным алгоритмом сортировки определенного типа (быстрая сортировка, сортировка Шелла, сортировка вставками, пузырьковая сортировка, сортировка выбором и т.д.) для выполнения сортировки всего массива. Алгоритмы сортировки оцениваются по скорости выполнения (время - основной параметр, характеризующий быстродействие алгоритма) и эффективности использования памяти (ряд алгоритмов требует выделения дополнительной памяти под временное хранение результатов промежуточных вычислений). Соответственно, основной задачей стратегии выбора алгоритма сортировки является эффективное использование аппаратных ресурсов вычислительной машины для достижения основной цели - упорядочивания элементов в списке.
class Context
{
Strategy strategy;
int[] array = { 3, 5, 1, 2, 4 };
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public void Sort()
{
strategy.Sort(ref array);
}
public void PrintArray()
{
for (int i = 0; i < array.Length; i++) Console.Write(array[i] + " ");
Console.WriteLine();
}
}
abstract class Strategy
{
public abstract void Sort(ref int[] array);
}
class Program
{
static void Main()
{
var sort = new SelectionSort(); var context = new Context(sort); context.Sort(); context.PrintArray();
}
}
// Пузырьковая сортировка. class BubbleSort : Strategy
{
public override void Sort(ref int[] array)
{
Console.WriteLine("BubbleSort");
for (int i = 0; i < array.Length; i++)
{
for (int j = array.Length - 1; j > i; j--)
{
if (array[j] < array[j - 1])
{
int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp;
}
}
}
}
}
// Сортировка вставками.
class InsertionSort : Strategy
{
public override void Sort(ref int[] array)
{
Console.WriteLine("InsertionSort");
for (int i = 1; i < array.Length; i++)
{
int j = 0;
int buffer = array[i];
for (j = i - 1; j >= 0; j--)
{
if (array[j] < buffer) break;
array[j + 1] = array[j];
}
array[j + 1] = buffer;
}
}
}
// Сортировка выбором.
class SelectionSort : Strategy
{
public override void Sort(ref int[] array)
{
Console.WriteLine("SelectionSort");
for (int i = 0; i < array.Length - 1; i++)
{
int k = i;
for (int j = i + 1; j < array.Length; j++) if (array[k] > array[j])
k = j;
if (k != i)
{
int temp = array[k]; array[k] = array[i]; array[i] = temp;
}
}
}
}
См. Пример к главе: \021_Strategy\002_StrategySort
267
Структура паттерна на языке UML
См. Пример к главе: \021_Strategy\001_Strategy
Структура паттерна на языке C#
class Program |
|
|
{ |
|
|
static void Main() |
|
|
{ |
|
|
Context context; |
|
|
context = new Context(new ConcreteStrategyA()); |
|
|
context.ContextInterface(); |
|
|
context = |
new Context(new ConcreteStrategyB()); |
|
context.ContextInterface(); |
|
|
context = |
new Context(new ConcreteStrategyC()); |
|
context.ContextInterface(); |
|
|
} |
|
|
} |
|
|
class Context |
|
|
{ |
|
|
Strategy strategy; |
|
|
public Context(Strategy strategy) |
|
|
{ |
|
abstract class Strategy |
this.strategy = strategy; |
{ |
|
} |
|
public abstract void AlgorithmInterface(); |
|
|
} |
public void ContextInterface() |
|
|
{ |
|
|
strategy.AlgorithmInterface(); |
|
|
} |
|
|
} |
|
|
class ConcreteStrategyA : Strategy |
class ConcreteStrategyB : Strategy |
class ConcreteStrategyC : Strategy |
{ |
{ |
{ |
public override void AlgorithmInterface() |
public override void AlgorithmInterface() |
public override void AlgorithmInterface() |
{ |
{ |
{ |
Console.WriteLine("ConcreteStrategyA"); |
Console.WriteLine("ConcreteStrategyB"); |
Console.WriteLine("ConcreteStrategyC"); |
} |
} |
} |
} |
} |
} |
См. Пример к главе: \021_Strategy\001_Strategy