是的,我有点困惑为什么甚至需要一个集合。
对于一个简单的状态机,您可以使用静态整数和 case 语句来执行您的状态机,如下所示:
int STATE1 = 1;
int STATE2 = 2;
int STATE3 = 3;
int STATE4 = 4;
int currentstate = STATE1 ;
int input = nextInput();
while(currentstate != STATE4 ){
switch(input){
case STATE1:
if(input == 'a') currentstate = STATE2;
break;
case STATE2:
if(input == 'b') currentstate = STATE3;
else currentstate = STATE1;
break;
case STATE3:
if(input == 'c') currentstate = STATE4;
else currentstate = STATE1;
}
}
这是一个基本状态机,它将查找任何包含“abc”的字符串。你也可以很容易地扩展它来寻找 ab*c 或任何你想要的东西。
那么如果你想要一个在运行时构建的动态状态机呢?嗯,我也做过这个。这不是太难。我所做的是创建一个带有转换列表的状态类。每个转换都有一个指向下一个状态的指针,以及链接的标准。
因此,例如,STATE1 将具有条件“a”的转换和指向表示 STATE2 的某个对象的指针。代码会检查条件(它可以是一个将 int 作为参数并在匹配时返回 true 或 false 的对象),如果条件匹配,它会将状态指针移动到转换所指向的状态。
代码可能看起来像这样
public void move(int input){
for(transition t : currentState.transitions){
if(t.getCriteria().matches(input)){
currentState = t.getNextState();
break;
}
}
}