黑马程序员_银行业务调度系统
2014-06-16 13:33
387 查看
------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------
需求(略)
思路
1、需求简述
客户拿号等着办理业务,业务窗口叫号为客户办理业务
2、名次提炼找对象
客户、号码、窗口、业务(隐性)
3、简析对象
客户:普通、快速、vip三种类型客户,可用枚举表示,不同客户有不同服务号码
号码:三种客户需要分别服务,因而有三种号码,每个号码对应一个客户且按先后排序,
客户拿号和窗口叫号对应号码对象则提供两种方法
窗口:普通、快速、vip三种类型窗口,不同类型窗口服务方式不一样,但都是按获取的号码依次提供服务
业务:无需体现具体业务,可用随机方式设置办理业务时间
4、对象关联
客户-->明确服务类型-->获取该服务类型号码-->等待窗口叫号服务
(明确类型,银行是通过一台机器客户在上面选择的方式完成)
5、类的创建
号码管理
属性:下一个需要服务号码、装号码的集合
行为:为客户产生新号码方法、无窗口提供下一个服务号码
客户
普通、快速、vip三种实例对象
不同类型号码管理
属性:普通、快速、vip三种类型号码管理
行为:仅一个对象来明确需那种类型、三种生成号码管理的方法
窗口
属性:窗口类型、窗口编号
方法:开始服务的方法,三种服务方法
主函数类
创建1、2、3、4号普通窗口,5号快速窗口,6号vip窗口
创建3个线程分别来模拟生成三种客户且取相应的服务号码
另定义一个常量类来装程序所需的常量
------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/
需求(略)
思路
1、需求简述
客户拿号等着办理业务,业务窗口叫号为客户办理业务
2、名次提炼找对象
客户、号码、窗口、业务(隐性)
3、简析对象
客户:普通、快速、vip三种类型客户,可用枚举表示,不同客户有不同服务号码
号码:三种客户需要分别服务,因而有三种号码,每个号码对应一个客户且按先后排序,
客户拿号和窗口叫号对应号码对象则提供两种方法
窗口:普通、快速、vip三种类型窗口,不同类型窗口服务方式不一样,但都是按获取的号码依次提供服务
业务:无需体现具体业务,可用随机方式设置办理业务时间
4、对象关联
客户-->明确服务类型-->获取该服务类型号码-->等待窗口叫号服务
(明确类型,银行是通过一台机器客户在上面选择的方式完成)
5、类的创建
号码管理
属性:下一个需要服务号码、装号码的集合
行为:为客户产生新号码方法、无窗口提供下一个服务号码
客户
普通、快速、vip三种实例对象
不同类型号码管理
属性:普通、快速、vip三种类型号码管理
行为:仅一个对象来明确需那种类型、三种生成号码管理的方法
窗口
属性:窗口类型、窗口编号
方法:开始服务的方法,三种服务方法
主函数类
创建1、2、3、4号普通窗口,5号快速窗口,6号vip窗口
创建3个线程分别来模拟生成三种客户且取相应的服务号码
另定义一个常量类来装程序所需的常量
package cn.ithema.interview.bank1; import java.util.ArrayList; import java.util.List; public class NumberManager { //定义下一个所需服务号码 private int lastNumber=1; //定义一个装号码的有序集合 private List<Integer> queueNumber = new ArrayList<Integer>(); //定义为客户生产新号码的方法 public synchronized Integer generateNewNumber(){ queueNumber.add(lastNumber); return lastNumber++; } //定义一个为窗口获取服务号码的方法, //因为取号叫号为多个线程控制,所以使用同步函数 public synchronized Integer fetchNumber(){ if(queueNumber.size()>0) return queueNumber.remove(0); return null; } }
package cn.ithema.interview.bank1; public class NumberMachine { //单例设计 private static final NumberMachine instance = new NumberMachine(); private 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; } }
package cn.ithema.interview.bank1; public enum ClientType { COMMON,EXPRESS,VIP; public String toString() { switch(this){ case COMMON: return "普通"; case EXPRESS: return "快速"; case VIP: return "vip"; } return null; } }
package cn.ithema.interview.bank1; public class Constants { public static final int MAX_SERVICE_TIME = 10000; public static final int MIN_SERVICE_TIME = 1000; public static final int COMMON_CUSTOMER_INTERVAL_TIME = 1; }
package cn.ithema.interview.bank1; import java.util.Random; import java.util.concurrent.Executors; public class ServiceWindow { //定义窗口服务客户类型和窗口编号,并创建其set和get方法 private int id; private ClientType type; public int getId() { return id; } public void setId(int id) { this.id = id; } public ClientType getType() { return type; } public void setType(ClientType type) { this.type = type; } //定义窗口启动服务方法,需要多线程循环执行 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: vipService(); break; } } } }); } //为三种不同客户创建三种服务方法 public void commonService(){ //定义一个窗口名字 String windowName = "<"+id+"号"+type+"窗口"+">"; //获取服务号码 Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber(); //若号码有值则服务,若号码无值,则等待1s if(serviceNumber!=null){ System.out.println(windowName+"开始获取普通客户服务任务"); //随机产生服务时间,通过sleep方法实现服务时间 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+"没有需要服务的普通客户,等待1s后再发起服务"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public void expressService(){ String windowName = "<"+id+"号"+type+"窗口"+">"; Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber(); //若号码有值则服务,若号码无值,则服务普通客户 if(serviceNumber!=null){ System.out.println(windowName+"开始获取快速客户服务任务"); //服务时间为最短时间,通过sleep方法实现服务时间 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(); } } public void vipService(){ String windowName = "<"+id+"号"+type+"窗口"+">"; Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber(); //若号码有值则服务,若号码无值,则服务普通客户 if(serviceNumber!=null){ System.out.println(windowName+"开始获取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(); } } }
package cn.ithema.interview.bank1; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MainClass { public static void main(String[] args) { //1、2、3、4号普通窗口,5号快速窗口,6号vip窗口,并调用start方法 for(int i=1;i<5;i++){ ServiceWindow commonWindow = new ServiceWindow(); commonWindow.setId(i); commonWindow.setType(ClientType.COMMON); commonWindow.start(); } ServiceWindow expressWindow = new ServiceWindow(); expressWindow.setId(1); expressWindow.setType(ClientType.EXPRESS); expressWindow.start(); ServiceWindow vipWindow = new ServiceWindow(); vipWindow.setId(6); vipWindow.setType(ClientType.VIP); vipWindow.start(); //创建三个定时器,通过定期由NumberMachine按类型拿号来模拟客户拿号 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); 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); } }
------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/
相关文章推荐
- 黑马程序员_银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员——银行业务调度系统
- 黑马程序员—14、JAVA&面试题系列—银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员之银行业务调度系统
- 黑马程序员__银行业务调度系统
- 黑马程序员-银行业务调度系统(改进版)
- 黑马程序员----银行业务调度系统(1)
- 黑马程序员--银行业务调度系统总结
- 黑马程序员_银行业务调度系统
- 黑马程序员——银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员-------银行业务调度系统
- 黑马程序员Java培训、Android培训_银行业务调度系统笔记
- 黑马程序员--银行业务调度系统
- 黑马程序员----银行业务调度系统笔记
- 黑马程序员_银行业务调度系统
- 黑马程序员——银行业务调度系统
- 黑马程序员入学篇——(19)银行业务调度系统