黑马程序员-Java银行业务调度系统

项目分析:

项目中用到的对象:号码、取号机、窗口、顾客的类型。因为项目的侧重点不在“顾客”,所以顾客不作为一个单独的对象,而是和号码对象结合在了一起,号码对象可以产生新号码,则产生的新号码就相当于来了一位顾客。

分析每个对象因该有的属性和方法:

1、号码

号码对象因该有两个方法,首先它因该有产生一个新号码的方法,表示来了一位顾客,其次它因该有一个向窗口提供号码的方法。当然它也必须有自己的属性来记录产生的新号码,以及因该给窗口提供的号码。

2、取号机

首先一个银行因该只有一个取号机,说以取号机对象因该做成一个单例模式。因为顾客分三种,则取号机因该向外提供三种不同的号码对象。所以取号机不产生号码,它只是提供三种不同的号码对象,号码对象可以产生新号码。

3、窗口

窗口也分三中,则它因该有一个属性决定此窗口是何种类型的,因为同一中类型的窗口可能会存在多个,则每个窗口都要有自己的ID以区分彼此。窗口还要提供一个为顾客服务的方法,并且会根据不同的顾客提供不同的服务。

4、顾客类型

因为顾客类型只有三种,所以顾客类型因该设计成一个枚举类型。然后让其他类调用。


以下是项目的代码实现:

1、号码类

[java]  view plain copy
  1. package com.hbsi.interview.bank;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. public class NumberManager {  
  7.     private int lastNumber = 1;  
  8.     private List<Integer> queueNumber = new ArrayList<Integer>();  
  9.       
  10.     //产生一个新的号码  
  11.     public synchronized Integer generateNewNumber(){  
  12.         queueNumber.add(lastNumber);  
  13.         return lastNumber++;  
  14.     }  
  15.     //向窗口提供一个号码  
  16.     public synchronized Integer fetchServiceNumber(){  
  17.         if(queueNumber.size()!=0){  
  18.             return queueNumber.remove(0);  
  19.         }else{  
  20.             return null;  
  21.         }  
  22.     }  
  23.       
  24. }  

2、取号机

[java]  view plain copy
  1. package com.hbsi.interview.bank;  
  2.   
  3. public class NumberMachine {  
  4.     //创建三种不同的号码类型  
  5.     private NumberManager commonManager = new NumberManager();  
  6.     private NumberManager expressManager = new NumberManager();  
  7.     private NumberManager vipManager = new NumberManager();  
  8.     private static NumberMachine instance = new NumberMachine();  
  9.     //向外提供获得不同号码类型的方法  
  10.     public NumberManager getCommonManager() {  
  11.         return commonManager;  
  12.     }  
  13.     public NumberManager getExpressManager() {  
  14.         return expressManager;  
  15.     }  
  16.     public NumberManager getVipManager() {  
  17.         return vipManager;  
  18.     }  
  19.     private NumberMachine(){  
  20.           
  21.     }  
  22.     //用单例模式实现产生号码数据的一致性  
  23.     public static NumberMachine getInstance(){  
  24.         return instance;  
  25.     }  
  26. }  

3、窗口

[java]  view plain copy
  1. package com.hbsi.interview.bank;  
  2.   
  3. import java.util.Random;  
  4. import java.util.concurrent.ExecutorService;  
  5. import java.util.concurrent.Executors;  
  6. public class ServicesWindow {  
  7.     //用来标记窗口的类型  
  8.     CustomerType type = CustomerType.COMMON;  
  9.     //标记窗口的ID  
  10.     private int windowId = 1;  
  11.     public void setType(CustomerType type) {  
  12.         this.type = type;  
  13.     }  
  14.     public void setWindowId(int windowId) {  
  15.         this.windowId = windowId;  
  16.     }  
  17.     //启动窗口的服务  
  18.     public void start(){  
  19.         Executors.newSingleThreadExecutor().execute(new Runnable(){  
  20.             @Override  
  21.               
  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.     //为普通客户服务的方法  
  42.     public void commonService(){  
  43.         String windowName = "第"+windowId+"号"+type+"窗口";  
  44.         System.out.println(windowName+"正在获取普通用户的任务。");  
  45.         Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();  
  46.         if(number!=null){  
  47.             System.out.println(windowName+"正在处理普通用户"+number+"的任务。");  
  48.             int time = 0;  
  49.             try {  
  50.                 int x = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  51.                 time = new Random().nextInt(x+1)+Constants.MIN_SERVICE_TIME;  
  52.                 Thread.sleep(time);  
  53.             } catch (InterruptedException e) {  
  54.                 e.printStackTrace();  
  55.             }  
  56.               
  57.             System.out.println(windowName+"处理完了普通用户"+number+",用了"+time/1000+"秒");  
  58.         }else{  
  59.             System.out.println(windowName+"没有获取到普通用户的任务,休息一秒再取吧!");  
  60.             try {  
  61.                 Thread.sleep(1000);  
  62.             } catch (InterruptedException e) {  
  63.                 e.printStackTrace();  
  64.             }  
  65.         }  
  66.     }  
  67.     //为快速客户服务的方法  
  68.     public void expressService(){  
  69.         String windowName = "第"+windowId+"号"+type+"窗口";  
  70.         System.out.println(windowName+"正在获取快速用户任务。");  
  71.         Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();  
  72.         if(number!=null){  
  73.             System.out.println(windowName+"正在处理快速用户"+number+"的任务。");  
  74.             long time =0;  
  75.             try {  
  76.                   
  77.                 time = Constants.MIN_SERVICE_TIME;  
  78.                 Thread.sleep(time);  
  79.             } catch (InterruptedException e) {  
  80.                 e.printStackTrace();  
  81.             }  
  82.             System.out.println(windowName+"处理完了快速用户"+number+",用了"+time/1000+"秒");  
  83.         }else{  
  84.             System.out.println(windowName+"没有获取到快速任务,开始取普通任务");  
  85.             commonService();  
  86.         }  
  87.     }  
  88.     //为VIP客户服务的方法  
  89.     public void vipService(){  
  90.         String windowName = "第"+windowId+"号"+type+"窗口";  
  91.         System.out.println(windowName+"正在获取VIP用户任务。");  
  92.         Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();  
  93.         if(number!=null){  
  94.             System.out.println(windowName+"正在处理VIP用户"+number+"的任务。");  
  95.             long time =0;  
  96.             try {  
  97.                 int x = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;  
  98.                 time = new Random().nextInt(x+1)+Constants.MIN_SERVICE_TIME;  
  99.                 Thread.sleep(time);//new Random().nextInt(10)  
  100.             } catch (InterruptedException e) {  
  101.                 e.printStackTrace();  
  102.             }  
  103.           
  104.             System.out.println(windowName+"处理完了VIP用户"+number+"的任务,用了"+time/1000+"秒");  
  105.         }else{  
  106.             System.out.println(windowName+"没有获取到VIP用户的任务,开始取普通任务");  
  107.             commonService();  
  108.         }  
  109.     }  
  110.       
  111.       
  112. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值