Статьи

Поведенческие образцы дизайна: стратегия

Ранее мы использовали состояние для добавления некоторых функций в приложение на основе состояния пользователя. Наша следующая модель поведения — Стратегия.
Шаблон стратегии позволяет нам выбирать алгоритм во время выполнения. На основании инструкций наша программа выберет наиболее подходящий алгоритм вместо непосредственной реализации алгоритма. Это делает нашу кодовую базу более гибкой и очищает ее от любой дополнительной логики.

Наш пример должен развиваться вокруг транспортных средств и допустимого превышения скорости в зависимости от типа дороги. Например, если транспортное средство находится на дороге с четырьмя полосами движения, скорость будет отличаться от скорости на городской дороге.
Таким образом, мы на самом деле собираемся реализовать шаблоны стратегии в отношении ускорения.

Начнем с ускорения интерфейса.

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, являются их собственными.