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

定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的。

下面使用个例子来说明状态模式的用法,现在有个自动售货机的代码需要我们来写,状态图如下:

0c15bc4cc5173ae3fc73d6d7a675ec0e.png

分析一个这个状态图:

a、包含4个状态(我们使用4个int型常量来表示)

b、包含3个暴露在外的方法(投币、退币、转动手柄)

c、我们需要处理每个状态下,用户都可以触发这三个动作。

下面我们根据分析的结果,写出代码:

package com.zhy.pattern.status;

/**

* 自动售货机

*

* @author zhy

*

*/

public class VendingMachine

{

/**

* 已投币

*/

private final static int HAS_MONEY = 0;

/**

* 未投币

*/

private final static int NO_MONEY = 1;

/**

* 售出商品

*/

private final static int SOLD = 2;

/**

* 商品售罄

*/

private final static int SOLD_OUT = 3;

private int currentStatus = NO_MONEY;

/**

* 商品数量

*/

private int count = 0;

public VendingMachine(int count)

{

this.count = count;

if (count > 0)

{

currentStatus = NO_MONEY;

}

}

/**

* 投入硬币,任何状态用户都可能投币

*/

public void insertMoney()

{

switch (currentStatus)

{

case NO_MONEY:

currentStatus = HAS_MONEY;

System.out.println("成功投入硬币");

break;

case HAS_MONEY:

System.out.println("已经有硬币,无需投币");

break;

case SOLD:

System.out.println("请稍等...");

break;

case SOLD_OUT:

System.out.println("商品已经售罄,请勿投币");

break;

}

}

/**

* 退币,任何状态用户都可能退币

*/

public void backMoney()

{

switch (currentStatus)

{

case NO_MONEY:

System.out.println("您未投入硬币");

break;

case HAS_MONEY:

currentStatus = NO_MONEY;

System.out.println("退币成功");

break;

case SOLD:

System.out.println("您已经买了糖果...");

break;

case SOLD_OUT:

System.out.println("您未投币...");

break;

}

}

/**

* 转动手柄购买,任何状态用户都可能转动手柄

*/

public void turnCrank()

{

switch (currentStatus)

{

case NO_MONEY:

System.out.println("请先投入硬币");

break;

case HAS_MONEY:

System.out.println("正在出商品....");

currentStatus = SOLD;

dispense();

break;

case SOLD:

System.out.println("连续转动也没用...");

break;

case SOLD_OUT:

System.out.println("商品已经售罄");

break;

}

}

/**

* 发放商品

*/

private void dispense()

{

switch (currentStatus)

{

case NO_MONEY:

case HAS_MONEY:

case SOLD_OUT:

throw new IllegalStateException("非法的状态...");

case SOLD:

count--;

System.out.println("发出商品...");

if (count == 0)

{

System.out.println("商品售罄");

currentStatus = SOLD_OUT;

} else

{

currentStatus = NO_MONEY;

}

break;

}

}

}

package com.zhy.pattern.status;

/**

* 自动售货机

*

* @author zhy

*

*/

public class VendingMachine

{

/**

* 已投币

*/

private final static int HAS_MONEY = 0;

/**

* 未投币

*/

private final static int NO_MONEY = 1;

/**

* 售出商品

*/

private final static int SOLD = 2;

/**

* 商品售罄

*/

private final static int SOLD_OUT = 3;

private int currentStatus = NO_MONEY;

/**

* 商品数量

*/

private int count = 0;

public VendingMachine(int count)

{

this.count = count;

if (count > 0)

{

currentStatus = NO_MONEY;

}

}

/**

* 投入硬币,任何状态用户都可能投币

*/

public void insertMoney()

{

switch (currentStatus)

{

case NO_MONEY:

currentStatus = HAS_MONEY;

System.out.println("成功投入硬币");

break;

case HAS_MONEY:

System.out.println("已经有硬币,无需投币");

break;

case SOLD:

System.out.println("请稍等...");

break;

case SOLD_OUT:

System.out.println("商品已经售罄,请勿投币");

break;

}

}

/**

* 退币,任何状态用户都可能退币

*/

public void backMoney()

{

switch (currentStatus)

{

case NO_MONEY:

System.out.println("您未投入硬币");

break;

case HAS_MONEY:

currentStatus = NO_MONEY;

System.out.println("退币成功");

break;

case SOLD:

System.out.println("您已经买了糖果...");

break;

case SOLD_OUT:

System.out.println("您未投币...");

break;

}

}

/**

* 转动手柄购买,任何状态用户都可能转动手柄

*/

public void turnCrank()

{

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Java自动售货机代码示例: ```java import java.util.Scanner; public class VendingMachine { public static void main(String[] args) { Scanner input = new Scanner(System.in); int balance = 0; int choice = 0; while (true) { System.out.println("当前余额:" + balance); System.out.println("请选择商品:"); System.out.println("1. 可乐(2元)"); System.out.println("2. 雪碧(2元)"); System.out.println("3. 红茶(3元)"); System.out.println("4. 绿茶(3元)"); System.out.println("5. 咖啡(4元)"); System.out.println("6. 退款"); choice = input.nextInt(); if (choice == 1 || choice == 2) { if (balance < 2) { System.out.println("余额不足,请投入" + (2 - balance) + "元"); } else { balance -= 2; System.out.println("购买成功,当前余额:" + balance); } } else if (choice == 3 || choice == 4) { if (balance < 3) { System.out.println("余额不足,请投入" + (3 - balance) + "元"); } else { balance -= 3; System.out.println("购买成功,当前余额:" + balance); } } else if (choice == 5) { if (balance < 4) { System.out.println("余额不足,请投入" + (4 - balance) + "元"); } else { balance -= 4; System.out.println("购买成功,当前余额:" + balance); } } else if (choice == 6) { System.out.println("退款成功,共退回:" + balance + "元"); break; } else { System.out.println("无效的选择,请重新选择"); } } } } ``` 这个自动售货机程序模拟了一个简单的购物流程。它使用一个while循环来持续进行购物操作,直到用户选择退出退款并退出程序。用户可以选择购买不同的商品,并且程序会根据用户的余额进行判断是否可以购买商品。如果余额不足,程序会提示用户需要投入更多的钱。如果用户选择退款,程序会将当前余额退还给用户并退出程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值