zoukankan      html  css  js  c++  java
  • 设计模式之状态模式(三)

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

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

        State soldOutState;
    	State noQuarterState;
    	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!";
    	}
    }
    

    完成这个游戏

    我们还要做一个改变:我们需要实现机会随机数,还要增加一个进入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");
        }
        
    }
    

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

    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);
    		// 多重复几次,就可以看是否中奖了
    	}
    }
    

    到这里为止,我们通过状态模式把这个知识点巩固了,只是如果这些代码提交出去,还是有很多待改进的地方,主要是GumballMachine这个类,在这里就不一一赘述啦,感兴趣的朋友可以自己先看看代码,或者查看下书籍,书籍里有你想要的答案哦。可能很多朋友刚开始看,我们参考的书籍是《Head First设计模式》,公众号内回复设计模式即可获取电子书查阅。

    设计箱内的工具

    万年不变的总结时间来啦

    • OO基础

      抽象、封装、继承、多态

    • OO原则(本章没有新的设计原则出现哦)

      封装变化

      多用组合,少用继承

      针对接口编程,不针对实现编程

      为交互对象之间的松耦合设计而努力

      依赖抽象,不要依赖具体类

      类应该对扩展开放,对修改关闭

      只和朋友交谈

      别找我,我会找你

      类应该只有一个改变的理由

    • OO模式

      『策略模式』、『观察者模式』、『装饰者模式』、『抽象工厂模式』、『工厂方法模式』、『单例模式』、『命令模式』、『适配器模式』、『外观模式』、『模板方法模式』、『迭代器模式』、『组合模式

      状态模式』允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

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

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

  • 相关阅读:
    Jmeter命令行运行实例讲解
    ab压力测试工具
    F12找到页面某一元素所绑定的点击事件
    F12修改html进行本地js操作页面元素
    JMeter中利用Parameters 和Body Data传递参数有什么不同
    centos7 VNC安装
    centos7安装python3
    linux du命令的疑惑
    centos cgroup配置
    linux下postgres未能正常启动的解决过程
  • 原文地址:https://www.cnblogs.com/dimple91/p/11687280.html
Copyright © 2011-2022 走看看