public void manage()
{
double speed = getSpeedfromVehicle();
if(speed >=0 && speed <= 10)
{
System.out.println("Low Speed mode");
}
else if(speed > 10 && speed < 60)
{
System.out.println("Medium Speed Mode");
}
else if(speed >= 60)
{
System.out.println("High Speed Mode");
}
}
当车辆开始移动时,我的管理方法会针对每个速度变化进行调用。 如果速度保持在一个类别(0到10)中,我只需要输出一次输出语句,即使对于速度0到10,manage()被称为无限次,这也适用于其他速度范围。它也应该切换到其他速度范围,并且应该只打印一次速度范围。
答案 0 :(得分:6)
您需要有一个变量来检查当前速度模式。我会考虑使用带有我的速度状态的枚举类作为值。每次速度范围发生变化时,都会更新本地SpeedState枚举值并在manage()方法中对其进行验证。
在我的头顶,它看起来像以下......
public enum SpeedState {
LOW, MEDIUM, HIGH
}
public class Drive{
private SpeedState state;
// Supporting code, loops, etc
public void manage(){
double speed = getSpeedfromVehicle();
if((speed >=0 && speed <= 10) && state != SpeedState.LOW)
{
state = SpeedState.LOW;
System.out.println("Low Speed mode");
}
else if((speed > 10 && speed < 60) && state != SpeedState.MEDIUM)
{
state = SpeedState.MEDIUM;
System.out.println("Medium Speed Mode");
}
else if((speed >= 60) && state != SpeedState.HIGH)
{
state = SpeedState.HIGH;
System.out.println("High Speed Mode");
}
}
}
答案 1 :(得分:1)
我会考虑使用State pattern。然后有一个高,低,中的状态。这样您就可以封装每个状态的行为。当您从一种状态转换到另一种状态时,您可以在转换时执行所需的操作。这是一个比循环更优雅的解决方案,并且将更容易维护。
以下是一个示例,说明如何使用状态模式来管理汽车在速度方面的状态。
package test;
public class Car {
private int speed;
private Speedo speedo = new LowSpeed();
public void setSpeed(int speed) {
this.speed = speed;
}
public int getSpeed() {
return speed;
}
public void manage() {
this.speedo = speedo.manage(speed);
}
}
abstract class Speedo {
private int lowRange;
private int highRange;
private Speedo lowState;
private Speedo highState;
public Speedo getLowState() {
return lowState;
}
public Speedo getHighState() {
return highState;
}
public int getLowRange() {
return lowRange;
}
public void setLowRange(int lowRange) {
this.lowRange = lowRange;
}
public int getHighRange() {
return highRange;
}
public void setHighRange(int highRange) {
this.highRange = highRange;
}
public abstract void onLowTransition();
public abstract void onHighTransition();
public Speedo manage(int speed) {
if (speed < getLowRange()) {
onLowTransition();
return getLowState();
} else if (speed > getHighRange()) {
onHighTransition();
return getHighState();
} else {
return this;
}
}
}
class LowSpeed extends Speedo {
public Speedo manage(int speed) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onLowTransition() {
// TODO Auto-generated method stub
}
@Override
public void onHighTransition() {
// TODO Auto-generated method stub
}
}
class MidSpeed extends Speedo {
public Speedo manage(int speed) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onLowTransition() {
// TODO Auto-generated method stub
}
@Override
public void onHighTransition() {
// TODO Auto-generated method stub
}
}
class HighSpeed extends Speedo {
public Speedo manage(int speed) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onLowTransition() {
// TODO Auto-generated method stub
}
@Override
public void onHighTransition() {
// TODO Auto-generated method stub
}
}
这是不完整的,但它会为你提供一个良好的基础。
答案 2 :(得分:0)
只需boolean isUpdated
作为您的实例变量,然后更新boolean
中的if condition
。
在打印语句之前,只需检查布尔值是真还是假。
public class CarSpeed{
private boolean slow;
private boolean fast;
public CarSpeed(){
slow = false;
fast = false;
}
public static void main(String[] args){
.....
.....
}
public void manage()
{
double speed = getSpeedfromVehicle();
if(speed >=0 && speed <= 10 && slow == false)
{
System.out.println("Low Speed mode");
slow = true;
}
else if(speed > 10 && speed < 60 && slow == false && fast == false)
{
System.out.println("Medium Speed Mode");
}
else if(speed >= 60 & fast == false)
{
System.out.println("High Speed Mode");
fast = true;
}
}
}
答案 3 :(得分:0)
使用State枚举变量有条件地更新状态
enum SpeedMode {
LOW, MEDIUM, HIGH
};
private SpeedMode speedMode;
public void manage() {
double speed = getSpeedfromVehicle();
if (speed >= 0 && speed <= 10 && speedMode!=SpeedMode.LOW) {
speedMode=SpeedMode.LOW;
System.out.println("Low Speed mode");
} else if (speed > 10 && speed < 60 && speedMode!=SpeedMode.MEDIUM) {
speedMode=SpeedMode.MEDIUM;
System.out.println("Medium Speed Mode");
} else if (speed >= 60 && speedMode!=SpeedMode.HIGH) {
speedMode=SpeedMode.HIGH;
System.out.println("High Speed Mode");
}
}
答案 4 :(得分:0)
又一个简单的例子:
公共课CarSpeed {
enum Speed {
SLOW("Slow"),MEDIUM("Medium"),FAST("Fast");
String speedString;
Speed(String speedString) {
this.speedString = speedString;
}
static Speed getCurrentSpeed(double currentSpeed) {
if (currentSpeed <= 10)
return SLOW;
else if (currentSpeed >10 && currentSpeed <= 60)
return MEDIUM;
else
return FAST;
}
String getSpeedString() {
return speedString;
}
}
private Speed currentSpeed = Speed.SLOW;
public void manage() {
Speed newSpeed = Speed.getCurrentSpeed(getSpeedfromVehicle());
if (currentSpeed != newSpeed) {
currentSpeed = newSpeed;
System.out.println("It's now going " + currentSpeed.getSpeedString() + "!");
}
}
double speed;
public double getSpeedfromVehicle() {
return speed;
}
public void setSpeedfromVehicle(double speed) {
this.speed = speed;
}
}
答案 5 :(得分:0)
如果你选择其中一种解决方案:
if((speed >=0 && speed <= 10) && state != SpeedState.LOW)
...
else if((speed > 10 && speed < 60) && state != SpeedState.MEDIUM)
...
else if((speed >= 60) && state != SpeedState.HIGH)
...
那么请不要这个代码进行太多的比较。
例如:如果当前状态为LOW
且当前速度为5
,则第一个条件((speed >=0 && speed <= 10) && state != SpeedState.LOW)
将返回false
,但是,因为else if
它还要检查其他条件,但是为了什么?我们已经知道速度必须是LOW
,不需要进行其他检查。
所以这里有一个更好的版本:
public enum SpeedState {
LOW, MEDIUM, HIGH
}
public class Drive {
private SpeedState state;
public void manage() {
double speed = getSpeedfromVehicle();
SpeedState newState = null;
if (speed >= 0 && speed <= 10)
newState = SpeedState.LOW;
else if (speed > 10 && speed < 60)
newState = SpeedState.MEDIUM;
else if (speed >= 60)
newState = SpeedState.HIGH;
if (newState != state) {
state = newState;
System.out.println("State changed to" + state);
}
}
}
答案 6 :(得分:0)
如果您的速度有整数增量,则在枚举对象中有另一个预定义速度范围的解决方案。如果双重类型的速度变化11到10,61到60并且检查最小值作为专用值。
public enum SpeedMode {
LOW(0, 10), MEDIUM(11, 60), HIGH(61, 300);
private final int minSpeed;
private final int maxSpeed;
SpeedMode(int minSpeed, int maxSpeed) {
this.minSpeed = minSpeed;
this.maxSpeed = maxSpeed;
}
public int getMinSpeed() {
return this.minSpeed;
}
public int getMaxSpeed() {
return this.maxSpeed;
}
}
public class SpeedSelector {
private SpeedMode speedMode;
private boolean speedChanged;
public SpeedSelector() {
this.speedMode = SpeedMode.LOW;
this.speedChanged = true;
}
public void change(int speed) {
boolean validSpeed = false;
for (SpeedMode speedMode : SpeedMode.values()) {
if (speedMode.getMinSpeed() <= speed
&& speed <= speedMode.getMaxSpeed()) {
validSpeed = true;
if (this.speedMode != speedMode) {
speedChanged = true;
this.speedMode = speedMode;
break;
}
}
}
if (!validSpeed)
throw new IllegalArgumentException("Invalid speed range");
}
public SpeedMode getSpeedMode() {
return speedMode;
}
@Override
public String toString() {
if (speedChanged) {
speedChanged = false;
return "Speed changed to " + speedMode.name();
} else
return "";
}
}
public class TestClass {
public static void main(String[] args) {
SpeedSelector speedSelector = new SpeedSelector();
System.out.println(speedSelector);
speedSelector.change(23);
System.out.println(speedSelector);
speedSelector.change(25);
System.out.println(speedSelector);
speedSelector.change(100);
System.out.println(speedSelector);
speedSelector.change(150);
System.out.println(speedSelector);
speedSelector.change(10);
System.out.println(speedSelector);
}
}