黑马程序员_银行调度系统

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

银行业务调度系统

面向对象的分析与设计

1,有三种对应类型的客户:普通客户、快速客户VIP客户。异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务。

  每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的。所以,我想到要有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。把产生的号码按顺序放到一个集合中。

  由于有三类客户,每类客户的号码编排都是完全独立的,本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码,这三个号码管理器对象统一由一个号码机器进行管理,这个号码及其在整个系统中始终只能有一个,所以,它要被设计成单例。

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

  各窗口根据相应的号码管理器每次找号码管理器获取当前要被服务的号码。这时就可以从集合中取出第一个元素。

代码:

NumberManager类:号码管理器类.

view plaincopy to clipboardprint?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 generateNewManager(){ 
        queueNumber.add(lastNumber); 
        return lastNumber++; 
    } 
    //取出服务号码  
    public synchronized Integer fatchServiceNumber(){ 
        Integer number=null; 
        if(queueNumber.size()>0){ 
            return queueNumber.remove(0); 
        } 
        return number; 
    } 
 

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 generateNewManager(){
  queueNumber.add(lastNumber);
  return lastNumber++;
}
//取出服务号码
public synchronized Integer fatchServiceNumber(){
  Integer number=null;
  if(queueNumber.size()>0){
   return queueNumber.remove(0);
  }
  return number;
}

}

NumberMachine类:号码管理机器

view plaincopy to clipboardprint?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 getInstance(){ 
        return instance; 
    } 
    private static NumberMachine instance=new NumberMachine(); 

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

CustomerType类:  客户类型用枚举来实现。

