测试类
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) {
}
}