Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3597.pdf
Скачиваний:
18
Добавлен:
15.11.2022
Размер:
7.86 Mб
Скачать

ШАБЛОН 12. СТАТЕГИЯ

Цель применения: динамический выбор алгоритма в ходе выполнения программы.

Проблема. Необходимо предусмотреть возможность изменения алгоримта сортировки/шифрования/кодирования в зависимости от текущего выбора пользователя.

Описание

Поведенческий паттерн проектирования Стратегии используется для изменения поведения класса путем «переключения» внутреннего алгоритма во время выполнения без изменения самого класса, т.е. позволяет менять алгоритм обработки по запросу пользователя.

Паттерн Strategy переносит в отдельную иерархию классов все детали, связанные с реализацией алгоритмов.Диаграмма классов представлена на рис. 67.

Рис. 67. Диаграмма классов паттерна Стратегия

Для целевой задачи объявляется интерфейс, общий для всех алгоритмов и используемый классом Strategy.

Подклассы ConcreteStrategyA, ConcreteStrategyB реализуют в соответст-

вии с тем или иным алгоритмом.

Класс Сontext содержит указатель на объект абстрактного типа Strategy и предназначен для переадресации пользовательских запросов конкретному алгоритму. Для замены одного алгоритма другим достаточно перенастроить этот указатель на объект нужного типа.

120

Задания и указания к их выполнению

Постановка задачи

Реализовать арифметический калькулятор со следующим интерфейсом.

 

 

 

 

Число А

Текстовое поле

Знак

операции

 

Число Б

Текстовое поле

=

 

Текстовая метка

 

Ответ

Ограничения: допустимы двухоперандные арифметические операции сложение, вычитание, умножение, деление и логические операции И, ИЛИ, И- НЕ, ИЛИ-НЕ, XOR. Знак операции желательно реализовать в виде выпадающего списка и каждому элементу списка предусмотреть отдельную стратегую обработки.

В качестве операндов допустимы целые и вещественные числа. Ответ должен быть представлен в развернутом виде – «А+Б=С».

Указания к выполнению

1. Создайте графический интерфейс пользователя и определите два объекта для хранения введенных значений:

TextField strnum1, strnum2;

2. В соотвествии с диаграммой классов (рис. 67) создайте интерфейс и его реализации для арифметических и логических операций.

public interface Strategy {

public int doOperation(int num1, int num2); public String toString();

}

public class OperationAdd implements Strategy { @Override

public int doOperation(int num1, int num2) { return num1 + num2;

}

public String toString(){ return "OR";

}

}

3. Создайте контекст использования операций в классе, выполняющим интерпретацию строк из TextField, и вызов соотвествующей стратегии.

public class Context {

Strategy[] concretStrategyy=new Strategy[OPERATION];

121

public Context(){ concretStrategyy[0]=new OperationAnd(); concretStrategyy[1]=new OperationOR(); concretStrategyy[2]=new OperationXOR();

}

public int executeStrategy(int op, int num1, int num2){ Strategy strategy = concretStartegyy[op];// not safety!!,

//check the op index!!!

return strategy.doOperation(num1, num2);

}

}

4. Реализуйте обработку событий графического интерфейса.

Пошаговая реализация программы сортировки массива по выбранному пользователем алгоритму

Шаг 1. Определение интерфейса, включающий метод сортировки. Реализация данного интерфейса:

public interface SortingStrategy { public void sort(int[] numbers);

boolean compare(int a, int b) { if(a < b) return true;

else return false; }

}

Шаг 2. Реализация классов конкретных стратегий для различных методов сортировки (BubbleSort – методом «пузырька», SelectionSort – выбором и

InsertionSort – вставками):

public class BubbleSort implements Strategy { @Override

public void sort(int[] array) {

for (int i = array.length - 1; i >= 0; i--) { for (int j = 0; j < i; j++) {

if (array[j] > array[j + 1]) { int tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp;

}

}

}

}

}

public class SelectionSort implements Strategy { public void sort(int[] array) {

for (int i = 0; i < array.length - 1; i++) { int index = i;

122

for (int j = i + 1; j < array.length; j++) if (array[j] < array[index])

index = j;

int smallerNumber = array[index]; array[index] = array[i];

array[i] = smallerNumber;

}

}

}

Шаг 3. Создание класса Context, играющий роль модели или использования Стратегии в конкретной задаче:

public class Context {

private Strategy strategy; // ссылка на алгоритм сортировки private int[] array; // данные (модель), к-е обрабатываются

(включая сортировку)

public Context(Strategy strategy) { this.strategy = strategy;

}

public void sortArray(int[] array) { strategy.sort(array);

}

}

Шаг 4. Разработка графического интерфейса пользователя:

Рис. 68. Графический интерфейс приложения сортировки массива разными методами

Шаг 5. Обработка событий GUI, в частности, нажатие на кнопку:

public void bubbleSort(ActionEvent actionEvent) {

new Context(new BubbleSort()).sortArray();//сортировка printArray(context.getArray()); // отображение результата

}

123

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