黑马程序员Java学习-银行业务调度系统总结

来源:互联网 发布:概率中a的算法 编辑:程序博客网 时间:2024/06/04 18:05




---------------------- android培训、java培训、期待与您交流! ----------------------

传说中的银行业务调度系统又重出江湖啦!

张老师说这句话说了很多次了,由此可见,这道题以后面试时是十分有用的,下面来总结一下这节里面学习的内容:

我们来用面向对象的分析与设计,分析其中有多少类,以及多少对象,和他们之间的关系。     

银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。

  有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。

  异步随机生成各种类型的客户,生成各类型用户的概率比例为:

        VIP客户 :普通客户 :快速客户  =  1 6 3

  客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。

  各类型客户在其对应窗口按顺序依次办理业务。

  VIP6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

  随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。 



要进行面向对象的程序设计,一定要深入了解你要进行模拟的系统的各个功能流程,这样你才能够设计出好的面向对象设计。
代码如下:
package com.isoftstone.interview.bank;
 
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 generatorNewManager(){//自动生成号码
       queueNumber.add(lastNumber);
       return lastNumber++;
    }
   
    public synchronized Integer fetchNumberServiceNumber(){
       Integer number=null;
       if(queueNumber.size()>0){
           number=queueNumber.remove(0);//取走队首的号码
       }
       return number;
    }
}
 
package com.isoftstone.interview.bank;
 
public class NumberMachine {
    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;
    }
   
    private NumberMachine(){}
    private static NumberMachine instance=new NumberMachine();
    public static NumberMachine getInstance(){
       return instance;
    }
}
 
package com.isoftstone.interview.bank;
 
public class Constants {
    public static int MAX_SERVICE_TIME=10000;
    public static int MIN_SERVICE_TIME=1000;
   
    public static int COMMON_CUSTOMER_INTERVAL_TIME=1;//普通客户
}
 
 
package com.isoftstone.interview.bank;
 
public enum CustomerType {
    COMMON, EXPRESS, VIP;
    public String toString() {
       switch (this) {
       case COMMON:
           return "普通";
       case EXPRESS:
           return "快速";
       case VIP:
           return name();
       }return null;
    }
}
 
 
package com.isoftstone.interview.bank;
 
import java.util.Random;
import java.util.concurrent.Executors;
 
public class ServiceWindow {
    private CustomerType type=CustomerType.COMMON;
    public void setType(CustomerType type) {
       this.type = type;
    }
 
    public void setWindowId(int windowId) {
       this.windowId = windowId;
    }
 
    private int windowId=1;
   
    public void start(){
       //使用线程,启动吧//线程池,线程池在里面找到一个空闲的线程
       Executors.newSingleThreadExecutor().execute(new Runnable() {
          
           @Override
           public void run() {
              while(true){
                  switch (type) {//switch(n)也可以使用枚举值,
                  case COMMON:
                     commonService();
                     break;
                  case EXPRESS:
                     expressService();
                     break;
                  case VIP:
                     vipService();
                     break;
                  }
                  NumberMachine.getInstance().getCommonManager();
              }
             
           }         
       });
    }
    private void commonService() {
       String windowName="第"+windowId+"号"+type+"窗口";    
       Integer number=NumberMachine.getInstance().getCommonManager().fetchNumberServiceNumber();
       System.out.println(windowName+"正在获取任务");
       if(number!=null){
           System.out.println(windowName+"为第"+number
                  +"个"+"普通"+"客户服务");
           long beginTime= System.currentTimeMillis();
           int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//9000
           long serviceTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
          
           try {
              Thread.sleep(serviceTime);
           } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
          
           long costTime= System.currentTimeMillis()-beginTime;
           System.out.println(windowName+"为第"+number
                  +"个"+"普通"+"客户完成服务,耗时"
                  +(costTime/1000)+"秒");
       }else{
           System.out.println(windowName+"没有取到任务,先休息1秒钟!");
           try {
              Thread.sleep(1000);
           } catch (InterruptedException e) {
               // TODO Auto-generated catch block
              e.printStackTrace();
           }
       }
    }
   
