以前,我们使用状态是为了根据用户状态向应用程序添加一些功能。 我们的下一个行为设计模式是策略。
策略模式使我们能够在运行时选择算法。 根据说明,我们的程序将选择最合适的算法,而不是直接实现算法。 这使我们的代码库更加灵活,并避免任何额外的逻辑。
我们的示例将围绕车辆以及根据道路类型允许的超速发展。 例如,如果车辆在四车道道路上,则速度与在市区道路上的速度将大不相同。
因此,我们实际上将实施有关提速的策略模式。
我们将从超速界面开始。
package com.gkatzioura.design.behavioural.strategy;
public interface Speeding {
Double adjustSpeed(Double currentSpeed);
}
然后,我们将基于道路类型创建一些实现。
四车道超速实施可在四车道行驶时调整速度。
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;
}
}
市区超速实施会在乡村道路上行驶时调整超速。
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;
}
}
然后我们将创建车辆类。
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;
}
}
如您所见,车辆将根据道路行驶更改其超速驾驶策略。
让我们把它们放在一起。
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上找到源代码。
翻译自: https://www.javacodegeeks.com/2019/01/behavioural-design-patterns-strategy.html