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

来源:互联网 发布:美工刀片哪个牌子最好 编辑:程序博客网 时间:2024/04/30 12:34
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
面向对象设计:
1.定义一个NumberManager类 用于管理客户服务号码
 属性:int lastNumber   用于保存上一个客户号码
            List<Integer> queueNumber  用于存储客户队列的集合
方法:Integer generateNewNumber()  将客户号码加入排队队列
           Integer fecthServiceNumber()   用于返回队列第一位的客户号
代码实现:

package com.tiheima.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 generateNewNumber(){
  queueNumber.add(lastNumber);
  return lastNumber++;
 }
 
 public synchronized Integer 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;

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(){};
 public static NumberMachine getNumberchine(){
  return instance;
 }
 private static NumberMachine instance = new NumberMachine();
 
 
}


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

package com.tiheima.bank;

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

public class ServiceWindow {
 private CustomerType type = CustomerType.COMMON;
 private int windowId = 1;
 public void setType(CustomerType type) {
  this.type = type;
 }
 public void setWindowId(int windowId) {
  this.windowId = windowId;
 }
 
 public void start(){
  Executors.newSingleThreadExecutor().execute(
    new Runnable(){
     public void run(){
      while(true){
       switch(type){
       case COMMON:
        commomService();
        break;
       case EXPRESS:
        expressService();
        break;
       case VIP:
        vipService();
        break;
        
       }
       
      }
     }
    }
    );
 }
 
 private void 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 = new Random().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();
   }
  }
 }
 
 private void 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();
   }
 }
 
 private void 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 = new Random().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;

public class MainClass {

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

 }

}



---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net


0 0