Imagine we have a gumball machine (a machine that dispenses gum balls when you feed it a coin, similar to a vending machine). We have to write an interface for this Gumball Machine. The state diagram of the machine is given below:
There are mainly 4 states:
- No Coin
- Has Coin
- Gumball sold
- Out of gumballs (Sold out)
stateDiagram-v2
state gumball_count <<choice>>
nq : No coin
hq : Has coin
gs : Gumball Sold
oog: Out of Gumballs
[*] --> nq
nq --> hq : Insert coin
hq --> nq : Eject coin
hq --> gs : Turns crank
gs --> gumball_count
gumball_count --> nq: if gumballs > 0 (Dispense)
gumball_count --> oog: if gumballs = 0
oog --> nq : Refill
Lucky winner (10% chance) to get 2 gumballs instead of 1
stateDiagram-v2
state gumball_count <<choice>>
state gumball_count_w <<choice>>
oog: Out of Gumballs
w : Winner
nq : No coin
hq : Has coin
gs : Gumball Sold
[*] --> nq
nq --> hq : Insert coin
hq --> nq : Eject coin
hq --> w : Lucky winner (10% logic)
hq --> gs : Turns crank
w --> gumball_count_w
gumball_count_w --> nq : if gumballs > 0 (Dispense 2)
gumball_count_w --> oog : if gumballs = 0
gs --> gumball_count
gumball_count --> nq: if gumballs > 0 (Dispense 1)
gumball_count --> oog: if gumballs = 0
oog --> nq : Refill
classDiagram
class State {
<<interface>>
insertCoin()
ejectCoin()
turnCrank()
dispense()
}
class SoldState {
// gumball sold state
insertCoin()
ejectCoin()
turnCrank()
dispense()
}
class SoldOutState {
// out of gumballs
insertCoin()
ejectCoin()
turnCrank()
dispense()
}
class HasCoinState {
// has coin
insertCoin()
ejectCoin()
turnCrank()
dispense()
}
class NoCoinState {
// no coin : initial
insertCoin()
ejectCoin()
turnCrank()
dispense()
}
class GumballMachine {
+GumballMachine(int n)
+insertCoin()
+ejectCoin()
+turnCrank()
-State noCoin
-State hasCoin
-State soldOut
-State sold
-State curState // current state
... // getters and setters
}
State <.. SoldState
State <.. SoldOutState
State <.. HasCoinState
State <.. NoCoinState
GumballMachine --> State