Java中具有对象状态的有限状态机
我正在java类中实现一个有限状态机。我找不到状态和事件作为它们自己对象的另一个例子(可能有原因吧?),我对我的解决方案不太确信,特别是因为我必须将状态分配给FSM(实际的管理器),然后将FSM分配给状态(通知状态更改)。以下是状态管理器的代码,我为其分配了一个状态,如果要求,我会将其吐出来:Java中具有对象状态的有限状态机,java,oop,fsm,state-machine,Java,Oop,Fsm,State Machine,我正在java类中实现一个有限状态机。我找不到状态和事件作为它们自己对象的另一个例子(可能有原因吧?),我对我的解决方案不太确信,特别是因为我必须将状态分配给FSM(实际的管理器),然后将FSM分配给状态(通知状态更改)。以下是状态管理器的代码,我为其分配了一个状态,如果要求,我会将其吐出来: public class FSM { public void setCurrentState(FSMState newCurrentState) { this.currentSt
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);
}
}
公共类FSMState实现EventListener{
私营金融市场管理金融市场;
私有地图转换;
公共FSM状态(FSM管理FSM){
this.transitions=newhashmap();
this.managingFSM=managingFSM;
}
public void addEventTransition(事件事件,FSMState outputState){
转换.put(事件、输出状态);
event.registerListener(此);
}
@凌驾
发生公共无效事件(事件e){
FSMState newState=transitions.get(e);
此.managengfsm.setCurrentState(newState);
}
}
有没有一种类似的解决方案,使州政府不必通知管理者?我想说,您的实现需要做很多更改。首先,您可能希望在创建FSM本身之前创建状态及其转换。我将创建一个单独的类来管理名为FSMManager的初始化和设置 首先将FSMState更改为:
public class FSMState {
private Map<Event,FSMState> transitions;
public FSMState() {
this.transitions = new HashMap<Event, FSMState>();
}
public void addEventTransition(Event event, FSMState outputState){
transitions.put(event, outputState);
}
public FSMState transition(Event e) {
if(transitions.containsKey(e)) {
return transitions.get(e);
}
else {
System.out.println("No transition found");
return this;
}
}
}
最后添加管理器以初始化所有内容:
public class FSMManager {
private static final NUM_STATES = 5;
public static void main(String[] args) {
FSMState[] states = new FSMState[NUM_STATES];
for(FSMState state : states) {
state = new FSMState();
}
// Then add all the state transitions to all the states
states[0].addEventTransition(event1, states[1]);
states[1].addEventTransition(event1, states[2]);
states[1].addEventTransition(event2, states[4]);
// etc, etc
//Finally, create the FSM
FSM fsm = new FSM(state[0]);
//You will also have to register the FSM to listen for all the events
event1.registerListener(fsm);
event2.registerListener(fsm);
...
}
}
我不知道你从哪里得到所有的事件,也不知道它们是如何被触发的,但是上面的模式是一个很好的遵循模式。这样,当触发事件时,它将仅应用于当前状态。同一事件将在不同的状态下产生不同的转换,就像在状态机中一样
此解决方案应该会有所帮助,但它并不完美,因为我不知道您是如何做到这一点的,因此,如果您有任何问题/进一步的问题,请发表意见,我将尝试改进我的答案。这看起来很容易出现错误。何时将事件转换添加到FSM状态?因为按照您现在的操作方式,当事件发生时,它将在其注册的任何FSMState中触发(无论当前状态如何)并更改当前状态。我猜您只希望触发当前状态的事件,以便获得正确的转换。
public class FSMManager {
private static final NUM_STATES = 5;
public static void main(String[] args) {
FSMState[] states = new FSMState[NUM_STATES];
for(FSMState state : states) {
state = new FSMState();
}
// Then add all the state transitions to all the states
states[0].addEventTransition(event1, states[1]);
states[1].addEventTransition(event1, states[2]);
states[1].addEventTransition(event2, states[4]);
// etc, etc
//Finally, create the FSM
FSM fsm = new FSM(state[0]);
//You will also have to register the FSM to listen for all the events
event1.registerListener(fsm);
event2.registerListener(fsm);
...
}
}