2011-04-26 88 views
15

我目前在學習java,想知道如何以OO方式控制狀態。我實施了一個龐應用程序。如果我想要多種狀態,如遊戲和菜單,並且每個狀態都必須執行啓動,停止和運行,我將如何實現這一點以及如何在這些狀態之間切換。如何在java中創建一個簡單的狀態機

我知道我可以簡單地拋出一個大的switch語句,但實現它的最佳方式是什麼?

我希望能夠在遊戲狀態中切換到菜單狀態,反之亦然。

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Pong extends Applet implements Runnable, KeyListener{ 

    public void start() 
    { 
     setSize(screen); 
     setFocusable(true); 
     Thread th = new Thread (this); 
     th.start(); 
    } 

    public void stop() 
    { 
    } 
    //Etc.. 
} 

回答

29

用戶可以模擬一個基本的FSM(有限狀態機)採用枚舉:

public enum State { 

    ONE { 
     @Override 
     public Set<State> possibleFollowUps() { 
      return EnumSet.of(TWO, THREE); 
     } 
    }, 

    TWO { 
     @Override 
     public Set<State> possibleFollowUps() { 
      return EnumSet.of(THREE); 
     } 
    }, 

    THREE // final state 

    ; 
    public Set<State> possibleFollowUps() { 
     return EnumSet.noneOf(State.class); 
    } 

} 

雖然代碼來生成,這將是非常詳細的,如果事情變得更加複雜,漂亮的部分是,你獲得編譯時安全性,線程安全性和高性能。

+1

注意:當在特定的枚舉中重寫方法時,它們的類是不一樣的。 (在這種情況下,THREE.getClass()是狀態,而TWO.getClass()可以是狀態$ 2) – Asaf 2011-11-23 10:52:39

+1

這段代碼啓發你的艱難過程,尤其是在java中。謝謝。 – Trying 2013-07-03 14:20:45

+0

@Sean:注意到Asaf的評論,我想知道,如果你會發現任何不利的情況,將構造函數中可能的後續狀態傳遞給不同的狀態而不是覆蓋的方法? (比如'ONE(EnumSet.of(TWO,THREE)),TWO(EnumSet.of(THREE))'...... – 2013-07-17 12:34:53

相關問題