Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions assignments/state_pattern/GumballMachine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package assignments.state_pattern;

public class GumballMachine {
private GumballMachineState soldOutState;
private GumballMachineState noQuarterState;
private GumballMachineState hasQuarterState;
private GumballMachineState soldState;
private GumballMachineState winnerState;

private int count = 0;
private GumballMachineState currentState;

public GumballMachine(int numberGumballs) {
soldOutState = new SoldOutState(this);
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
soldState = new SoldState(this);
winnerState = new WinnerState(this);

this.count = numberGumballs;

currentState = (numberGumballs > 0) ? noQuarterState : soldOutState;
}

public void setState(GumballMachineState currentState) {
this.currentState = currentState;
}

public void insertQuarter() {
currentState.insertQuarter();
}

public void ejectQuarter() {
currentState.ejectQuarter();
}

public void turnCrank() {
currentState.turnCrank();
currentState.dispense();
}

public void releaseBall() {
System.out.println("A gumball comes rolling out the slot...");
if (count > 0) {
count = count - 1;
}
}

public int getCount() {
return count;
}

public GumballMachineState getNoQuarterState() {
return noQuarterState;
}

public GumballMachineState getHasQuarterState() {
return hasQuarterState;
}

public GumballMachineState getSoldOutState() {
return soldOutState;
}

public GumballMachineState getSoldState() {
return soldState;
}

public GumballMachineState getWinnerState() {
return winnerState;
}

public void refill(int count) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AM-3(F): (No points removed): This is technically a change in state therefore the states should implement this method, but it breaks SOLID, since we are forcing the concretes to implement something they often cant define. There is no good answer, I just wanted to point it out.

this.count += count;
System.out.println("The gumball machine was just refilled; its new count is: " + this.count);
if (currentState == soldOutState) {
currentState = noQuarterState;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AM-1(F): This should be calling the setState method.

}
}

public String toString() {
StringBuffer result = new StringBuffer();
result.append("\nMighty Gumball, Inc.");
result.append("\nJava-enabled Standing Gumball Model #2004");
result.append("\nInventory: " + count + " gumball");
if (count != 1) {
result.append("s");
}
result.append("\n");
result.append("Machine is " + currentState.getStateToString() + "\n");
return result.toString();
}
}
15 changes: 15 additions & 0 deletions assignments/state_pattern/GumballMachineState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package assignments.state_pattern;

//State Interface
//Should showcase actions on the state only
public interface GumballMachineState {
void insertQuarter();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AM-2(F): These should be public


void ejectQuarter();

void turnCrank();

void dispense();

String getStateToString();
}
45 changes: 45 additions & 0 deletions assignments/state_pattern/GumballMachineTestDrive.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package assignments.state_pattern;

public class GumballMachineTestDrive {

public static void main(String[] args) {
GumballMachine gumballMachine = new GumballMachine(10);

System.out.println(gumballMachine);

gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();

System.out.println(gumballMachine);

gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();

System.out.println(gumballMachine);

gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();

System.out.println(gumballMachine);

gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();

System.out.println(gumballMachine);

gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();

System.out.println(gumballMachine);
}
}
44 changes: 44 additions & 0 deletions assignments/state_pattern/HasQuarterState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package assignments.state_pattern;

import java.util.Random;

public class HasQuarterState implements GumballMachineState {
private Random randomWinner = new Random(System.currentTimeMillis());
private GumballMachine gumballMachine;

public HasQuarterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("You can't insert another quarter");
}

@Override
public void ejectQuarter() {
System.out.println("Quarter returned");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}

@Override
public void turnCrank() {
System.out.println("You turned...");
int winner = randomWinner.nextInt(10);
if ((winner == 0) && (gumballMachine.getCount() > 1)) {
gumballMachine.setState(gumballMachine.getWinnerState());
} else {
gumballMachine.setState(gumballMachine.getSoldState());
}
}

@Override
public void dispense() {
System.out.println("No gumball dispensed");
}

@Override
public String getStateToString() {
return "waiting for turn of crank";
}
}
35 changes: 35 additions & 0 deletions assignments/state_pattern/NoQuarterState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package assignments.state_pattern;

public class NoQuarterState implements GumballMachineState {
private GumballMachine gumballMachine;

public NoQuarterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("You inserted a quarter");
gumballMachine.setState(gumballMachine.getHasQuarterState());
}

@Override
public void ejectQuarter() {
System.out.println("You haven't inserted a quarter");
}

@Override
public void turnCrank() {
System.out.println("You turned, but there's no quarter");
}

@Override
public void dispense() {
System.out.println("You need to pay first");
}

@Override
public String getStateToString() {
return "waiting for quarter";
}
}
34 changes: 34 additions & 0 deletions assignments/state_pattern/SoldOutState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package assignments.state_pattern;

public class SoldOutState implements GumballMachineState {
private GumballMachine gumballMachine;

public SoldOutState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("You can't insert a quarter, the machine is sold out");
}

@Override
public void ejectQuarter() {
System.out.println("You can't eject, you haven't inserted a quarter yet");
}

@Override
public void turnCrank() {
System.out.println("You turned, but there are no gumballs");
}

@Override
public void dispense() {
System.out.println("No gumball dispensed");
}

@Override
public String getStateToString() {
return "sold out";
}
}
40 changes: 40 additions & 0 deletions assignments/state_pattern/SoldState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package assignments.state_pattern;

public class SoldState implements GumballMachineState {
private GumballMachine gumballMachine;

public SoldState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("Please wait, we're already giving you a gumball");
}

@Override
public void ejectQuarter() {
System.out.println("Sorry, you already turned the crank");
}

@Override
public void turnCrank() {
System.out.println("Turning twice doesn't get you another gumball!");
}

@Override
public void dispense() {
gumballMachine.releaseBall();
if (gumballMachine.getCount() > 0) {
gumballMachine.setState(gumballMachine.getNoQuarterState());
} else {
System.out.println("Oops, out of gumballs!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}

@Override
public String getStateToString() {
return "dispensing a gumball";
}
}
46 changes: 46 additions & 0 deletions assignments/state_pattern/WinnerState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package assignments.state_pattern;

public class WinnerState implements GumballMachineState {
private GumballMachine gumballMachine;

public WinnerState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}

@Override
public void insertQuarter() {
System.out.println("Please wait, we're already giving you a Gumball");
}

@Override
public void ejectQuarter() {
System.out.println("Sorry, you already turned the crank");
}

@Override
public void turnCrank() {
System.out.println("Turning again doesn't get you another gumball!");
}

@Override
public void dispense() {
gumballMachine.releaseBall();
if (gumballMachine.getCount() <= 0) {
gumballMachine.setState(gumballMachine.getSoldOutState());
} else {
gumballMachine.releaseBall();
System.out.println("YOU'RE A WINNER! You got two gumballs for your quarter");
if (gumballMachine.getCount() > 0) {
gumballMachine.setState(gumballMachine.getNoQuarterState());
} else {
System.out.println("Oops, out of gumballs!");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}

@Override
public String getStateToString() {
return "despensing two gumballs for your quarter, because YOU'RE A WINNER!";
}
}