面向对象设计:

 

1.定义一个NumberManager类 用于管理客户服务号码

 

 属性:int lastNumber   用于保存上一个客户号码

 

            List<Integer> queueNumber  用于存储客户队列的集合

 

方法:Integer generateNewNumber()  将客户号码加入排队队列

 

           Integer fecthServiceNumber()   用于返回队列第一位的客户号

 

代码实现:

 

package com.tiheima.bank;

import java.util.ArrayList;
import java.util.List;

publicclassNumberManager{
 privateint lastNumber =1;
 privateList<Integer> queueNumber =newArrayList<Integer>();
 publicsynchronizedInteger generateNewNumber(){
  queueNumber.add(lastNumber);
  return lastNumber++;
 }
 
 publicsynchronizedInteger fecthServiceNumber(){
  Integer number =null;
  if(queueNumber.size()>0)
  number = queueNumber.remove(0);
  return number;
 }

}

2,定义一个NumberMachine类 做为取号机管理三个号码管理器  设计为单例模式
属性(分别为三个类型的号码管理器):NumberManager commonManager    
  NumberManager expressManager

  NumberManager vipManager
方法:三个getter方法分别获得三个类型的号码管理器
代码实现:

package com.tiheima.bank;

publicclassNumberMachine{
 privateNumberManager commonManager =newNumberManager();
 privateNumberManager expressManager =newNumberManager();
 privateNumberManager vipManager =newNumberManager();
 publicNumberManager getCommonManager(){
  return commonManager;
 }
 publicNumberManager getExpressManager(){
  return expressManager;
 }
 publicNumberManager getVipManager(){
  return vipManager;
 }
 privateNumberMachine(){};
 publicstaticNumberMachine getNumberchine(){
  return instance;
 }
 privatestaticNumberMachine instance =newNumberMachine();
 
 
}


3,设计一个ServiceWindow类,作为窗口
属性:CustomerType type  窗口类型
     int windowId       窗口编号
方法:start() 内建一个线程,根据窗口类型循环调用窗口服务方法
     三个窗口服务方法分别用于普通,快速,vip窗口
代码实现:

package com.tiheima.bank;

import java.util.Random;
import java.util.concurrent.Executors;

publicclassServiceWindow{
 privateCustomerType type =CustomerType.COMMON;
 privateint windowId =1;
 publicvoid setType(CustomerType type){
  this.type = type;
 }
 publicvoid setWindowId(int windowId){
  this.windowId = windowId;
 }
 
 publicvoid start(){
  Executors.newSingleThreadExecutor().execute(
    newRunnable(){
     publicvoid run(){
      while(true){
       switch(type){
       case COMMON:
        commomService();
        break;
       case EXPRESS:
        expressService();
        break;
       case VIP:
        vipService();
        break;
        
       }
       
      }
     }
    }
    );
 }
 
 privatevoid commomService(){
  String windowName ="第"+windowId+"号"+type+"窗口";
  System.out.println(windowName+"正在获取普通任务");
  Integer serviceNumber =NumberMachine.getNumberchine().getCommonManager().fecthServiceNumber();
  if(serviceNumber!=null){
   System.out.println(windowName+"开始为第"+serviceNumber+"号普通客户服务");
   int maxRandomTime =Constants.MAX_SERVICE_TIME-Constants.MIN_SERIVCE_TIME;
   int serviceTime =newRandom().nextInt(maxRandomTime)+1+Constants.MIN_SERIVCE_TIME;
   try{
    Thread.sleep(serviceTime);
   }catch(InterruptedException e){
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   System.out.println(windowName+"完成为第"+serviceNumber+"号普通客户的服务,耗时"+serviceTime/1000+"秒");
  }else{
   System.out.println(windowName+"没有获取到任务,正在空闲一秒");
   try{
    Thread.sleep(1000);
   }catch(InterruptedException e){
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
 privatevoid expressService(){
  String windowName ="第"+windowId+"号"+type+"窗口";
  System.out.println(windowName+"正在获取快速任务");
  Integer serviceNumber =NumberMachine.getNumberchine().getExpressManager().fecthServiceNumber();
  if(serviceNumber!=null){
   System.out.println(windowName+"开始为第"+serviceNumber+"号快速客户服务");
   int serviceTime =Constants.MIN_SERIVCE_TIME;
   try{
    Thread.sleep(serviceTime);
   }catch(InterruptedException e){
    e.printStackTrace();
   }
   System.out.println(windowName+"完成为第"+serviceNumber+"快速客户的服务,耗时"+serviceTime/1000+"秒");
  }else{
   System.out.println(windowName+"没有获取到快速任务");
   commomService();
   }
 }
 
 privatevoid vipService(){
  String windowName ="第"+windowId+"号"+type+"窗口";
  System.out.println(windowName+"正在获取VIP任务");
  Integer serviceNumber =NumberMachine.getNumberchine().getVipManager().fecthServiceNumber();
  if(serviceNumber!=null){
   System.out.println(windowName+"开始为第"+serviceNumber+"号VIP客户服务");
   int maxRandomTime =Constants.MAX_SERVICE_TIME-Constants.MIN_SERIVCE_TIME;
   int serviceTime =newRandom().nextInt(maxRandomTime)+1+Constants.MIN_SERIVCE_TIME;
   try{
    Thread.sleep(serviceTime);
   }catch(InterruptedException e){
    e.printStackTrace();
   }
   System.out.println(windowName+"完成为第"+serviceNumber+"VIP客户的服务,耗时"+serviceTime/1000+"秒");
  }else{
   System.out.println(windowName+"没有获取到VIP任务");
   commomService();
  
  }
 }
}


4,设计一个MainClass类  创建6个窗口 创建3个定时器定时创建3种客户号码  运行程序
代码实现:

package com.tiheima.bank;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

publicclassMainClass{

 /**
  * @param args
  */
 publicstaticvoid main(String[] args){
  for(int i =1; i <5; i++){
   ServiceWindow window =newServiceWindow();
   window.setWindowId(i);
   window.start();
   
  }
  
  ServiceWindow expressWindow =newServiceWindow();
  expressWindow.setType(CustomerType.EXPRESS);
  expressWindow.start();
  
  ServiceWindow vipWindow =newServiceWindow();
  vipWindow.setType(CustomerType.VIP);
  vipWindow.start();
  
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    newRunnable(){
     publicvoid run(){
      Integer serviceNumber =NumberMachine.getNumberchine().getCommonManager().generateNewNumber();
      System.out.println("第"+serviceNumber+"号普通客户正在等待服务");
     }
    },
    0,
    Constants.COMMON_TIME,
    TimeUnit.SECONDS);
  
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    newRunnable(){
     publicvoid run(){
      Integer serviceNumber =NumberMachine.getNumberchine().getExpressManager().generateNewNumber();
      System.out.println("第"+serviceNumber+"号快速客户正在等待服务");
     }
    },
    0,
    Constants.COMMON_TIME*2,
    TimeUnit.SECONDS);
  
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    newRunnable(){
     publicvoid run(){
      Integer serviceNumber =NumberMachine.getNumberchine().getVipManager().generateNewNumber();
      System.out.println("第"+serviceNumber+"号VIP客户正在等待服务");
     }
    },
    0,
    Constants.COMMON_TIME*6,
    TimeUnit.SECONDS);

 }

}