模拟自动售货机的找零程序。需求描述如下:
1、程序根据用户投入货币的面额及其数量,在扣除购买的商品价额后,进行找零。
2、程序需要根据售货机内现存的各种货币面额和数量,在优先分配大面额货币的条件下,进行找零。
3、暂时仅支持整数找零。
4、实际的自动售货机找零是串行化操作,因此不考虑多线程同步问题。
package org.tang.change;
/**
* 货币枚举类
* @author Tang
*
*/
public enum Currency {
/**
* 货币面额
*/
HUNDRED_YUAN(100),
FIFTY_YUAN(50),
TWENTY_YUAN(20),
TEN_YUAN(10),
FIVE_YUAN(5),
ONE_YUAN(1);
/**
* 货币面额值
*/
private int value;
public int getValue() {
return value;
}
private Currency(int value){
this.value = value;
}
}
定义货币面额的枚举类。在需要增加面额情况下,可以扩展词枚举类。但是需要保证按照面额降序排列,这是为了实现较大面额货币将被优先分配找零的目的。
package org.tang.change;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 自动售货机类
* @author Tang
*
*/
public class VendingMachine {
private static final VendingMachine MACHINE = new VendingMachine();
/**
* key表示货币面额
* value表示该面额货币在此售货机当中的存量
*/
private static Map<Currency, Integer> moneyPool = new HashMap<Currency, Integer>();
private static Log logger = LogFactory.getLog(VendingMachine.clas