public class StatusTest {
   public int a;
   public int b;
   public int c;
   public int d;
}
class A extends StatusTest{}
class B extends StatusTest{}
class C extends StatusTest{}
class D extends StatusTest{}

解决方案 »

  1.   

       1. //我们先创建一个State接口,所有的状态都必须实现这个接口  
       2. public interface State {  
       3.     public void insertQuarter();  
       4.     public void ejectQuarter();  
       5.     public void turnCrank();  
       6.     public void dispense();  
       7. }  
       8. //实现我们的状态类  
       9. public class NoQuarterState implements State {  //先实现State接口  
      10.     GumballMachine gumballMachine;  
      11.     //通过构造器得到糖果机的引用  
      12.     public NoQuarterState(GumballMachine gumballMachine) {  
      13.     this.gumballMachine = gumballMachine;  
      14.     }  
      15.     //还是那几个方法  
      16.     public void insertQuarter() {  
      17.         System.out.println("You inserted a quarter");  
      18.         //你马上会看到这里如何工作的  
      19.         gumballMachine.setState(gumballMachine.getHasQuarterState());  
      20.     }  
      21.     public void ejectQuarter() {  
      22.         System.out.println("You haven't inserted a quarter");  
      23.     }  
      24.     public void turnCrank() {  
      25.         System.out.println("You turned, but there's no quarter");  
      26.      }  
      27.     public void dispense() {  
      28.         System.out.println("You need to pay first");  
      29.     }   
      30.     public String toString() {  
      31.         return "waiting for quarter";  
      32.     }  
      33. }  
      34. //完整的糖果机类  
      35. public class GumballMachine {  
      36.     //所有的状态都在这里  
      37.     State soldOutState;  
      38.     State noQuarterState;  
      39.     State hasQuarterState;  
      40.     State soldState;  
      41.     State winnerState;//十次抽中一次的游戏,新的状态  
      42.     //以及实例变量state  
      43.     State state = soldOutState;  
      44.     int count = 0;//记录糖果数量  
      45.     public GumballMachine(int numberGumballs) {       
      46.         soldOutState = new SoldOutState(this);  //每一种状态也都创建一个状态实例  
      47.         noQuarterState = new NoQuarterState(this);  
      48.         hasQuarterState = new HasQuarterState(this);  
      49.         soldState = new SoldState(this);  
      50.         this.count = numberGumballs;  
      51.         if (numberGumballs > 0) {    //如果超过0颗糖果,状态设为noQuarterState  
      52.             state = noQuarterState;  
      53.         }   
      54.     }  
      55.     //委托给当前状态  
      56.     public void insertQuarter() {  
      57.         state.insertQuarter();  
      58.     }  
      59.     public void ejectQuarter() {  
      60.         state.ejectQuarter();  
      61.     }  
      62.     //dispense()是一个内部动作方法,用户不可以直接要求机器发放糖果  
      63.     public void turnCrank() {  
      64.         state.turnCrank();  
      65.         state.dispense();  
      66.     }  
      67.     //允许其他的对象将机器状态转换到不同的状态  
      68.     void setState(State state) {  
      69.         this.state = state;  
      70.     }  
      71.     //辅助方法释放出糖果,并将count实例变量值减1  
      72.     void releaseBall() {  
      73.         System.out.println("A gumball comes rolling out the slot...");  
      74.         if (count != 0) {  
      75.             count = count - 1;  
      76.         }  
      77.     }  
      78.     int getCount() {  
      79.         return count;  
      80.     }  
      81.     void refill(int count) {  
      82.         this.count = count;  
      83.         state = noQuarterState;  
      84.     }  
      85.     public State getState() {return state;}  
      86.     public State getSoldOutState() {return soldOutState;}  
      87.     public State getNoQuarterState() {return noQuarterState;}  
      88.     public State getHasQuarterState() {return hasQuarterState;}  
      89.     public State getSoldState() {return soldState;}  
      90.     public State getWinnerState() {return winnerState;}  
      91. }  
      92. //现在我们来实现HasQuarterState(有25分钱)和SoldState(售出糖果)方法,糖果售完的方法自己写写,这里就不提供了  
      93. public class HasQuarterState implements State {  
      94.     GumballMachine gumballMachine;  
      95.     //增加一个随机数产生器,产生10%的机会  
      96.     Random randomWinner = new Random(System.currentTimeMillis());  
      97.     public HasQuarterState(GumballMachine gumballMachine) {  
      98.         this.gumballMachine = gumballMachine;  
      99.     }  
     100.     public void insertQuarter() {   //这是一个对当前状态不恰当的动作  
     101.         System.out.println("You can't insert another quarter");  
     102.     }  
     103.     public void ejectQuarter() {    //退钱并转换状态到NoQuarterState  
     104.         System.out.println("Quarter returned");  
     105.         gumballMachine.setState(gumballMachine.getNoQuarterState());  
     106.     }  
     107.     public void turnCrank() {  
     108.         System.out.println("You turned...");  
     109.         int winner = randomWinner.nextInt(10);  
     110.         //决定这个顾客是否赢了  
     111.         if ((winner == 0) && (gumballMachine.getCount() > 1)) {  
     112.             gumballMachine.setState(gumballMachine.getWinnerState());  
     113.         } else {  
     114.             gumballMachine.setState(gumballMachine.getSoldState());  
     115.         }  
     116.     }  
     117.     public void dispense() {    //这是一个对当前状态不恰当的动作  
     118.         System.out.println("No gumball dispensed");  
     119.     }  
     120. }  
     121. public class SoldState implements State {  
     122.     GumballMachine gumballMachine;  
     123.     public SoldState(GumballMachine gumballMachine) {  
     124.         this.gumballMachine = gumballMachine;  
     125.     }      
     126.     //以下3个方法对此状态来说都是不恰当的  
     127.     public void insertQuarter() {  
     128.         System.out.println("Please wait, we're already giving you a gumball");  
     129.     }  
     130.     public void ejectQuarter() {  
     131.         System.out.println("Sorry, you already turned the crank");  
     132.     }  
     133.     public void turnCrank() {  
     134.         System.out.println("Turning twice doesn't get you another gumball!");  
     135.     }  
     136.     //首先让机器发放糖果  
     137.     public void dispense() {  
     138.         gumballMachine.releaseBall();  
     139.         if (gumballMachine.getCount() > 0) {  
     140.             gumballMachine.setState(gumballMachine.getNoQuarterState());  
     141.         } else {  
     142.             System.out.println("Oops, out of gumballs!");  
     143.             gumballMachine.setState(gumballMachine.getSoldOutState());  
     144.         }  
     145.     }  
     146. }  
     147. //我们再来实现WinnerState类  
     148. public class WinnerState implements State {  
     149.     GumballMachine gumballMachine;  
     150.     //下面都跟SoldState方法一样  
     151.     public WinnerState(GumballMachine gumballMachine) {  
     152.         this.gumballMachine = gumballMachine;  
     153.     }  
     154.     public void insertQuarter() {  
     155.         System.out.println("Please wait, we're already giving you a Gumball");  
     156.     }  
     157.     public void ejectQuarter() {  
     158.         System.out.println("Please wait, we're already giving you a Gumball");  
     159.     }  
     160.     public void turnCrank() {  
     161.         System.out.println("Turning again doesn't get you another gumball!");  
     162.     }  
     163.     //我们在这里发放出2颗糖果,然后进入NoQuarterState或SoldState  
     164.     public void dispense() {  
     165.         System.out.println("YOU'RE A WINNER! You get two gumballs for your quarter");  
     166.         gumballMachine.releaseBall();  
     167.         if (gumballMachine.getCount() == 0) {  
     168.             gumballMachine.setState(gumballMachine.getSoldOutState());  
     169.         } else {  
     170.             gumballMachine.releaseBall();  
     171.             if (gumballMachine.getCount() > 0) {  
     172.                 gumballMachine.setState(gumballMachine.getNoQuarterState());  
     173.             } else {  
     174.                 System.out.println("Oops, out of gumballs!");  
     175.                 gumballMachine.setState(gumballMachine.getSoldOutState());  
     176.             }  
     177.         }  
     178.     }  
     179. }  
      

  2.   

    状态模式有时比较if else还难。
      

  3.   

    我觉得你这个
     insertQuarter();  
     ejectQuarter();  
     turnCrank();  
     dispense();  都是动作不是状态,另外状态应该封装在一个context中