fork download
  1. // -------- State Interface --------
  2. interface State {
  3. void insertCoin();
  4. void turnCrank();
  5. }
  6.  
  7. // -------- No Coin State --------
  8. class NoCoinState implements State {
  9. GumballMachine machine;
  10.  
  11. NoCoinState(GumballMachine m) { this.machine = m; }
  12.  
  13. public void insertCoin() {
  14. System.out.println("Coin inserted.");
  15. machine.setState(machine.hasCoinState);
  16. }
  17.  
  18. public void turnCrank() {
  19. System.out.println("Insert coin first.");
  20. }
  21. }
  22.  
  23. // -------- Has Coin State --------
  24. class HasCoinState implements State {
  25. GumballMachine machine;
  26.  
  27. HasCoinState(GumballMachine m) { this.machine = m; }
  28.  
  29. public void insertCoin() {
  30. System.out.println("Coin already inserted.");
  31. }
  32.  
  33. public void turnCrank() {
  34. System.out.println("Crank turned. Dispensing...");
  35. machine.releaseBall();
  36. if (machine.count > 0)
  37. machine.setState(machine.noCoinState);
  38. else
  39. machine.setState(machine.soldOutState);
  40. }
  41. }
  42.  
  43. // -------- Sold Out State --------
  44. class SoldOutState implements State {
  45. GumballMachine machine;
  46.  
  47. SoldOutState(GumballMachine m) { this.machine = m; }
  48.  
  49. public void insertCoin() {
  50. System.out.println("Machine is sold out.");
  51. }
  52.  
  53. public void turnCrank() {
  54. System.out.println("Nothing happens, sold out.");
  55. }
  56. }
  57.  
  58. // -------- Gumball Machine --------
  59. class GumballMachine {
  60. State noCoinState;
  61. State hasCoinState;
  62. State soldOutState;
  63. State state;
  64.  
  65. int count = 0;
  66.  
  67. public GumballMachine(int gumballs) {
  68. noCoinState = new NoCoinState(this);
  69. hasCoinState = new HasCoinState(this);
  70. soldOutState = new SoldOutState(this);
  71.  
  72. count = gumballs;
  73. state = (count > 0) ? noCoinState : soldOutState;
  74. }
  75.  
  76. void setState(State s) { state = s; }
  77.  
  78. void releaseBall() {
  79. System.out.println("A gumball comes out...");
  80. if (count > 0) count--;
  81. }
  82.  
  83. // Public API
  84. void insertCoin() { state.insertCoin(); }
  85. void turnCrank() { state.turnCrank(); }
  86. }
  87.  
  88. // -------- Test --------
  89. public class Main {
  90. public static void main(String[] args) {
  91. GumballMachine gm = new GumballMachine(2);
  92.  
  93. gm.insertCoin();
  94. gm.turnCrank();
  95.  
  96. gm.insertCoin();
  97. gm.turnCrank();
  98.  
  99. gm.insertCoin(); // Should say sold out
  100. gm.turnCrank();
  101. }
  102. }
Success #stdin #stdout 0.08s 54608KB
stdin
Standard input is empty
stdout
Coin inserted.
Crank turned. Dispensing...
A gumball comes out...
Coin inserted.
Crank turned. Dispensing...
A gumball comes out...
Machine is sold out.
Nothing happens, sold out.