package L_State.a;
/**
* 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了他的类
* 与策略模式不同的时,策略模式,用户可以主动指定context所要组合的策对象,通常都只有一个最适当的策略对象,
* 状态模式将一群行为封装在状态对象中,context行为可以随时委托给其中行为,但是context的客户不知道状态对象
*状态模转化可以由state类或context类控制
*
* 添加每10次,赠送一次糖果状态,看b包
*/
public class Main {
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.ejectQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
// 投钱-->拿糖果-->投钱-->拿糖果-->退钱
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.ejectQuarter();
System.out.println(gumballMachine);
// 投钱-->投钱-->拿糖果-->投钱-->拿糖果-->投钱-->拿糖果
gumballMachine.insertQuarter();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println(gumballMachine);
}
}
package L_State.a;
public class GumballMachine {
// 存储糖果机4状态,糖果售空,没有25分(糖果25/1个),有25分,出售
final static int SOLD_OUT = 0;
final static int NO_QUARTER = 1;
final static int HAS_QURATER = 2;
final static int SOLD = 3;
// 跟踪当前状态,默认没糖果
int state = SOLD_OUT;
// 追踪机器糖果数目
int count = 0;
public GumballMachine(int count) {
this.count = count;
if (count > 0)
state = NO_QUARTER;
}
public void insertQuarter() {
if (state == HAS_QURATER) {
System.out.println("不能再投入25分");
} else if (state == NO_QUARTER) {
state = HAS_QURATER;
System.out.println("你投入了25分");
} else if (state == SOLD_OUT) {
System.out.println("糖果售空,不能插入25分");
} else if (state == SOLD) {
System.out.println("请等待");
}
}
public void ejectQuarter() {
if (state == HAS_QURATER) {
System.out.println("退回25分");
state = NO_QUARTER;
} else if (state == NO_QUARTER) {
System.out.println("没有钱,无法退回");
} else if (state == SOLD_OUT) {// 糖果售空,无法投入钱,也就无法退出钱
System.out.println("无法退回");
} else if (state == SOLD) {// 已经出售糖果,无法退回钱
System.out.println("无法退回");
}
}
public void turnCrank() {
if (state == SOLD) {
System.out.println("别想骗机器拿2次糖果");
} else if (state == NO_QUARTER) {
System.out.println("请先投入25分");
} else if (state == SOLD_OUT) {
System.out.println("售空,无法给予糖果");
} else if (state == HAS_QURATER) {
System.out.println("已售出");
state = SOLD;
dispense();
}
}
public void dispense() {
if (state == SOLD) {
System.out.println("正在售出糖果");
count--;
if (count == 0) {
System.out.println("糖果已经售完");
state = SOLD_OUT;
} else {
state = NO_QUARTER;
}
}// 下面这些都不应该发生
else if (state == NO_QUARTER) {
System.out.println("需要投入钱");
} else if (state == SOLD_OUT) {
System.out.println("没糖果出售");
} else if (state == HAS_QURATER) {
System.out.println("没有糖果出售");
}
}
@Override
public String toString() {
return "GumballMachine [state=" + state + ", count=" + count + "]";
}
}