private NumberMachine(){} private static NumberMachine instance = new NumberMachine(); public static NumberMachine getInstance(){ return instance; }
private NumberManager commonManager = new NumberManager(); private NumberManager expressManager = new NumberManager(); private NumberManager vipManager = new NumberManager(); public NumberManager getCommonManager() { return commonManager; } public NumberManager getExpressManager() { return expressManager; } public NumberManager getVipManager() { return vipManager; }
}
ServiceWindow与CustomerType枚举类
CustomerType枚举类
Ø系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
Ø重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。
package cn.itcast.bankqueue;
public enum CustomerType { COMMON,EXPRESS,VIP; public String toString(){ String name = null; switch(this){ case COMMON: name = "普通"; break; case EXPRESS: name = "快速"; break; case VIP: name = name(); break; } return name; } }
/** * 没有把VIP窗口和快速窗口做成子类,是因为实际业务中的普通窗口可以随时被设置为VIP窗口和快速窗口。 * */ public class ServiceWindow { private static Logger logger = Logger.getLogger("cn.itcast.bankqueue"); private CustomerType type = CustomerType.COMMON; private int number = 1;
public CustomerType getType() { return type; }
public void setType(CustomerType type) { this.type = type; }
public void setNumber(int number){ this.number = number; }
public void start(){ Executors.newSingleThreadExecutor().execute( new Runnable(){ public void run(){ //下面这种写法的运行效率低,最好是把while放在case下面 while(true){ switch(type){ case COMMON: commonService(); break; case EXPRESS: expressService(); break; case VIP: vipService(); break; } } } } ); }
private void commonService(){ String windowName = "第" + number + "号" + type + "窗口"; System.out.println(windowName + "开始获取普通任务!"); Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber(); if(serviceNumber != null ){ System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务"); int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;