根据状态机模式实现的代码不起作用
Code implemented according statemachine pattern does not work
我正在尝试解决状态图练习,但仍然不明白为什么我的代码不起作用。
我已经检查了所有可能的代码考试,但一直不明白为什么我的版本没有通过 tests.May 是我发现了一些不容易发现的小错误。下面我提供我的代码,测试样本和我的语法。
https://drive.google.com/open?id=1SQAiwUBo1OwI-QKksxciDS7dEdKGS6dn [1]
https://drive.google.com/open?id=1JhdScK7t1XmNc3eLT7hSGpwyYDLWl46T[2]
public class GarageDoor {
private Motor motor;
private DoorState currentState;
public GarageDoor() {
this.setState(new Closed(this));
//currentState=new Closed(this);
}
public void openDoor(){
currentState.openDoor();
}
public void stopper(){
currentState.stopper();
}
public void closeDoor(){
currentState.closeDoor();
}
public Motor getMotor(){
return this.motor;
}
private void setState(DoorState ds){
this.currentState=ds;
}
public abstract class DoorState{
public abstract void openDoor();
public abstract void closeDoor();
public abstract void stopper();
}
public class Closed extends DoorState{
private GarageDoor garageDoor;
public Closed(GarageDoor garageDoor){
this.garageDoor=garageDoor;
}
@Override
public void openDoor() {
garageDoor.setState(new Opening(garageDoor));
garageDoor.getMotor().upwards();
}
@Override
public void closeDoor() {
throw new IllegalStateException();
}
@Override
public void stopper() {
throw new IllegalStateException();
}
}
}
实际上我无法执行main()
public static void main(String[] args){
//Motor motor=new Motor();
GarageDoor gd=new GarageDoor();
gd.openDoor();
}
我没看到你在任何地方设置 motor
,所以在 Closed.openDoor
中,当你调用 garageDoor.getMotor().upwards()
时,你会得到一个 NullPointerException
。
此外,我看到您将 GarageDoor
传递到 Closed
状态,然后调用 garageDoor.setState
。考虑从每个 DoorState
方法返回下一个状态。
1) 尝试让 GarageDoor 扩展 DoorState,似乎覆盖了相同的方法。
2) 在您的代码中,您实际上没有在 GarageDoor
class.
中创建电机
您需要启动电机,例如:
public GarageDoor() {
this.motor = new Motor();
}
我正在尝试解决状态图练习,但仍然不明白为什么我的代码不起作用。
我已经检查了所有可能的代码考试,但一直不明白为什么我的版本没有通过 tests.May 是我发现了一些不容易发现的小错误。下面我提供我的代码,测试样本和我的语法。
https://drive.google.com/open?id=1SQAiwUBo1OwI-QKksxciDS7dEdKGS6dn [1] https://drive.google.com/open?id=1JhdScK7t1XmNc3eLT7hSGpwyYDLWl46T[2]
public class GarageDoor {
private Motor motor;
private DoorState currentState;
public GarageDoor() {
this.setState(new Closed(this));
//currentState=new Closed(this);
}
public void openDoor(){
currentState.openDoor();
}
public void stopper(){
currentState.stopper();
}
public void closeDoor(){
currentState.closeDoor();
}
public Motor getMotor(){
return this.motor;
}
private void setState(DoorState ds){
this.currentState=ds;
}
public abstract class DoorState{
public abstract void openDoor();
public abstract void closeDoor();
public abstract void stopper();
}
public class Closed extends DoorState{
private GarageDoor garageDoor;
public Closed(GarageDoor garageDoor){
this.garageDoor=garageDoor;
}
@Override
public void openDoor() {
garageDoor.setState(new Opening(garageDoor));
garageDoor.getMotor().upwards();
}
@Override
public void closeDoor() {
throw new IllegalStateException();
}
@Override
public void stopper() {
throw new IllegalStateException();
}
}
}
实际上我无法执行main()
public static void main(String[] args){
//Motor motor=new Motor();
GarageDoor gd=new GarageDoor();
gd.openDoor();
}
我没看到你在任何地方设置 motor
,所以在 Closed.openDoor
中,当你调用 garageDoor.getMotor().upwards()
时,你会得到一个 NullPointerException
。
此外,我看到您将 GarageDoor
传递到 Closed
状态,然后调用 garageDoor.setState
。考虑从每个 DoorState
方法返回下一个状态。
1) 尝试让 GarageDoor 扩展 DoorState,似乎覆盖了相同的方法。
2) 在您的代码中,您实际上没有在 GarageDoor
class.
您需要启动电机,例如:
public GarageDoor() {
this.motor = new Motor();
}