根据状态机模式实现的代码不起作用

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();
}