这个项目我起先是想到将人设计为一个类,怎么想也想不通,后来看了老师的视频之后,对面向对象有了深的一层的理解。再次要结合现实生活,生活中我们去银行办理业务都需要先进行排号。因此号码成了识别每个顾客的唯一标识。号码这里包括两个:第一是顾客进入银行排的号,第二是窗口服务号码。这两个必须建立联系因此定一个号码管理机器的类
号码管理类:一个很好的list集合应用例子
1 public class NumberManager { 2 private int lastNumber = 0; 3 private List queueNumbers = new ArrayList(); 4 //编号 5 public synchronized Integer generateNewNumber(){ 6 queueNumbers.add(++lastNumber); 7 return lastNumber; 8 } 9 //服务窗口取号的方法! 10 public synchronized Integer fetchNumber(){ 11 if(queueNumbers.size()>0){ 12 return (Integer)queueNumbers.remove(0); 13 }else{ 14 return null; 15 } 16 } 17 }
通过号码机器将号码分为三类
1 public class NumberMachine { 2 3 private NumberMachine(){} 4 private static NumberMachine instance = new NumberMachine(); 5 public static NumberMachine getInstance(){ 6 return instance; 7 } 8 9 private NumberManager commonManager = new NumberManager(); 10 private NumberManager expressManager = new NumberManager(); 11 private NumberManager vipManager = new NumberManager(); 12 public NumberManager getCommonManager() { 13 return commonManager; 14 } 15 public NumberManager getExpressManager() { 16 return expressManager; 17 } 18 public NumberManager getVipManager() { 19 return vipManager; 20 } 21 22 }
定义服务窗口的类
1 public class ServiceWindow { 2 //顾客类型 因为这里顾客类型只有三种 因此设置为泛型 3 private CustomerType type = CustomerType.COMMON; 4 //服务窗口编号 5 private int number = 1; 6 //获取顾客类型的方法 7 public CustomerType getType() { 8 return type; 9 } 10 //设置顾客类型的方法 11 public void setType(CustomerType type) { 12 this.type = type; 13 } 14 //设置服务窗口的方法 15 public void setNumber(int number){ 16 this.number = number; 17 } 18 //窗口工作的方法 19 public void start(){ 20 Executors.newSingleThreadExecutor().execute( 21 new Runnable(){ 22 public void run(){ 23 while(true){ 24 switch(type){ 25 case COMMON: 26 commonService(); 27 break; 28 case EXPRESS: 29 expressService(); 30 break; 31 case VIP: 32 vipService(); 33 break; 34 } 35 } 36 } 37 } 38 ); 39 } 40 41 private void commonService(){ 42 String windowName = "第" + number + "号" + type + "窗口"; 43 System.out.println(windowName + "开始获取普通任务!"); 44 //通过取号获得服务号码 45 Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber(); 46 if(serviceNumber != null ){ 47 System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务"); 48 int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; 49 //设置服务时间 服务时间为最大值和最小值之间的随机值 50 int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; 51 try { 52 Thread.sleep(serviceTime); 53 } catch (InterruptedException e) { 54 e.printStackTrace(); 55 } 56 System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "秒"); 57 }else{ 58 //如果没有任务休息一秒 59 System.out.println(windowName + "没有取到普通任务,正在空闲一秒"); 60 try { 61 Thread.sleep(1000); 62 } catch (InterruptedException e) { 63 e.printStackTrace(); 64 } 65 } 66 } 67 68 private void expressService(){ 69 Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber(); 70 String windowName = "第" + number + "号" + type + "窗口"; 71 System.out.println(windowName + "开始获取快速任务!"); 72 if(serviceNumber !=null){ 73 System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务"); 74 int serviceTime = Constants.MIN_SERVICE_TIME; 75 try { 76 Thread.sleep(serviceTime); 77 } catch (InterruptedException e) { 78 e.printStackTrace(); 79 } 80 System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "秒"); 81 }else{ 82 //如果没有任务为普通用户服务 83 System.out.println(windowName + "没有取到快速任务!"); 84 commonService(); 85 } 86 } 87 88 private void vipService(){ 89 90 Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber(); 91 String windowName = "第" + number + "号" + type + "窗口"; 92 System.out.println(windowName + "开始获取VIP任务!"); 93 if(serviceNumber !=null){ 94 System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务"); 95 int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; 96 int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME; 97 try { 98 Thread.sleep(serviceTime); 99 } catch (InterruptedException e) { 100 e.printStackTrace(); 101 } 102 System.out.println(windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒"); 103 }else{ 104 System.out.println(windowName + "没有取到VIP任务!"); 105 commonService(); 106 } 107 } 108 }
以上只是核心代码,其他代码没有罗列出来。
这个面试题应用到了集合,多线程,面向对象,枚举等知识。比较全面。更需要牢固的Java基础,因此,在后期学习Android的过程一定要及时的回顾Java基础知识。才能在Android学习中游刃有余。