18. Using Extended State
假设我们需要创建一个状态机来跟踪用户在键盘上按下按键的次数,然后在按下按键1000次时终止。 可能的,但一个真正天真的解决方案是为每1000个按键创建一个新状态。 如果组合更糟,你可能会突然拥有天文数量很多的状态,这些状态自然不太实际。
这是扩展状态变量通过不需要添加更多状态来驱动状态机更改而进入救援的地方,而是可以在转换期间完成简单的变量更改。
StateMachine有一个方法getExtendedState(),它返回一个接口ExtendedState,它可以访问扩展状态变量。 在从动作或转换回调期间,您可以直接通过状态机或StateContext访问变量。
public Action<String, String> myVariableAction() {
return new Action<String, String>() {
@Override
public void execute(StateContext<String, String> context) {
context.getExtendedState()
.getVariables().put("mykey", "myvalue");
}
};
}
如果需要通知扩展状态变量更改,则有两个选项; 使用StateMachineListener并监听extendedStateChanged(key,value)回调:
public class ExtendedStateVariableListener
extends StateMachineListenerAdapter<String, String> {
@Override
public void extendedStateChanged(Object key, Object value) {
// do something with changed variable
}
}
或者为OnExtendedStateChanged实现一个Spring Application上下文侦听器。 当然,正如第21章所述,侦听状态机事件也可以侦听所有的StateMachineEvent事件。
public class ExtendedStateVariableEventListener
implements ApplicationListener<OnExtendedStateChanged> {
@Override
public void onApplicationEvent(OnExtendedStateChanged event) {
// do something with changed variable
}
}