【发布时间】:2013-08-28 09:06:16
【问题描述】:
我正在 java 类中实现一个有限状态机。我无法找到另一个将状态和事件作为它们自己的对象的示例(也许这是有原因的?),而且我不太相信我的解决方案,特别是因为我必须为 FSM 分配一个状态(实际管理者)然后将 FSM 分配给状态(以通知状态更改)。这是状态管理器的代码,我为其分配了一个状态,并在被要求时将其吐出:
public class FSM {
public void setCurrentState(FSMState newCurrentState) {
this.currentState = newCurrentState;
}
private FSMState currentState;
public FSMState getCurrentState() {
if (this.currentState == null)
System.out.println("No current state");
return this.currentState;
}
}
这是状态,它使用映射将事件映射到输出状态,并在发生转换时通知 FSM 类:
public class FSMState implements EventListener {
private FSM managingFSM;
private Map<Event,FSMState> transitions;
public FSMState(FSM managingFSM) {
this.transitions = new HashMap<Event, FSMState>();
this.managingFSM = managingFSM;
}
public void addEventTransition(Event event, FSMState outputState){
transitions.put(event, outputState);
event.registerListener(this);
}
@Override
public void eventOccured(Event e) {
FSMState newState = transitions.get(e);
this.managingFSM.setCurrentState(newState);
}
}
有没有办法,用一种类似的解决方案,让国家不必通知经理?
【问题讨论】:
-
这看起来很容易出错。什么时候向 FSMStates 添加事件转换?因为按照您现在所做的方式,当事件发生时,它将在它注册的任何 FSMState 中触发(无论当前状态是什么)并更改当前状态。我猜您只想触发当前状态的事件,以便获得正确的转换。
标签: java oop fsm state-machine