2011-04-26 35 views
15

actualmente estoy aprendiendo Java y me gustaría saber cómo controlar el estado de una manera OO. Implementé una aplicación Pong. Si quería varios estados como el juego y el menú, y cada uno de estos estados tenía que ejecutar el inicio, detener y ejecutar cómo iba a lograr esto y cómo iba a cambiar entre estos estados.Cómo crear una máquina de estados simple en Java

sé yo podría simplemente tirar en una sentencia switch grande, pero ¿cuál es la mejor manera de implementar esto?

Quiero ser capaz de cambiar al estado en el menú versa estado de juego y el vicio.

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.. 
} 

Respuesta

29

Se puede simular un FSM básica (máquina de estados finitos) utilizando las enumeraciones:

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

} 

Mientras que el código para generar esto será muy prolijo si las cosas se complican más, la parte interesante es que se obtener seguridad en tiempo de compilación, seguridad de subprocesos y alto rendimiento.

+1

NOTA: al redefinir los métodos específicos en las enumeraciones, su clase no es lo mismo. (En este caso THREE.getClass() es Estado, y TWO.getClass() podría ser Estado $ 2) Este código – Asaf

+1

ilumina su proceso difícil, especialmente en Java. Gracias. – Trying

+0

@Sean: Al notar el comentario de Asaf, me gustaría saber si usted vería alguna desventaja al pasar los posibles estados de seguimiento en un constructor a los diferentes estados en lugar de a los métodos sobrescritos. (Como 'UN (EnumSet.of (DOS, TRES)), DOS (EnumSet.of (TRES))' ... –

Cuestiones relacionadas