view plaincopy to clipboardprint?public enum CustomerType { 
    COMMON,EXPRESS,VIP; 
     
    public String toString(){ 
        switch(this){ 
            case COMMON: 
                return "普通"; 
            //  break;  
            case EXPRESS: 
                return "快速"; 
            //  break;  
            case VIP: 
                return name(); 
                 
        } 
        return null; 
    } 
 

public enum CustomerType {
COMMON,EXPRESS,VIP;

public String toString(){
  switch(this){
   case COMMON:
    return "普通";
   // break;
   case EXPRESS:
    return "快速";
   // break;
   case VIP:
    return name();
   
  }
  return null;
}

}

ServiceWindow类: 窗口服务

view plaincopy to clipboardprint?import java.util.Random; 
import java.util.concurrent.Executors; 
 
public class ServiceWindow { 
    private CustomerType type=CustomerType.COMMON;//定义窗口类型  
    private int windowId=1; 
        // TODO: handle exception  
     
    public void setType(CustomerType type) { 
        this.type = type; 
    } 
 
    public void setWindowId(int windowId) { 
        this.windowId = windowId; 
    } 
 
    public void start(){ 
        Executors.newSingleThreadExecutor().execute(new Runnable(){ 
 
            @Override 
            public void run() { 
                // TODO Auto-generated method stub  
                while(true) 
                { 
                    /*switch(int)
                    if(type==CustomerType.COMMON)
                    NumberMachine.getInstance().getCommonManager();
                    else*/ 
                    //switch的数据类型只能是整数,枚举也可以  
                    switch(type){ 
                        case COMMON: 
                            commonService(); 
                            break; 
                        case EXPRESS: 
                            expressService(); 
                            break; 
                        case VIP: 
                            vipService(); 
                            break; 
                     
                    } 
                } 
            }        
        private void commonService() { 
            String windowName="第"+windowId+"号"+type+"窗口"; 
             
            Integer number=NumberMachine.getInstance().getCommonManager().fatchServiceNumber(); 
            System.out.println(windowName+"正在获取任务"); 
            if(number!=null){ 
                System.out.println(windowName+"为第"+number+"个"+"普通"+"客户服务."); 
                long beginTime=System.currentTimeMillis(); 
                //long serveTime=0;  
                int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; 
                long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME; 
                try { 
                    Thread.sleep(serveTime); 
                } catch (InterruptedException e) { 
                    // TODO: handle exception  
                    e.printStackTrace(); 
                } 
                long costTime=System.currentTimeMillis()-beginTime; 
                System.out.println(windowName+"为第"+number+"个"+"普通"+"客户完成服务,耗时"+costTime/1000+"秒"); 
            } 
            else{ 
                System.out.println(windowName+"没有取到服务任务!先休息1秒钟嘛!"); 
                //commonService();  
                try { 
                    Thread.sleep(1000); 
                } catch (InterruptedException e) { 
                    // TODO: handle exception  
                    e.printStackTrace(); 
                } 
            } 
        } 
         
         
        private void expressService() { 
            String windowName="第"+windowId+"号"+type+"窗口"; 
            System.out.println(windowName+"正在获取任务"); 
            Integer number=NumberMachine.getInstance().getExpressManager().fatchServiceNumber(); 
            System.out.println(windowName+"正在获取任务"); 
            if(number!=null){ 
                System.out.println(windowName+"为第"+number+"个"+type+"客户服务."); 
                long beginTime=System.currentTimeMillis(); 
                //long serveTime=0;  
                /*int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
                long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;*/ 
                try { 
                    Thread.sleep(Constants.MIN_SERVICE_TIME); 
                } catch (InterruptedException e) { 
                    // TODO: handle exception  
                    e.printStackTrace(); 
                } 
                long costTime=System.currentTimeMillis()-beginTime; 
                System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒"); 
            } 
            else{ 
                System.out.println(windowName+"没有取到服务任务!"); 
                commonService(); 
                 
            } 
        } 
         
        private void vipService() { 
            String windowName="第"+windowId+"号"+type+"窗口"; 
             
            Integer number=NumberMachine.getInstance().getVipManager().fatchServiceNumber(); 
            System.out.println(windowName+"正在获取任务"); 
            if(number!=null){ 
                System.out.println(windowName+"为第"+number+"个"+type+"客户服务."); 
                long beginTime=System.currentTimeMillis(); 
                //long serveTime=0;  
                int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME; 
                long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME; 
                try { 
                    Thread.sleep(serveTime); 
                } catch (InterruptedException e) { 
                    // TODO: handle exception  
                    e.printStackTrace(); 
                } 
                long costTime=System.currentTimeMillis()-beginTime; 
                System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒"); 
            } 
            else{ 
                System.out.println(windowName+"没有取到服务任务!"); 
                commonService(); 
                 
            } 
        } 
    }); 
    } 
 

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

public class ServiceWindow {
private CustomerType type=CustomerType.COMMON;//定义窗口类型
private int windowId=1;
  // TODO: handle exception

public void setType(CustomerType type) {
  this.type = type;
}

public void setWindowId(int windowId) {
  this.windowId = windowId;
}

public void start(){
  Executors.newSingleThreadExecutor().execute(new Runnable(){

   @Override
   public void run() {
    // TODO Auto-generated method stub
    while(true)
    {
     /*switch(int)
     if(type==CustomerType.COMMON)
     NumberMachine.getInstance().getCommonManager();
     else*/
                 //switch的数据类型只能是整数,枚举也可以
     switch(type){
      case COMMON:
          commonService();
       break;
      case EXPRESS:
       expressService();
          break;
      case VIP:
       vipService();
       break;
    
     }
    }
   } 
  private void commonService() {
   String windowName="第"+windowId+"号"+type+"窗口";
  
   Integer number=NumberMachine.getInstance().getCommonManager().fatchServiceNumber();
   System.out.println(windowName+"正在获取任务");
   if(number!=null){
    System.out.println(windowName+"为第"+number+"个"+"普通"+"客户服务.");
    long beginTime=System.currentTimeMillis();
    //long serveTime=0;
    int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
    long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
    try {
     Thread.sleep(serveTime);
    } catch (InterruptedException e) {
     // TODO: handle exception
     e.printStackTrace();
    }
    long costTime=System.currentTimeMillis()-beginTime;
    System.out.println(windowName+"为第"+number+"个"+"普通"+"客户完成服务,耗时"+costTime/1000+"秒");
   }
   else{
    System.out.println(windowName+"没有取到服务任务!先休息1秒钟嘛!");
    //commonService();
    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     // TODO: handle exception
     e.printStackTrace();
    }
   }
  }
 
 
  private void expressService() {
   String windowName="第"+windowId+"号"+type+"窗口";
   System.out.println(windowName+"正在获取任务");
   Integer number=NumberMachine.getInstance().getExpressManager().fatchServiceNumber();
   System.out.println(windowName+"正在获取任务");
   if(number!=null){
    System.out.println(windowName+"为第"+number+"个"+type+"客户服务.");
    long beginTime=System.currentTimeMillis();
    //long serveTime=0;
    /*int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
    long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;*/
    try {
     Thread.sleep(Constants.MIN_SERVICE_TIME);
    } catch (InterruptedException e) {
     // TODO: handle exception
     e.printStackTrace();
    }
    long costTime=System.currentTimeMillis()-beginTime;
    System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
   }
   else{
    System.out.println(windowName+"没有取到服务任务!");
    commonService();
   
   }
  }
 
  private void vipService() {
   String windowName="第"+windowId+"号"+type+"窗口";
  
   Integer number=NumberMachine.getInstance().getVipManager().fatchServiceNumber();
   System.out.println(windowName+"正在获取任务");
   if(number!=null){
    System.out.println(windowName+"为第"+number+"个"+type+"客户服务.");
    long beginTime=System.currentTimeMillis();
    //long serveTime=0;
    int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
    long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
    try {
     Thread.sleep(serveTime);
    } catch (InterruptedException e) {
     // TODO: handle exception
     e.printStackTrace();
    }
    long costTime=System.currentTimeMillis()-beginTime;
    System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒");
   }
   else{
    System.out.println(windowName+"没有取到服务任务!");
    commonService();
   
   }
  }
});
}

}

Constants类:一些固定的数据可以用常量来表示

view plaincopy to clipboardprint?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; 
 

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;

}

