用状态设计模式实现一个简单的数字字符串识别器

186 阅读1分钟

测试类

public class Client {
    public static void main(String[] args) {
        StateMachine stateMachine = new StateMachine();
        String s = "123";
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            stateMachine.next(c);
        }
        if (State0.class.equals(stateMachine.getState().getClass())) {
            System.out.println("空串");
        }
        if (State1.class.equals(stateMachine.getState().getClass())) {
            System.out.println("整数");
        }
        if (State2.class.equals(stateMachine.getState().getClass())) {
            System.out.println("小数");
        }
        if (State3.class.equals(stateMachine.getState().getClass())) {
            System.out.println("无效字符串");
        }
    }
}

状态机管理器类


public class StateMachine {
    private State state = new State0(this);

    public StateMachine() {

    }

    public StateMachine(State state) {
        setState(state);
    }

    public void setState(State state) {
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void next(char input) {
        state.next(input);
    }
}

状态机抽象类

public abstract class State {

    protected StateMachine stateMachine;

    public State() {
    }

    public State(StateMachine stateMachine) {
        setStateMachine(stateMachine);
    }

    public void setStateMachine(StateMachine stateMachine) {
        this.stateMachine = stateMachine;
    }

    abstract void next(char input);
}

四个具体状态的类

分别是初始状态,最终是整数的状态,最终是小数的状态,最终啥也不是的状态。

public class State0 extends State {

    public State0() {
        super();

    }

    public State0(StateMachine stateMachine) {
        this.setStateMachine(stateMachine);
    }

    @Override
    void next(char input) {
        if (Character.isDigit(input)) {
            stateMachine.setState(new State1(stateMachine));
        }else{
            stateMachine.setState(new State3(stateMachine));
        }
    }
}
public class State1 extends State {

    public State1() {

    }
    public State1(StateMachine stateMachine) {
        this.stateMachine = stateMachine;
    }

    @Override
    void next(char input) {
        if (Character.isDigit(input)) {
            stateMachine.setState(new State1(stateMachine));
        }else if (input == '.') {
            stateMachine.setState(new State2(stateMachine));
        }else{
            stateMachine.setState(new State3(stateMachine));
        }
    }
}
public class State2 extends State {


    private StateMachine stateMachine;

    public State2() {

    }
    public State2(StateMachine stateMachine) {
        this.stateMachine = stateMachine;
    }

    @Override
    void next(char input) {
        if (Character.isDigit(input)) {
            stateMachine.setState(new State2(stateMachine));
        }else{
            stateMachine.setState(new State3(stateMachine));
        }
    }
}
public class State3 extends State {


    private StateMachine stateMachine;

    public State3() {

    }
    public State3(StateMachine stateMachine) {
        this.stateMachine = stateMachine;
    }

    @Override
    void next(char input) {
        
    }
}