状态模式1

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 + "]";
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值