qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          一個Java狀態機樣例的代碼

           在UML當中有狀態機視圖,這個狀態機可以用于自動售貨機,自動售票機等等場景,下面是用java代碼模擬的一個狀態機:
            1.狀態機接口
          package stateMachine;
          /**
          * 狀態機接口
          * @author seacean
          * @date 2013-8-29
          */
          public interface State {
          /**
          * 投入硬幣
          */
          void insertQuarter();
          /**
          * 根據搖動情況,處理搖動結果,返回處理結果,釋放糖果
          */
          void ejectQuarter();
          /**
          * 轉動搖柄
          */
          void turnCrank();
          /**
          * 機器放出糖果,處理機器內部狀態,返回初始可投幣狀態
          */
          void dispense();
          }
           2.帶有狀態機的機器
          package stateMachine;
          /**
          * 機器類,包含多種狀態,處理流程
          * @author seacean
          * @date 2013-8-29
          */
          public class Machine {
          //機器本身包含所有的狀態機
          private State soldOutState;
          private State noQuarterState;
          private State hasQuarterState;
          private State soldState;
          private State state; //機器的當前狀態
          private int count = 0;//機器中當前糖果的數量
          /**
          * 初始化機器,引入所有的狀態機,初始化糖果數量,初始化機器狀態
          * @param count
          */
          public Machine(int count) {
          this.soldOutState = new SoldOutState(this);
          this.noQuarterState = new NoQuarterState(this);
          this.hasQuarterState = new HasQuarterState(this);
          this.soldState = new SoldState(this);
          this.count = count;
          if (this.count > 0) {
          this.state = noQuarterState;
          }
          }
          /**
          * 釋放糖果時的內部處理程序
          */
          public void releaseBall() {
          System.out.println("a gumball comes rolling out the solt...");
          if (count > 0) {
          count -= 1;
          }
          }
          public void insertQuerter() {
          state.insertQuarter();//加入硬幣
          }
          public void ejectQuarter() {
          state.ejectQuarter();
          }
          public void turnCrank() {
          state.turnCrank();
          state.dispense();
          }
          public State getSoldOutState() {
          return soldOutState;
          }
          public State getNoQuarterState() {
          return noQuarterState;
          }
          public State getHasQuarterState() {
          return hasQuarterState;
          }
          public State getSoldState() {
          return soldState;
          }
          public State getState() {
          return state;
          }
          public int getCount() {
          return count;
          }
          public void setState(State state) {
          this.state = state;
          }
          }
            3.下面是狀態機的一些實現類
          package stateMachine;
          /**
          * 機器處于沒有投硬幣的狀態
          * @author seacean
          * @date 2013-8-29
          */
          public class NoQuarterState implements State {
          private Machine machine;
          public NoQuarterState(Machine machine) {
          this.machine = machine;
          }
          @Override
          public void insertQuarter() {
          System.out.println("please insert a quarter!");
          machine.setState(machine.getHasQuarterState());
          }
          @Override
          public void ejectQuarter() {
          System.out.println("please insert a quarter!");
          }
          @Override
          public void turnCrank() {
          System.out.println("please insert a quarter!");
          }
          @Override
          public void dispense() {
          System.out.println("please insert a quarter!");
          }
          }
          package stateMachine;
          /**
          * 機器處于有硬幣,有糖果,沒有搖動的狀態
          * @author seacean
          * @date 2013-8-29
          */
          public class HasQuarterState implements State {
          private Machine machine;
          public HasQuarterState(Machine machine){
          this.machine=machine;
          }
          @Override
          public void insertQuarter() {
          System.out.println("You can not insert another quarter!");
          }
          @Override
          public void ejectQuarter() {
          System.out.println("Quarter returned!");
          machine.setState(machine.getNoQuarterState());
          }
          @Override
          public void turnCrank() {
          System.out.println("You turned ... ");
          machine.setState(machine.getSoldState());
          }
          @Override
          public void dispense() {
          System.out.println("No gumball dispensed!");
          }
          }
          package stateMachine;
          /**
          * 機器正在出售糖果的狀態
          *
          * @author seacean
          * @date 2013-8-29
          */
          public class SoldState implements State {
          private Machine machine;
          public SoldState(Machine machine) {
          this.machine = machine;
          }
          @Override
          public void insertQuarter() {
          System.out.println("please wait,we are already giving you a gumball!");
          }
          @Override
          public void ejectQuarter() {
          System.out.println("Sorry, you have turned the crank!");
          }
          @Override
          public void turnCrank() {
          System.out.println("Turning twice does not get you another gumball!");
          }
          @Override
          public void dispense() {
          machine.releaseBall();
          if (machine.getCount() > 0) {
          machine.setState(machine.getNoQuarterState());
          } else {
          System.out.println("Out of Gumballs!");
          machine.setState(machine.getSoldOutState());
          }
          }
          }
          package stateMachine;
          /**
          * 機器處于無糖果狀態
          * @author seacean
          * @date 2013-8-29
          */
          public class SoldOutState implements State {
          private Machine machine;
          public SoldOutState(Machine machine) {
          this.machine=machine;
          }
          @Override
          public void insertQuarter() {
          System.out.println("Sorry, there is no gumball in the machine!");
          }
          @Override
          public void ejectQuarter() {
          System.out.println("Sorry, there is no gumball in sold!");
          }
          @Override
          public void turnCrank() {
          System.out.println("Sorry, there is no gumball!Turn is no meaning.");
          machine.setState(machine.getNoQuarterState());
          }
          @Override
          public void dispense() {
          System.out.println("Sorry, there is no gumball!");
          }
          }
          4.下面是測試類
          package stateMachine;
          //測試類
          public class StateMachineTest {
          public static void main(String[] args) {
          Machine machine=new Machine(10);
          for(int i=0;i<11;i++){
          System.out.println(machine);
          machine.insertQuerter();
          machine.turnCrank();
          }
          }
          }

          posted on 2014-07-02 16:37 順其自然EVO 閱讀(296) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 东乡县| 临颍县| 崇仁县| 黄龙县| 云安县| 涟水县| 乌拉特后旗| 广水市| 遂昌县| 成都市| 富蕴县| 乌兰察布市| 公安县| 新龙县| 寿阳县| 高平市| 通州市| 汤原县| 宝清县| 灵丘县| 南宫市| 车险| 临夏市| 改则县| 昭平县| 英德市| 南康市| 丰宁| 郓城县| 临汾市| 崇左市| 怀柔区| 长汀县| 维西| 钟祥市| 林芝县| 翁牛特旗| 娄底市| 鄂尔多斯市| 光山县| 高雄县|