我使用State Pattern将Car变成了某种状态机。请注意,否switch
或if-then-else
语句用于状态选择。
在这种情况下,所有状态都是内部类,但可以通过其他方式实现。
每个状态都包含可以更改为的有效状态。
如果可能出现多个状态,则提示用户输入下一个状态;如果仅可能出现一个状态,则提示用户进行确认。
您可以对其进行编译并运行以对其进行测试。
我使用了图形对话框,因为在Eclipse中以交互方式运行它更容易。
UML图是从这里获取的。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;
public class Car {
private State state;
public static final int ST_OFF=0;
public static final int ST_IDDLE=1;
public static final int ST_DRIVE=2;
public static final int ST_REVERSE=3;
Map<Integer,State> states=new HashMap<Integer,State>();
public Car(){
this.states.put(Car.ST_OFF, new Off());
this.states.put(Car.ST_IDDLE, new Idle());
this.states.put(Car.ST_DRIVE, new Drive());
this.states.put(Car.ST_REVERSE, new Reverse());
this.state=this.states.get(Car.ST_OFF);
}
private abstract class State{
protected List<Integer> nextStates = new ArrayList<Integer>();
public abstract void handle();
public abstract void change();
protected State promptForState(String prompt){
State s = state;
String word = JOptionPane.showInputDialog(prompt);
int ch = -1;
try {
ch = Integer.parseInt(word);
}catch (NumberFormatException e) {
}
if (this.nextStates.contains(ch)){
s=states.get(ch);
} else {
System.out.println("Invalid option");
}
return s;
}
}
private class Off extends State{
public Off(){
super.nextStates.add(Car.ST_IDDLE);
}
public void handle() { System.out.println("Stopped");}
public void change() {
state = this.promptForState("Stopped, iddle="+Car.ST_IDDLE+": ");
}
}
private class Idle extends State{
private List<Integer> nextStates = new ArrayList<Integer>();
public Idle(){
super.nextStates.add(Car.ST_DRIVE);
super.nextStates.add(Car.ST_REVERSE);
super.nextStates.add(Car.ST_OFF);
}
public void handle() { System.out.println("Idling");}
public void change() {
state=this.promptForState("Idling, enter 0=off 2=drive 3=reverse: ");
}
}
private class Drive extends State{
private List<Integer> nextStates = new ArrayList<Integer>();
public Drive(){
super.nextStates.add(Car.ST_IDDLE);
}
public void handle() {System.out.println("Driving");}
public void change() {
state=this.promptForState("Idling, enter 1=iddle: ");
}
}
private class Reverse extends State{
private List<Integer> nextStates = new ArrayList<Integer>();
public Reverse(){
super.nextStates.add(Car.ST_IDDLE);
}
public void handle() {System.out.println("Reversing");}
public void change() {
state = this.promptForState("Reversing, enter 1=iddle: ");
}
}
public void request(){
this.state.handle();
}
public void changeState(){
this.state.change();
}
public static void main (String args[]){
Car c = new Car();
c.request(); //car is stopped
c.changeState();
c.request(); // car is iddling
c.changeState(); // prompts for next state
c.request();
c.changeState();
c.request();
c.changeState();
c.request();
}
}