gpt4 book ai didi

java - Java 中具有对象状态的 FSM

转载 作者:行者123 更新时间:2023-12-01 04:26:44 25 4
gpt4 key购买 nike

我正在 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);
}
}

有没有一种方法,通过一种类似的解决方案,使状态不必通知经理?

最佳答案

我想说你的实现需要相当多的改变。首先,您可能希望在创建 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;
}
}

}

然后将 FSM 类更改为如下所示:

public class FSM implements EventListener {

private FSMState currentState;

public FSM(FSMState startState) {
currentState = startState;
}

public FSMState getCurrentState() {
if (this.currentState == null)
System.out.println("No current state");
return this.currentState;
}

@Override
public void eventOccured(Event e) {
currentState = currentState.transition(e);
}
}

最后添加管理器来初始化所有内容:

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);
...


}

}

我不知道您从哪里获取所有事件以及它们实际上是如何触发的,但上面的模式是一个很好的遵循模式。这样,当事件被触发时,它只会应用于当前状态。相同的事件将在不同的状态下产生不同的转换,就像在状态机中一样。

这个解决方案应该有所帮助,但它并不完美,因为我不知道你到底是如何做到这一点的,所以如果你有任何问题/进一步的问题评论,我会尽力改进我的答案。

关于java - Java 中具有对象状态的 FSM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18434582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com