    private void expressService() {
       String windowName="第"+windowId+"号"+type+"窗口";    
       Integer number=NumberMachine.getInstance().getExpressManager().fetchNumberServiceNumber();
       System.out.println(windowName+"正在获取任务");
       if(number!=null){
           System.out.println(windowName+"为第"+number
                  +"个"+type+"客户服务");
           long beginTime= System.currentTimeMillis();
           //int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//9000
           //long serviceTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
          
           try {
              Thread.sleep(Constants.MIN_SERVICE_TIME);
           } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
          
           long costTime= System.currentTimeMillis()-beginTime;
           System.out.println(windowName+"为第"+number
                  +"个"+type+"客户完成服务,耗时"
                  +(costTime/1000)+"秒");
       }else{
           System.out.println(windowName+"没有取到任务,先休息1秒钟!");
           commonService();//express没有客户的时候,处理普通客户
       }
    }
   
    private void vipService() {
       String windowName="第"+windowId+"号"+type+"窗口";    
       Integer number=NumberMachine.getInstance().getVipManager().fetchNumberServiceNumber();
       System.out.println(windowName+"正在获取任务");
       if(number!=null){
           System.out.println(windowName+"为第"+number
                  +"个"+type+"客户服务");
           long beginTime= System.currentTimeMillis();
           int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//9000
           long serviceTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
          
           try {
              Thread.sleep(serviceTime);
           } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
          
           long costTime= System.currentTimeMillis()-beginTime;
           System.out.println(windowName+"为第"+number
                  +"个"+type+"客户完成服务,耗时"
                  +(costTime/1000)+"秒");
       }else{
           System.out.println(windowName+"没有取到任务!");
           commonService();//vip没有客户的时候,处理普通客户        
       }
    }
}
 
 
package com.isoftstone.interview.bank;
 
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
 
public class MainClass {
 
   
    public static void main(String[] args) {
       for(int i=1;i<5;i++){
       ServiceWindow commonWindow=new ServiceWindow();
       commonWindow.setWindowId(i);
       commonWindow.start();          
       }
      
       ServiceWindow expressWindow=new ServiceWindow();
       expressWindow.setType(CustomerType.EXPRESS);
       expressWindow.start();
      
       ServiceWindow vipWindow=new ServiceWindow();
       vipWindow.setType(CustomerType.VIP);
       vipWindow.start();
      
       //异步随机生成各种类型的客户,生成各种类型用户的概率比例vip:comm:express=1:6:3
       //普通
       Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
              new Runnable(){
 
                  @Override
                  public void run() {
                     //叫号
                     Integer number=NumberMachine.getInstance().getCommonManager().generatorNewManager();
                     System.out.println("第"+number+"号普通客户正在等待服务!");
                  }
                 
              },
              0,//过多长时间来
              Constants.COMMON_CUSTOMER_INTERVAL_TIME,//
              TimeUnit.SECONDS);//确定来的时间
      
       //快速
       Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
              new Runnable(){
 
                  @Override
                  public void run() {
                     //叫号
                     Integer number=NumberMachine.getInstance().getExpressManager().generatorNewManager();
                     System.out.println("第"+number+"号普通客户正在等待服务!");
                  }
                 
              },
              0,//过多长时间来
              Constants.COMMON_CUSTOMER_INTERVAL_TIME*3,//
              TimeUnit.SECONDS);//确定来的时间
      
       //vip
       Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
              new Runnable(){
 
                  @Override
                  public void run() {
                     //叫号
                     Integer number=NumberMachine.getInstance().getVipManager().generatorNewManager();
                     System.out.println("第"+number+"号vip客户正在等待服务!");
                  }
                 
              },
              0,//过多长时间来
              Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,//
              TimeUnit.SECONDS);//确定来的时间
      
    }
 
}




---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
原创粉丝点击