Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 86

Паттерн стратегия

26.12.2024, 14:45. Показов 1115. Ответов 12

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть задание


В компьютерной игре герой (класс Него) может перемещаться между двумя точками (метод move) различными способами: идти пешком, ехать на лошади, лететь и т. п. Реализовать классы, позволяющие выбирать и менять в ходе выполнения программы способ перемещения героя, используя паттерн "стратегия" (strategy). Продемонстрировать работу реализованных классов.
Написан такой код:

Java
1
2
3
4
5
6
7
8
9
// Реализация стратегии перемещения пешком
public class WalkMovementStrategy implements MovementStrategy {
 
    @Override
    public void move(double fromX, double fromY, double toX, double toY) {
        System.out.printf("Иду пешком от точки (%.2f, %.2f) до точки (%.2f, %.2f)%n", fromX, fromY, toX, toY);
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
// Реализация стратегии перемещения по воздуху
public class FlyMovementStrategy implements MovementStrategy {
 
    @Override
    public void move(double fromX, double fromY, double toX, double toY) {
 
        System.out.printf("Лечу от точки (%.2f, %.2f) до точки (%.2f, %.2f)%n", fromX, fromY, toX, toY);
    }
 
}
Java
1
2
3
4
5
6
7
8
9
// Реализация стратегии перемещения на лошади
public class RideHorseMovementStrategy implements MovementStrategy {
 
    @Override
    public void move(double fromX, double fromY, double toX, double toY) {
        System.out.printf("Еду на лошади от точки (%.2f, %.2f) до точки (%.2f, %.2f)%n", fromX, fromY, toX, toY);
    }
 
}
Java
1
2
3
4
5
6
7
//Общая "стратегия" перемещения, определяет один метод move, который должен быть переопределен
public interface MovementStrategy {
 
    // Метод для перемещения из одной точки в другую
    void move(double fromX, double fromY, double toX, double toY);
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Класс героя, который использует стратегию перемещения
public class Hero {
 
    // Поле для хранения текущей стратегии перемещения
    private MovementStrategy movementStrategy;
 
    // Метод для установки новой стратегии перемещения
    //Это может быть WalkMovementStrategy, RideHorseMovementStrategy или FlyMovementStrategy
    public void setMovementStrategy(MovementStrategy movementStrategy) {
        this.movementStrategy = movementStrategy;
    }
 
    // Метод для перемещения героя с использованием текущей стратегии
    //
    public void move(double startX, double startY, double endX, double endY) {
        /*В зависимости от того, какой конкретный объект был присвоен полю movementStrategy, будет вызван соответствующий метод move из класса стратегии
        Здесь работает полиморфизм, а конкретно механизм динамической диспетчеризации (или позднего связывания)
        movementStrategy является ссылкой на объект, который реализует интерфейс MovementStrategy -> Java будет искать метод move в классе, на который указывает эта ссылка.
         */
        movementStrategy.move(startX, startY, endX, endY);
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Application {
    //Собственно точка входа в приложение
    public static void main(String[] args) {
        // Создаем объект героя
        Hero hero = new Hero();
 
        // Устанавливаем стратегию перемещения: пешком
        hero.setMovementStrategy(new WalkMovementStrategy());
        //Вызываем метод move у объекта и передаем ему координаты в виде аргументов
        hero.move(0.7, 1.3, 1.0, 2.4);
 
        // Устанавливаем стратегию перемещения: на лошади
        hero.setMovementStrategy(new RideHorseMovementStrategy());
        //Вызываем метод move у объекта и передаем ему координаты в виде аргументов
        hero.move(1.0, 1.0, 5.0, 4.0);
 
        // Устанавливаем стратегию перемещения: летим
        hero.setMovementStrategy(new FlyMovementStrategy());
        //Вызываем метод move у объекта и передаем ему координаты в виде аргументов
        hero.move(3.0, 4.0, 11.0, 9.5);
    }
}
Но преподаватель его не принял, сославшись на то, что, цитирую

"Реализовать классы, позволяющие выбирать и менять в ходе выполнения программы способ перемещения героя, используя паттерн "стратегия" (strategy)" не реализовано.

Подскажите, в чем проблема? Разве паттерн не реализован? Выбор не реализован? (через set...)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.12.2024, 14:45
Ответы с готовыми решениями:

Паттерн Builder
Есть такое задание, я вообще не понимаю как его сделать, помогите пожалуйста, если можно то с комментариями

Паттерн MVC
Объясните, пожалуйста, как будет строиться архитектура MVC с несколькими классами? Предположим, есть 4 класса(Bus, Truck, Car, Motorbike),...

Ругается компилятор на паттерн Приспособленец
Ругается компилятор на паттерн Приспособленец, этот код: public interface Primitive { public void draw(Context context); }...

12
230 / 199 / 71
Регистрация: 21.10.2016
Сообщений: 449
26.12.2024, 23:12
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
abstract public class Hero {
    MovementStrategy movementStrategy;
    public Hero() {}
    ...
}
 
public class WalkingHero extends Hero {
    WalkingHero() {
        movementStrategy = new WalkMovementStrategy();
    }
}
 
public class Application {
 
    public static void main(String args) {
        Hero hero = new WalkingHero();
        hero.move(.......);
        hero.setMovementStrategy(new RideHorseMovementStrategy());
        hero.move(......);
    }
}
 
// как-то так
0
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,497
Записей в блоге: 26
07.01.2025, 16:43
Для реализации задачи с использованием паттерна «Стратегия» в Java, создадим следующие классы:

Класс Hero — герой игры, который будет использовать различные стратегии перемещения.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Hero {
    private String name;
    private Strategy strategy;
 
    public Hero(String name, Strategy strategy) {
        this.name = name;
        this.strategy = strategy;
    }
 
    public void move() {
        strategy.execute();
    }
 
    public String getName() {
        return name;
    }
}
Интерфейс Strategy — определяет общий интерфейс для всех стратегий перемещения.
Java
1
2
3
interface Strategy {
    void execute();
}
Классы WalkingStrategy, HorseRidingStrategy и FlyingStrategy — конкретные стратегии перемещения героя.
WalkingStrategy: перемещение пешком.
Java
1
2
3
4
5
6
class WalkingStrategy implements Strategy {
    @Override
    public void execute() {
        System.out.println("Герой идет пешком.");
    }
}
HorseRidingStrategy: перемещение на лошади.
Java
1
2
3
4
5
6
class HorseRidingStrategy implements Strategy {
    @Override
    public void execute() {
        System.out.println("Герой едет на лошади.");
    }
}
FlyingStrategy: перемещение по воздуху (например, на крыльях или с помощью магии).
Java
1
2
3
4
5
6
class FlyingStrategy implements Strategy {
    @Override
    public void execute() {
        System.out.println("Герой летит.");
    }
}


Пример использования классов — создание героя и выбор стратегии перемещения.
Java
1
2
3
4
5
6
7
8
9
10
public class Main {
    public static void main(String[] args) {
        Hero hero = new Hero("Геракл", new HorseRidingStrategy());
        hero.move(); // Вывод: Герой едет на лошади.
 
        // Смена стратегии перемещения
        hero.strategy = new FlyingStrategy();
        hero.move(); // Вывод: Герой летит.
    }
}
Этот пример демонстрирует использование паттерна «Стратегия» для выбора и изменения способа перемещения героя в игре. В зависимости от выбранной стратегии, герой может идти пешком, ехать на лошади или лететь.


Эти простые примеры я сгенерировал при помощи GPT. Они неплохие и могут вам помочь в разработке, а также
дают представление об общей архитектуре.
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
07.01.2025, 17:20
Цитата Сообщение от vvm28 Посмотреть сообщение
Они неплохие и могут вам помочь в разработке, а также
Они отвратительные. Вы лезете в приватное!! поле без сеттера и геттера.
А если сделать так
Java
1
2
hero.strategy = null;
hero.move();
то будет "Герой делает NullPointerException и крашит приложение"
1
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,497
Записей в блоге: 26
07.01.2025, 19:53
Azathtot,
Спасибо за важное замечание по коду.
Я не призывал использовать ответ ИИ как есть, то есть просто скопипастить.
Естественно, придется дорабатывать и "шлифовать".
0
230 / 199 / 71
Регистрация: 21.10.2016
Сообщений: 449
07.01.2025, 22:41
Цитата Сообщение от vvm28 Посмотреть сообщение
Этот пример демонстрирует использование паттерна «Стратегия»
Это не паттерн "Стратегия".
1
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,497
Записей в блоге: 26
09.01.2025, 21:32
Цитата Сообщение от Хм Посмотреть сообщение
Это не паттерн "Стратегия".
И что же это по вашему?

Топик стартер все сделал правильно, только не учел исключения, как правильно сказал Azathtot,


Вот пример, как исправить:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Hero {
    
    private String name;
    private MovementStrategy movementStrategy;
 
    // Конструктор класса
    public Hero(String name) {
        this.name = name;
    }
 
    // Метод для установки текущей стратегии перемещения
    public void setMovementStrategy(MovementStrategy strategy) {
        this.movementStrategy = strategy;
    }
 
    // Метод для перемещения героя
    public void move() {
        if (movementStrategy != null) {
            movementStrategy.move(); // Вызываем метод выбранной стратегии
        } else {
            throw new IllegalStateException("Не выбрана стратегия перемещения!");
        }
    }
 
    // Геттер имени героя
    public String getName() {
        return name;
    }
}

Требуется только исправить метод перемешения по примеру:

Java
1
2
3
4
5
6
7
8
 // Метод для перемещения героя
    public void move() {
        if (movementStrategy != null) {
            movementStrategy.move(); // Вызываем метод выбранной стратегии
        } else {
            throw new IllegalStateException("Не выбрана стратегия перемещения!");
        }
    }
0
230 / 199 / 71
Регистрация: 21.10.2016
Сообщений: 449
10.01.2025, 16:37
Цитата Сообщение от vvm28 Посмотреть сообщение
И что же это по вашему?
Это фантазии на тему " паттерн "Стратегия" ".
1
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,497
Записей в блоге: 26
10.01.2025, 18:37
Хм, Советую вам почитать определение паттерна "стратегия",
а реализация в коде может быть любой в зависимости от требований.
Вы можете реализовать этот паттерн как описано выше, учитывая исключения.
Можете реализовать использую компаратор, или лямбда выражения.
Меняете поведение объекта по время выполнения в зависимости от выбранного алгоритма.
Вот самая простая структура:
Стратегия (Strategy) - интерфейс, объявляющий методы, общие для всех поддерживаемых версий некоторого алгоритма.
Конкретные стратегии (Concrete Strategies) - классы, реализующие разные варианты алгоритма через интерфейс Стратегии.
Контекст (Context) - класс, который содержит ссылку на объект Стратегии и делегирует ему работу. Контекст не знает конкретного класса выбранной стратегии.

Это всё. Реализация может быть любой, также как и названия классов.

Можно передавать алгоритм в конструкторе класса или методе.

Добавлено через 11 минут
Если нужно готовое решение полность, пишите требования, и обращайтесь во фрилансе.
Можно реализовать все три вышеописанных способа.
0
230 / 199 / 71
Регистрация: 21.10.2016
Сообщений: 449
10.01.2025, 20:35
vvm28, Извиняюсь. Был неправ.
Прочитал про этот шаблон в head first. Там другая реализация.
Сейчас заглянул в шаблоны банды четырех. Вы правы.
Ещё раз дико извиняюсь. Мне стыдно.
0
10.01.2025, 22:54

Не по теме:

Хм, да это ничего. Другое дело, что я несколько раз не проходил собеседования,
потому что мои ответы не совпадали с теми, что были записаны у hr-ки на бумажке. Было довольно досадно.
Реалии жизни.

0
0 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 86
13.01.2025, 18:25  [ТС]
Я правильно понимаю, что мой код соответствовал заданию тоже и преподаватель просто так решил отправить меня на пересдачу? За исключением обработки null?
0
230 / 199 / 71
Регистрация: 21.10.2016
Сообщений: 449
13.01.2025, 22:27
Цитата Сообщение от hsad Посмотреть сообщение
Разве паттерн не реализован?
Реализован.
Цитата Сообщение от hsad Посмотреть сообщение
Выбор не реализован? (через set...)
Реализован.
Цитата Сообщение от hsad Посмотреть сообщение
"Реализовать классы, позволяющие выбирать и менять в ходе выполнения программы способ перемещения героя, используя паттерн "стратегия" (strategy)" не реализовано.
Уточни у преподавателя, что он имел в виду.
А то мы тут все голову сломали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2025, 22:27
Помогаю со студенческими работами здесь

Почему не работает паттерн с глобальными данными?
Необходимо передать значение с формы "Input" на форму "Work" для этого используется паттерн Singleton, но он не работает Файл...

Паттерн стратегия
Всем привет. Решил разобраться с паттерном стратегия, прочитал несколько статей и сделал по их примеру код. Код рабочий. Просто хочу...

Паттерны Стратегия и Делегат
Доброго времени суток! Правильно ли я понимаю, что паттерны Стратегия и Делегат это одно и тоже ?

Java стратегия, итератор, композиция
Добрый день! Буду признателен, если "разжуете" и по возможности поможете с кодом вот в такой задачке: 1. Сначала требуется создать...

Составить паттерн
Делаю запрос на vkapi, Дабы не тянуть доп. библиотеку json ради одного ответа, надо составить pattern, который вытащит все id из этого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru