黑马程序员-学习笔记/银行业务系统
2014-02-24 00:52
274 查看
------- android培训、java培训、期待与您交流! ---------
黑马程序员培训-android培训,java面试题之 ---- 银行系统业务
根据我们在银行办理业务的时候,首先,我们进入银行肯定是需要办理业务的,所以第一步,我们需要排号
然后银行呢,根据我们的排号去进行处理,而且银行业务中,有VIP通道,快速通道,普通通道,即我们常见的VIP窗口,快速窗口,普通窗口
现在,我们来编写一个银行系统的小demo
从头到尾开始
开始我们编写这么一个test测试类。
根据需求,我们银行业务有4个普通的窗口,一个快速窗口,一个VIP窗口
所以需要有一个银行业务台窗口 ServiceWindow,那么银行业务肯定又会有快速窗口和VIP窗口还有普通窗口
那么,我们又需要定义一个普通的窗口客户业务办理,快速办理业务窗口和VIP客户业务办理
同时,我们还得考虑,排号中,VIP客户是否过多,这样的话,我们是否需要改普通客户窗口为VIP窗口业务办理
根据上面,我们需要用到一个枚举类型的银行业务类型(type)
同时,我们也用到了。快速窗口和普通窗口VIP窗口办理业务计时所用到都Constants类
假设每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来
平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以,1秒钟产生一个普通客户比较合理
那么,随机产生客户,客户来了之后,客户进行排号后,录入到系统中,让客户等待业务办理、
所以我们需要模拟一个客户随机生成类
黑马程序员培训-android培训,java面试题之 ---- 银行系统业务
根据我们在银行办理业务的时候,首先,我们进入银行肯定是需要办理业务的,所以第一步,我们需要排号
然后银行呢,根据我们的排号去进行处理,而且银行业务中,有VIP通道,快速通道,普通通道,即我们常见的VIP窗口,快速窗口,普通窗口
现在,我们来编写一个银行系统的小demo
从头到尾开始
public static void main(String[] args) { //产生4个普通窗口 for(int i=1;i<5;i++){ //定义银行系统业务窗口,及办理业务 ServiceWindow window = new ServiceWindow(); window.setNumber(i); window.start(); } //产生1个快速窗口 ServiceWindow expressWindow = new ServiceWindow(); expressWindow.setType(CustomerType.EXPRESS); expressWindow.start(); //产生1个VIP窗口 ServiceWindow vipWindow = new ServiceWindow(); vipWindow.setType(CustomerType.VIP); vipWindow.start(); //普通客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer serviceNumber = NumberMachine.getInstance().getCommonManager ().generateNewNumber(); System.out.println("第" + serviceNumber + "号普通客户正在等待服务!"); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS); //快速客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer serviceNumber = NumberMachine.getInstance().getExpressManager ().generateNewNumber(); System.out.println("第" + serviceNumber + "号快速客户正在等待服务!"); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2, TimeUnit.SECONDS); //VIP客户拿号 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer serviceNumber = NumberMachine.getInstance().getVipManager ().generateNewNumber(); System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!"); } }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, TimeUnit.SECONDS); }
开始我们编写这么一个test测试类。
根据需求,我们银行业务有4个普通的窗口,一个快速窗口,一个VIP窗口
所以需要有一个银行业务台窗口 ServiceWindow,那么银行业务肯定又会有快速窗口和VIP窗口还有普通窗口
那么,我们又需要定义一个普通的窗口客户业务办理,快速办理业务窗口和VIP客户业务办理
public class ServiceWindow { 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(true){ switch(type){ case COMMON: // 普通 commonService(); break; case EXPRESS: // 快速 expressService(); break; case VIP: // 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; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "秒"); }else{ System.out.println(windowName + "没有取到普通任务,正在空闲一秒"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } //快速窗口 private void expressService(){ Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber(); String windowName = "第" + number + "号" + type + "窗口"; System.out.println(windowName + "开始获取快速任务!"); if(serviceNumber !=null){ System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务"); // 计时 int serviceTime = Constants.MIN_SERVICE_TIME; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "秒"); }else{ System.out.println(windowName + "没有取到快速任务!"); commonService(); } } // VIP窗口 private void vipService(){ Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber(); String windowName = "第" + number + "号" + type + "窗口"; System.out.println(windowName + "开始获取VIP任务!"); if(serviceNumber !=null){ System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务"); // 计时 int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒"); }else{ System.out.println(windowName + "没有取到VIP任务!"); commonService(); } } }
同时,我们还得考虑,排号中,VIP客户是否过多,这样的话,我们是否需要改普通客户窗口为VIP窗口业务办理
根据上面,我们需要用到一个枚举类型的银行业务类型(type)
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窗口办理业务计时所用到都Constants类
假设每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来
平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以,1秒钟产生一个普通客户比较合理
public class Constants { public static int MAX_SERVICE_TIME = 10000; //10秒! public static int MIN_SERVICE_TIME = 1000; //1秒! // 假设一秒钟产生一个客户 public static int COMMON_CUSTOMER_INTERVAL_TIME = 1; }
那么,随机产生客户,客户来了之后,客户进行排号后,录入到系统中,让客户等待业务办理、
所以我们需要模拟一个客户随机生成类
public class NumberMachine { 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; } }
public class NumberManager { private int lastNumber = 0; private List queueNumbers = new ArrayList(); public synchronized Integer generateNewNumber(){ queueNumbers.add(++lastNumber); return lastNumber; } public synchronized Integer fetchNumber(){ if(queueNumbers.size()>0){ return (Integer)queueNumbers.remove(0); }else{ return null; } } }
相关文章推荐
- 黑马程序员—Java基础学习笔记之7K月薪面试题破解_银行业务调度系统
- 黑马程序员——银行业务调度系统学习笔记
- 黑马程序员----【张孝祥7K面试题】二银行业务调度系统视频学习笔记
- 黑马程序员---java学习笔记之银行业务调度系统
- 黑马程序员——Java学习笔记之10——“银行业务调度系统”
- 【黑马程序员】 学习笔记 - 直击7K面试题 - 张孝祥老师的银行业务调度管理系统
- 【黑马程序员】银行业务调度系统_学习笔记
- 黑马程序员-java学习笔记之银行业务调度系统。
- 黑马程序员---银行业务调动系统 学习笔记
- 黑马程序员 java学习笔记——银行业务调度系统
- 黑马程序员技术博客之银行业务调度系统学习笔记
- 黑马程序员-java学习笔记-银行业务调度系统
- 黑马程序员——java 7k银行业务管理系统学习笔记
- 黑马程序员学习笔记十——银行业务管理系统
- 黑马程序员 C#学习笔记⑦ 文件系统数据一FileStream
- 黑马程序员 【】java学习之路——银行业务系统
- 【黑马程序员】 学习笔记 - 直击7K面试题 - 张孝祥老师的交通等管理系统
- 黑马程序员-Java基础学习之银行业务调度系统
- 黑马程序员_Java学习笔记之7K面试题交通等管理系统
- 【学习并改进】黑马程序员-张孝祥-银行业务调度系统