Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
154
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]