Ранее мы использовали состояние для добавления некоторых функций в приложение на основе состояния пользователя. Наша следующая модель поведения — Стратегия.
Шаблон стратегии позволяет нам выбирать алгоритм во время выполнения. На основании инструкций наша программа выберет наиболее подходящий алгоритм вместо непосредственной реализации алгоритма. Это делает нашу кодовую базу более гибкой и очищает ее от любой дополнительной логики.
Наш пример должен развиваться вокруг транспортных средств и допустимого превышения скорости в зависимости от типа дороги. Например, если транспортное средство находится на дороге с четырьмя полосами движения, скорость будет отличаться от скорости на городской дороге.
Таким образом, мы на самом деле собираемся реализовать шаблоны стратегии в отношении ускорения.
Начнем с ускорения интерфейса.
|
1
2
3
4
5
6
7
|
package com.gkatzioura.design.behavioural.strategy;public interface Speeding { Double adjustSpeed(Double currentSpeed);} |
Затем мы создадим несколько реализаций, основанных на типе дороги.
Реализация ускорения на четырех полосах регулирует скорость при движении по четырем полосам.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package com.gkatzioura.design.behavioural.strategy;public class FourLaneSpeeding implements Speeding { private static final Double upperLimit = 50d; @Override public Double adjustSpeed(Double currentSpeed) { if(currentSpeed>upperLimit) { currentSpeed = upperLimit; } System.out.println("Speed adjusted at "+currentSpeed); return currentSpeed; }} |
Реализация ускорения в городской местности регулирует скорость при движении по сельской дороге.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package com.gkatzioura.design.behavioural.strategy;public class UrbanAreaSpeeding implements Speeding { private static final Double upperLimit = 30d; @Override public Double adjustSpeed(Double currentSpeed) { if(currentSpeed>upperLimit) { currentSpeed = upperLimit; } System.out.println("Speed adjusted at "+currentSpeed); return currentSpeed; }} |
И тогда мы создадим класс транспортного средства.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.gkatzioura.design.behavioural.strategy;public class Vehicle { private Speeding speeding; private Double currentSpeed; public void drive() { speeding.adjustSpeed(currentSpeed); /** * Driving related actions. */ } public void setSpeeding(Speeding speeding) { this.speeding = speeding; } public void setCurrentSpeed(Double currentSpeed) { this.currentSpeed = currentSpeed; }} |
Как вы можете видеть, транспортное средство должно изменить свою стратегию превышения скорости в зависимости от движения по дороге.
Давайте сложим их все вместе.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.gkatzioura.design.behavioural.strategy;public class Strategy { public static void main(String[] args) { Vehicle vehicle = new Vehicle(); vehicle.setCurrentSpeed(70d); vehicle.drive(); /** * Changed route */ vehicle.setSpeeding(new FourLaneSpeeding()); vehicle.drive(); /** * Changed route */ vehicle.setSpeeding(new UrbanAreaSpeeding()); vehicle.drive(); }} |
На этом пока все! Вы можете найти исходный код на github .
| Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Поведенческие шаблоны дизайна: стратегия
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |