设计模式之状态模式(三)

 
 

上次我们很愉快的完成了状态模式的定义和代码的编写,但是在第一篇的时候我们说过,还需要实现一个抽十次中一次的功能,上次还没解决呢。

我们已经实现了状态模式,所以实现这个游戏应该易如反掌。首先,我们要在GumballMachine类中加入一个状态:

    State soldOutState;    State noQuarterState;    State hasQuarterState;    State soldState;    // 这是新加的状态    State winnerState;
    State hasQuarterState;
    State soldState;
    // 这是新加的状态
    State winnerState;

然后,我们去实现WinnerState类本身,它和SoldState类很像:

public class WinnerState implements State {    GumballMachine gumballMachine;    public WinnerState(GumballMachine gumballMachine) {        this.gumballMachine = gumballMachine;    }    public void insertQuarter() {        System.out.println("Please wait, we're already giving you a Gumball");    }    public void ejectQuarter() {        System.out.println("Please wait, we're already giving you a Gumball");    }    public void turnCrank() {        System.out.println("Turning again doesn't get you another gumball!");    }    // 我们在这里释放出两颗糖果,让你和进入NoQuarterState或SoldOutState    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());            }        }    }    public void refill() { }    public String toString() {        return "despensing two gumballs for your quarter, because YOU'RE A WINNER!";    }}class WinnerState implements State {
    GumballMachine gumballMachine;

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

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

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

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

    // 我们在这里释放出两颗糖果,让你和进入NoQuarterState或SoldOutState
    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());
            }
        }
    }

    public void refill() { }

    public String toString() {
        return "despensing two gumballs for your quarter, because YOU'RE A WINNER!";
    }
}
完成这个游戏

我们还要做一个改变:我们需要实现机会随机数,还要增加一个进入WinnerState状态的转换。这两件事都要加进HasQuarterState,因为顾客会从这个状态转动曲柄:

public class HasQuarterState implements State {    // 首先,我们增加一个随机数产生器,产生10%赢的机会    Random randomWinner = new Random(System.currentTimeMillis());    GumballMachine gumballMachine;    public HasQuarterState(GumballMachine gumballMachine) {        this.gumballMachine = gumballMachine;    }    public void insertQuarter() {        System.out.println("You can't insert another quarter");    }    public void ejectQuarter() {        System.out.println("Quarter returned");        gumballMachine.setState(gumballMachine.getNoQuarterState());    }    // 然后决定这个顾客是否赢了    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());        }    }    public void dispense() {        System.out.println("No gumball dispensed");    }}class HasQuarterState implements State {
    // 首先,我们增加一个随机数产生器,产生10%赢的机会
    Random randomWinner = new Random(System.currentTimeMillis());
    GumballMachine gumballMachine;

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

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

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

    // 然后决定这个顾客是否赢了
    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());
        }
    }

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

}

剩下的就是如何向客户展示的问题了,还是老样子,给出代码,执行自己去执行哦。我们贵在实践嘛。

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);        // 多重复几次,就可以看是否中奖了    }}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这个类,在这里就不一一赘述啦,感兴趣的朋友可以自己先看看代码,或者查看下书籍,书籍里有你想要的答案哦。可能很多朋友刚开始看,我们参考的书籍是《Head First设计模式》,公众号内回复设计模式即可获取电子书查阅。

设计箱内的工具

万年不变的总结时间来啦

第10章的内容学完了。小编最近在看后面的章节,篇幅有点长,有部分内容和我们现在的使用方式存在不同,所以小编现在也在苦恼如何将后面的章节通过精简的方式整理出来。

小编试着努力下看看,如果可以,小编竭尽所能给大家贡献出来。倘若有难度了,小编会找网上优秀的博客来补充这一部分的内容,把后续的补充完。感谢大家一如既往地支持与厚爱,谢谢。

推荐阅读:

上周发的没想到入了CSDN的首页,刚才去看,已经有1600+的阅读了。小编将继续努力,在原创技术文章分享的基础上,分享一些对于大家有共鸣的干货出来,同大家一起进步。

  成就更好的自己,就是不停地做减法

640?wx_fmt=jpeg


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小跃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值