開門、關門、運行、停止。好,我們就用程序來實現一下電梯的動作,先看類圖設
計:
package StateP; public interface ILift { //電梯的4個狀態 public final static int OPENING_STATE = 1; //敞門狀態 public final static int CLOSING_STATE = 2; //閉門狀態 public final static int RUNNING_STATE = 3; //運行狀態 public final static int STOPPING_STATE = 4; //停止狀態 public void setState(int state); //首先電梯門開啓動作 public void open(); //電梯門可以開啓,那當然也就有關閉了 public void close(); //電梯要能上能下 public void run(); //電梯還要能停下來 public void stop(); }
package StateP; public class Lift implements ILift{ private int state; public void setState(int state) { this.state = state; } //電梯門關閉 public void close() { switch(this.state){ case OPENING_STATE: //可以關門,同時修改電梯狀態 this.closeWithoutLogic(); this.setState(CLOSING_STATE); break; case CLOSING_STATE: //電梯是關門狀態,則什麼都不做 //do nothing; break; case RUNNING_STATE: //正在運行,門本來就是關閉的,也什麼都不做 //do nothing; break; case STOPPING_STATE: //停止狀態,門也是關閉的,什麼也不做 //do nothing; break; } } //電梯門開啓 public void open() { //電梯在什麼狀態才能開啓 switch(this.state){ case OPENING_STATE: //閉門狀態,什麼都不做 //do nothing; break; case CLOSING_STATE: //閉門狀態,則可以開啓 this.openWithoutLogic(); this.setState(OPENING_STATE); break; case RUNNING_STATE: //運行狀態,則不能開門,什麼都不做 //do nothing; break; case STOPPING_STATE: //停止狀態,當然要開門了 this.openWithoutLogic(); this.setState(OPENING_STATE); break; } } //電梯開始運行起來 public void run() { switch(this.state){ case OPENING_STATE: //敞門狀態,什麼都不做 //do nothing; break; case CLOSING_STATE: //閉門狀態,則可以運行 this.runWithoutLogic(); this.setState(RUNNING_STATE); break; case RUNNING_STATE: //運行狀態,則什麼都不做 //do nothing; break; case STOPPING_STATE: //停止狀態,可以運行 this.runWithoutLogic(); this.setState(RUNNING_STATE); } } //電梯停止 public void stop() { switch(this.state){ case OPENING_STATE: //敞門狀態,要先停下來的,什麼都不做 //do nothing; break; case CLOSING_STATE: //閉門狀態,則當然可以停止了 this.stopWithoutLogic(); this.setState(CLOSING_STATE); break; case RUNNING_STATE: //運行狀態,有運行當然那也就有停止了 this.stopWithoutLogic(); this.setState(CLOSING_STATE); break; case STOPPING_STATE: //停止狀態,什麼都不做 //do nothing; break; } } private void closeWithoutLogic(){ System.out.println("電梯門關閉..."); } //純粹的電梯開門,不考慮任何條件 private void openWithoutLogic(){ System.out.println("電梯門開啓..."); } //純粹的運行,不考慮其他條件 private void runWithoutLogic(){ System.out.println("電梯上下運行起來..."); } //單純的停止,不考慮其他條件 private void stopWithoutLogic(){ System.out.println("電梯停止了..."); } }
package StateP; public class Client { public static void main(String[] args) { // ILift lift = new Lift(); ////首先是電梯門開啓,人進去 // lift.open(); ////然後電梯門關閉 // lift.close(); ////再然後,電梯運行起來,向上或者向下 // lift.run(); ////最後到達目的地,電梯停下來 // lift.stop(); ILift lift = new Lift(); //電梯的初始條件應該是停止狀態 lift.setState(ILift.STOPPING_STATE); //首先是電梯門開啓,人進去 lift.open(); //然後電梯門關閉 lift.close(); //再然後,電梯運行起來,向上或者向下 lift.run(); //最後到達目的地,電梯停下來 lift.stop(); } }