MainClass类: 银行运行过程

view plaincopy to clipboardprint?import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 
 
public class MainClass { 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub  
          
        for(int i=1;i<5;i++) 
        { 
            ServiceWindow commonWindow=new ServiceWindow(); 
            commonWindow.setWindowId(i); 
            commonWindow.start(); 
        } 
        ServiceWindow vipWindow=new ServiceWindow(); 
        vipWindow.setType(CustomerType.VIP); 
        //vipWindow.setWindowId(6);  
        vipWindow.start(); 
         
        ServiceWindow expressWindow=new ServiceWindow(); 
        expressWindow.setType(CustomerType.EXPRESS); 
        expressWindow.start(); 
         
         
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate( 
                new Runnable(){ 
 
                    @Override 
                    public void run() { 
                        // TODO Auto-generated method stub  
                        Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager(); 
                        System.out.println(number+"号普通客户等待服务!"); 
                    } 
                     
                },  
                0,  
                Constants.COMMON_CUSTOMER_INTERVAL_TIME,  
                TimeUnit.SECONDS); 
         
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate( 
                new Runnable(){ 
 
                    @Override 
                    public void run() { 
                        // TODO Auto-generated method stub  
                        Integer number=NumberMachine.getInstance().getVipManager().generateNewManager(); 
                        System.out.println(number+"号vip客户等待服务!"); 
                         
                    } 
                     
                },  
                0,  
                Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,  
                TimeUnit.SECONDS); 
         
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate( 
                new Runnable(){ 
 
                    @Override 
                    public void run() { 
                        // TODO Auto-generated method stub  
                        Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager(); 
                        System.out.println(number+"号快速客户等待服务!"); 
                         
                    } 
                     
                },  
                0,  
                Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,  
                TimeUnit.SECONDS); 
 
    } 
 


根据需求,有三种对应类型的客户:VIP客户,普通客户,快速客户定义一个NumberMachine类这个类描述了产生客户和通过方法怎么得到这三个客户

package cn.itcast.test;

public class NumberMachine {

private NumberMachine(){}//构造函数私有化是因为要固定产生三个客户!
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
  return instance;
}

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;
}
}


NumberManager 类是机器产生号码的类,

package cn.itcast.test;

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

public class NumberManager {
private int lastNumber = 0;
private List queueNumbers = new ArrayList();
//多线程的同步
public synchronized Integer generateNewNumber(){
  queueNumbers.add(++lastNumber);
  return lastNumber;
}

public synchronized Integer fetchNumber(){
  if(queueNumbers.size()>0){
   return (Integer)queueNumbers.remove(0);
  }else{
   return null;
  }
}
}

------------------------------ android培训 java培训 期待与您交流! ----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值