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

来源:互联网 发布:solaris linux 区别 编辑:程序博客网 时间:2024/04/28 17:38

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


1.银行业务需求分析

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

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

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

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

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

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

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

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

不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


2.面向对象设计与分析

我们生活中去银行办理业务的时候,都是通过一个取号机,来产生用户的,所以要设计以个号码管理机器的对象

三种不同的用户类型,他们之间相互是独立的,各自管理自己的用户的产生,所以要有三个用户号码管理对象,这三个号码管理器同时被一个号码机器所管理  号码机器在本系统中只有一个所以要把它设计成单例模式。

客户在办理业务时,都要等着窗口叫号,才能办理业务。此时,号码机器是提供号码的对象  它应该提供叫号的方法,每个窗口通过这个方法来叫号。


3.代码实现

取号机NumberManager

package com.chongchong.interview;import java.util.ArrayList;import java.util.List;/** * 取号机 * @author hao *  *里面提供了 用户取号   窗口取号 */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 fetchServiceNumber(){if(queueNumber.size()>0){return (Integer)queueNumber.remove(0);}else{return null;}}}

号码管理机器NumberMachine

package com.chongchong.interview;/** * 号码机器 * @author hao *产生三种用户类型对象   机器在系统中只有一个   要设计成单例模式 */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 final NumberMachine instance = new NumberMachine();public static NumberMachine getInstance (){return instance;}}

窗口服务ServiceWindow

package com.chongchong.interview;import java.util.Random;import java.util.concurrent.Executors;/** * 用户窗口 * @author hao * *不同类型窗口  取号的过程  耗时    */public class ServiceWindow {private CustomerType type = CustomerType.COMMON;private int windowNumber = 1;public CustomerType getType() {return type;}public void setType(CustomerType type) {this.type = type;}public int getWindowNumber() {return windowNumber;}public void setWindowNumber(int windowNumber) {this.windowNumber = windowNumber;}public void start(){Executors.newSingleThreadExecutor().execute(new Runnable() {public void run() {while(true){switch (type) {case COMMON:commonService();  break;case EXPRESS:expressService();break;case VIP:vipService();break;}}}});}//vip窗口叫号private void vipService() {String costomerType = type.VIP.getName();System.out.println(costomerType+windowNumber+"窗口叫号是否有客户"); Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber(); if(number!=null) { System.out.println("第"+number+costomerType+"正在"+windowNumber+"号"+type.getName()+"窗口"+"办理业务");int randomTime = ServiceTime.MAX_SERVICETIME-ServiceTime.MIN_SERVICETIME;int serviceTime = new Random().nextInt(randomTime)+ ServiceTime.MIN_SERVICETIME; try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("第"+number+"号"+costomerType+"在"+windowNumber+"号"+type.getName()+"窗口"+"办理完业务........耗时"+serviceTime/1000+"秒"); }else{ System.out.println("第"+windowNumber+"号窗口没有得到"+costomerType+"将为普通用户服务!!!"); commonService(); }}//快速窗口叫号private void expressService() {String costomerType = type.EXPRESS.getName();System.out.println(costomerType+windowNumber+"窗口叫号是否有客户"); Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); if(number!=null) { System.out.println("第"+number+costomerType+"正在"+windowNumber+"号"+type.getName()+"窗口"+"办理业务");int serviceTime = ServiceTime.MIN_SERVICETIME; try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("第"+number+"号"+costomerType+"在"+windowNumber+"号"+type.getName()+"窗口"+"办理完业务........耗时"+serviceTime/1000+"秒"); }else{ System.out.println("第"+windowNumber+"号窗口没有得到"+costomerType+"将为普通用户服务!!!"); commonService(); }}//普通窗口叫号private void commonService() {String costomerType = type.COMMON.getName();System.out.println(type.getName()+windowNumber+"窗口叫号是否有客户"); Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); if(number!=null) { System.out.println("第"+number+costomerType+"正在"+windowNumber+"号"+type.getName()+"窗口"+"办理业务");int randomTime = ServiceTime.MAX_SERVICETIME-ServiceTime.MIN_SERVICETIME;int serviceTime = new Random().nextInt(randomTime)+ ServiceTime.MIN_SERVICETIME; try {Thread.sleep(serviceTime);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("第"+number+"号"+costomerType+"在"+windowNumber+"号"+type.getName()+"窗口"+"办理完业务........耗时"+serviceTime/1000+"秒"); }else{ System.out.println("第"+windowNumber+"号窗口没有得到客户 休息一下下"); try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}}

运行部分结果

第4号快速用户   正在5号快速用户   窗口办理业务
第8号普通客户正在等待服务!
第2号普通用户   在5号VIP用户   窗口办理完业务........耗时6秒
VIP用户   5窗口叫号是否有客户
第2VIP用户   正在5号VIP用户   窗口办理业务
普通用户   1窗口叫号是否有客户
第8普通用户   正在1号普通用户   窗口办理业务
普通用户   2窗口叫号是否有客户
第2号窗口没有得到客户 休息一下下
第7号普通用户   在4号普通用户   窗口办理完业务........耗时1秒
普通用户   4窗口叫号是否有客户
第4号窗口没有得到客户 休息一下下
第4号快速用户   在5号快速用户   窗口办理完业务........耗时1秒
快速用户   5窗口叫号是否有客户
第5号窗口没有得到快速用户   将为普通用户服务!!!

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

0 0
原创粉丝点击