状态模式:封装基于状态的行为,并将行为委托到当前状态。
代码实现:
(1)定义一个糖果机状态接口
public interface State {
/**
* insert quarter
*/
void insertQuarter();
/**
* eject quarter
*/
void ejectQuarter();
/**
* turn crank
*/
void turnCrank();
/**
* dispense
*/
void dispense();
}
(3)继承糖果机状态接口实现相应的具体状态
public class HasQuarterState implements State{
GumballMachine gumballMachine;
public HasQuarterState(GumballMachine gumballMachine) {
// TODO Auto-generated constructor stub
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
// TODO Auto-generated method stub
System.out.println("You can't insert another quarter.");
}
@Override
public void ejectQuarter() {
// TODO Auto-generated method stub
System.out.println("Quarter returned.");
gumballMachine.setstate(gumballMachine.noquarterstate);
}
@Override
public void turnCrank() {
// TODO Auto-generated method stub
System.out.println("You turned.");
gumballMachine.setstate(gumballMachine.soldstate);
}
@Override
public void dispense() {
// TODO Auto-generated method stub
System.out.println("No gumball dispensed.");
}
}
public class NoQuarterState implements State{
GumballMachine gumballmachine;
public NoQuarterState(GumballMachine gumballmachine){
this.gumballmachine = gumballmachine;
}
@Override
public void insertQuarter() {
// TODO Auto-generated method stub
System.out.println("You inserted a quarter.");
gumballmachine.setstate(gumballmachine.hasquarterstate);
}
@Override
public void ejectQuarter() {
// TODO Auto-generated method stub
System.out.println("You hasn't inserted a quarter.");
}
@Override
public void turnCrank() {
// TODO Auto-generated method stub
System.out.println("You turned, but there is no quarter.");
}
@Override
public void dispense() {
// TODO Auto-generated method stub
System.out.println("You need to pay first.");
}
}
public class SoldOutState implements State{
GumballMachine gumballMachine;
public SoldOutState(GumballMachine gumballMachine) {
// TODO Auto-generated constructor stub
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
// TODO Auto-generated method stub
System.out.println("Sorry, gumball has sold out.");
}
@Override
public void ejectQuarter() {
// TODO Auto-generated method stub
System.out.println("eject quarter.");
}
@Override
public void turnCrank() {
// TODO Auto-generated method stub
System.out.println("Sorry , you need to pay first.");
}
@Override
public void dispense() {
// TODO Auto-generated method stub
System.out.println("Sorry, gumball has sold out.");
}
}
public class SoldState implements State{
GumballMachine gumballMachine;
public SoldState(GumballMachine gumballMachine) {
// TODO Auto-generated constructor stub
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
// TODO Auto-generated method stub
System.out.println("Wait, we already give you a gumball.");
}
@Override
public void ejectQuarter() {
// TODO Auto-generated method stub
System.out.println("Sorry, you already turned the crank.");
}
@Override
public void turnCrank() {
// TODO Auto-generated method stub
System.out.println("Tunring twice doesn't give you another gunball.");
}
@Override
public void dispense() {
// TODO Auto-generated method stub
gumballMachine.releaseBall();
if (gumballMachine.count > 0) {
gumballMachine.setstate(gumballMachine.noquarterstate);
} else {
System.out.println("Oops. out of gumball.");
gumballMachine.setstate(gumballMachine.soldoutstate);
}
}
}
(3)实现一个糖果机的状态机类,并初始化状态机的状态
public class GumballMachine {
State soldstate;
State soldoutstate;
State noquarterstate;
State hasquarterstate;
State state = soldoutstate;
int count = 0;
public GumballMachine(int numberGumball){
soldstate = new SoldState(this);
soldoutstate = new SoldOutState(this);
noquarterstate = new NoQuarterState(this);
hasquarterstate = new HasQuarterState(this);
this.count = numberGumball;
if (numberGumball > 0) {
state = noquarterstate;
}
}
public void insertQuarter(){
state.insertQuarter();
}
public void ejectQuarter(){
state.ejectQuarter();
}
public void turnCrank(){
state.turnCrank();
state.dispense();
}
public void setstate(State state){
this.state = state;
}
public void releaseBall(){
System.out.println("A gumball comes rolling out the slot...");
if (count > 0) {
count = count - 1;
}
}
public String toString() {
return "count = " + this.count;
}
}
(4)测试代码
public class StateMachinePattern {
public static void main(String[] args){
GumballMachine gumballMachine = new GumballMachine(5);
System.out.println(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
gumballMachine.insertQuarter();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
}
}