java自动售货机代码_Java设计模式--状态模式(以自动售货机为例)

论坛 期权论坛     
选择匿名的用户   2021-5-30 16:42   355   0
<div style="font-size:16px;">
<p>定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的。</p>
<p>下面使用个例子来说明状态模式的用法,现在有个自动售货机的代码需要我们来写,状态图如下:</p>
<p align="center"><img alt="0c15bc4cc5173ae3fc73d6d7a675ec0e.png" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-5e1479bf017e8a3e164fc8ca0ca2d75b.png"></p>
<p>分析一个这个状态图:</p>
<p>a、包含4个状态(我们使用4个int型常量来表示)</p>
<p>b、包含3个暴露在外的方法(投币、退币、转动手柄)</p>
<p>c、我们需要处理每个状态下,用户都可以触发这三个动作。</p>
<p>下面我们根据分析的结果,写出代码:</p>
<p>package com.zhy.pattern.status;</p>
<p>/**</p>
<p>* 自动售货机</p>
<p>*</p>
<p>* &#64;author zhy</p>
<p>*</p>
<p>*/</p>
<p>public class VendingMachine</p>
<p>{<!-- --></p>
<p>/**</p>
<p>* 已投币</p>
<p>*/</p>
<p>private final static int HAS_MONEY &#61; 0;</p>
<p>/**</p>
<p>* 未投币</p>
<p>*/</p>
<p>private final static int NO_MONEY &#61; 1;</p>
<p>/**</p>
<p>* 售出商品</p>
<p>*/</p>
<p>private final static int SOLD &#61; 2;</p>
<p>/**</p>
<p>* 商品售罄</p>
<p>*/</p>
<p>private final static int SOLD_OUT &#61; 3;</p>
<p>private int currentStatus &#61; NO_MONEY;</p>
<p>/**</p>
<p>* 商品数量</p>
<p>*/</p>
<p>private int count &#61; 0;</p>
<p>public VendingMachine(int count)</p>
<p>{<!-- --></p>
<p>this.count &#61; count;</p>
<p>if (count &gt; 0)</p>
<p>{<!-- --></p>
<p>currentStatus &#61; NO_MONEY;</p>
<p>}</p>
<p>}</p>
<p>/**</p>
<p>* 投入硬币,任何状态用户都可能投币</p>
<p>*/</p>
<p>public void insertMoney()</p>
<p>{<!-- --></p>
<p>switch (currentStatus)</p>
<p>{<!-- --></p>
<p>case NO_MONEY:</p>
<p>currentStatus &#61; HAS_MONEY;</p>
<p>System.out.println(&#34;成功投入硬币&#34;);</p>
<p>break;</p>
<p>case HAS_MONEY:</p>
<p>System.out.println(&#34;已经有硬币,无需投币&#34;);</p>
<p>break;</p>
<p>case SOLD:</p>
<p>System.out.println(&#34;请稍等...&#34;);</p>
<p>break;</p>
<p>case SOLD_OUT:</p>
<p>System.out.println(&#34;商品已经售罄,请勿投币&#34;);</p>
<p>break;</p>
<p>}</p>
<p>}</p>
<p>/**</p>
<p>* 退币,任何状态用户都可能退币</p>
<p>*/</p>
<p>public void backMoney()</p>
<p>{<!-- --></p>
<p>switch (currentStatus)</p>
<p>{<!-- --></p>
<p>case NO_MONEY:</p>
<p>System.out.println(&#34;您未投入硬币&#34;);</p>
<p>break;</p>
<p>case HAS_MONEY:</p>
<p>currentStatus &#61; NO_MONEY;</p>
<p>System.out.println(&#34;退币成功&#34;);</p>
<p>break;</p>
<p>case SOLD:</p>
<p>System.out.println(&#34;您已经买了糖果...&#34;);</p>
<p>break;</p>
<p>case SOLD_OUT:</p>
<p>System.out.println(&#34;您未投币...&#34;);</p>
<p>break;</p>
<p>}</p>
<p>}</p>
<p>/**</p>
<p>* 转动手柄购买,任何状态用户都可能转动手柄</p>
<p>*/</p>
<p>public void turnCrank()</p>
<p>{<!-- --></p>
<p>switch (currentStatus)</p>
<p>{<!-- --></p>
<p>case NO_MONEY:</p>
<p>System.out.println(&#34;请先投入硬币&#34;);</p>
<p>break;</p>
<p>case HAS_MONEY:</p>
<p>System.out.println(&#34;正在出商品....&#34;);</p>
<p>currentStatus &#61; SOLD;</p>
<p>dispense();</p>
<p>break;</p>
<p>case SOLD:</p>
<p>System.out.println(&#34;连续转动也没用...&#34;);</p>
<p>break;</p>
<p>case SOLD_OUT:</p>
<p>System.out.println(&#34;商品已经售罄&#34;);</p>
<p>break;</p>
<p>}</p>
<p>}</p>
<p>/**</p>
<p>* 发放商品</p>
<p>*/</p>
<p>private void dispense()</p>
<p>{<!-- --></p>
<p>switch (currentStatus)</p>
<p>{<!-- --></p>
<p>case NO_MONEY:</p>
<p>case HAS_MONEY:</p>
<p>case SOLD_OUT:</p>
<p>throw new IllegalStateException(&#34;非法的状态...&#34;);</p>
<p>case SOLD:</p>
<p>count--;</p>
<p>System.out.println(&#34;发出商品...&#34;);</p>
<p>if (count &#61;&#61; 0)</p>
<p>{<!-- --></p>
<p>System.out.println(&#34;商品售罄&#34;);</p>
<p>currentStatus &#61; SOLD_OUT;</p>
<p>} else</p>
<p>{<!-- --></p>
<p>currentStatus &#61; NO_MONEY;</p>
<p>}</p>
<p>break;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>package com.zhy.pattern.status;</p>
<p>/**</p>
<p>* 自动售货机</p>
<p>*</p>
<p>* &#64;author zhy</p>
<p>*</p>
<p>*/</p>
<p>public class VendingMachine</p>
<p>{<!-- --></p>
<p>/**</p>
<p>* 已投币</p>
<p>*/</p>
<p>private final static int HAS_MONEY &#61; 0;</p>
<p>/**</p>
<p>* 未投币</p>
<p>*/</p>
<p>private final static int NO_MONEY &#61; 1;</p>
<p>/**</p>
<p>* 售出商品</p>
<p>*/</p>
<p>private final static int SOLD &#61; 2;</p>
<p>/**</p>
<p>* 商品售罄</p>
<p>*/</p>
<p>private final static int SOLD_OUT &#61; 3;</p>
<p>private int currentStatus &#61; NO_MONEY;</p>
<p>/**</p>
<p>* 商品数量</p>
<p>*/</p>
<p>private int count &#61; 0;</p>
<p>public VendingMachine(int count)</p>
<p>{<!-- --></p>
<p>this.count &#61; count;</p>
<p>if (count &gt; 0)</p>
<p>{<!-- --
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP