1

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

州がマネージャーに通知する必要がないように、一種の同様のソリューションを使用する方法はありますか?

4

1 に答える 1

0

あなたの実装にはかなりの変更が必要だと思います。まず、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);
         ...


    }

}

Eventsどこからすべてを取得しているのか、実際にどのように解雇されているのかはわかりませんが、上記のパターンは従うのに適しています. このようにして、イベントが発生すると、現在の状態にのみ適用されます。ステート マシンの場合と同様に、同じイベントが異なる状態で異なる遷移を生成します。

この解決策は役立つはずですが、あなたがこれをどのように行っているのか正確にはわからないため、完璧ではありません。

于 2014-05-22T11:22:25.967 に答える