Проблема. Необходимо выполнить сортировку массива по выбранному пользователем алгоритму.
Требуется создать программу, которая выполняет сортировку массива чисел/символов/объектов по одному из предложенных алгоритмов.
1. Определите интерфейс , включающий метод сортировки
public interface SortingStrategy {
public void sort(int[] numbers);
boolean compare(int a, int b) {
if(a < b) return true;
else return false; }
}
2. Реализуйте классы конкретных стратегий для различных методов сортировки, например,
public class SelectionSort implements SortingStrategy {
@Override
public void sort(int[] numbers) {
int i, j, first, temp;
for (i = numbers.length - 1; i > 0; i--) {
first = 0;
for (j = 1; j <= i; j++) {
if (compare(numbers[j],numbers[first]))
first = j; }
temp = numbers[first];
numbers[first] = numbers[i];
numbers[i] = temp;
}
}
}
3. Создайте класс Context для управления выбором конкретной стратегии или используйте Стратегию в уже реализованном класса
public class CurrentContext {
private SortingStrategy strategy;// для делегирования действий
// конструктор и методы текущего класса
........................
// установить новую стратегию
public void setSortingMethod(SortingStrategy strategy) {
this.strategy = strategy; }
// получить используемую стратегию
public SortingStrategy getStrategy() {
return strategy; }
// применить стратегию для выполнения действий
public void sortNumbers(int[] numbers){
strategy.sort(numbers); }
}
4. Реализуйте графический интерфейс пользователя, отражающий исходный и отсортированный массив, а также кнопки "Заполнить", "Сортировать", "Найти". Для выбора метода сортировки и критерия поиска используйте Переключатели. Включите использование объекта SortingContext в обработчик кнопки "Сортировать".
! не использовать разные кнопки для методов сортировки
5*. Реализуйте дополнительные функции :
задание порядка сортировки (по возрастанию/убыванию)
поиск минимального/максимального элемента в массиве
сортировка строк (объектов типа Person по выбранным полям)
Поведенческий паттерн проектирования Стратегии используется для изменением поведения класса путем "переключения" внутреннего алгоритма во время выполнения без изменения самого класса, т.е. позволяет менять алгоритм обработки по запросу пользователя.
Паттерн Strategy переносит в отдельную иерархию классов все детали, связанные с реализацией алгоритмов.
Для целевой задачи объявляется интерфейс, общий для всех алгоритмов и используемый классом Strategy.
Подклассы ConcreteStrategyA, ConcreteStrategyB реализуют в соответствии с тем или иным алгоритмом.
Класс Сontext содержит указатель на объект абстрактного типа Strategy и предназначен для переадресации пользовательских запросов конкретному алгоритму. Для замены одного алгоритма другим достаточно перенастроить этот указатель на объект нужного типа.
Рис. 1 - Диаграмма классов проектирвоания Стратегии