这个项目我起先是想到将人设计为一个类,怎么想也想不通,后来看了老师的视频之后,对面向对象有了深的一层的理解。再次要结合现实生活,生活中我们去银行办理业务都需要先进行排号。因此号码成了识别每个顾客的唯一标识。号码这里包括两个:第一是顾客进入银行排的号,第二是窗口服务号码。这两个必须建立联系因此定一个号码管理机器的类

号码管理类:一个很好的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学习中游刃有余。

posted on 2012-06-25 20:03  Lincon Ma  阅读(142)  评论(0编辑  收藏  举报