java面试题之二 银行业务调度系统

老板做人不错,做事条理清晰,自己有技术

 

银行业务调度系统

一、面向对象的分析和设计

       1、客户取号

1)、过程:客户——>取号机——>号码管理器生成号码

2)、号码管理器的设计

a) 号码管理器的任务

号码管理器要有一个变量记住产生的号码 ( int number ),产生号码后将保存,在窗口空闲时将保存的号码交给窗口。

       b) 号码管理器的成员:

属性:1、记住号码的int变量,

2、1个集合,用于保存产生的号码,

3、号码管理器的类型

                            方法:1、将号码保存起来的方法

              2、向窗口送出号码的方法

              3)、取号机的设计        

a) 取号机异步生成3种类型的号码:普通客户号码,快速客户号码,vip客户号码,所以取号机中有三号码管理器。

b) 并且取号机只有一个,所以要设计成单例。

                     c) 单例

                            私有构造函数

                            建立静态的私有的本类对象

                            设置静态的共有的get方法得到本类对象

       2、窗口为客户提供服务

1) 过程:获取号码——>获取到号码——提供服务——>完成——>获取号码 

                                     没有获取到号码——等待1s——>获取号码 

2) 窗口的设计

a) 窗口分析

窗口分普通窗口(4个),快速窗口,vip窗口。3种类型的窗口提供服务的过程( 1)表示的过程)是一样的不同的是,他们服务的对象是由不同的号码管理器送来的,可以在建立对象时由构造函数传入号码管理器并且窗口有自己的名称和类型。

              b) 窗口成员

                     属性:名称,类型

                     方法(功能):服务的功能

 

细节:

1、独立线程

使用线程池Executor.newSingleThreadExecutor().execute(command)

2、集合中没有int,取不到号码,会发生空指针异常,所以要将取号的返回类型用Integer包装

3、执行时间:System.currentTimeMillis,它的返回值是long

4、定义最大时间、最小时间随机时间

i.MAX_SERVICE_TIME——>a

ii.MIN_SERVICE_TIME——>i

iii.随机时间:new Random().nextInt(a-i) + 1/*1到9000的一个随机值*/+ i

5、new Runnable(){},Runnable的匿名子类对象。

6、将vip窗口和快速窗口设置成普通窗口的子类

2、 

二 代码模块:

       1、服务过程图例

       java面试题之二 银行业务调度系统_第1张图片

2、号码管理NumberManager

3、取号机NumberMachine

4、窗口

5、主程序

代码:

号码管理器:NumberManager

public class NumberManager{

       private int lastNumber = 1 ;

       //定义排队的集合

private List queueNumber = new ArrayList() ;

      

//生成号码的方法

//两个线程访问相同的数据,要使用同步

public synchroized Integer generateNewManager(){

              queueNumber.add(lastNumber);

return lastNumber++ ;

}

//给窗口号码的方法

public synchroized Integer fetchServiceNumber(){

return lastNumber.remove(0) ;

}

}

取号NumberMachine

public class NumberMachine{

       //创建要用的变量,并提供公共的访问方法

private NumberManager commonManager= new NunberManager() ;

       private NumberManager expressManager= new NunberManager() ;

       private NumberManager vipManager= new NunberManager() ;

      

       public NumberManager getCommonManager(){

              return commonManager ;

}

       public NumberManager getCommonManager(){

              return expressManager;

}

       public NumberManager getCommonManager(){

              return vipManager;

}

 

//单例

private NumberMachine(){}

public static NumberMachine getInstance(){

       return intstance ;

}

       private static NumberMachint instance = new NumberMachine() ;

}

窗口:window(1~4个普通窗口,5好快速窗口,6vip窗口)

       public class Window{

              //属性:名称和类型以及get、set方法

              private String windowId ;

              public void setWindowId(String windowId){

       this.windowId = windowId ;

}

public String getWindowId(){

       return windowId ;

}

              String windowType ;

              public void setWindowType(String windowType){

       this.windowType = windowType ;

}

public String getWindowType(){

       return windowType;

}

//提供服务的方法

public service(NumberManager numberManager){

       /*获取号码——>获取到号码——提供服务——>完成——>获取号码 

                                     没有获取到号码——等待1s——>获取号码 */

       System.out.println(“”) ;

 

}

              public enum CustomerType{

                     COMMON,EXPRESS,VIP ;

       public String toString(){

              switch(){

       case COMMON :

              return 普通 ;

       case COMMON :

              return 快速 ;

case COMMON :

              return name() ;

}

return null ;

}

}

              public class Constants{

                     public static int MAX_SERVICE_TIME = 10000 ;

                     public static int MIX_SERVICE_TIME = 1000 ;

}

              private CustomerType type = customerType.COMMON ;

              private int windowId = 1 ;

              public void setType(){

       this.type = type ;

}

public void setWindowId(){

       this.windowId = windowId ;

}

              public void CommonServer (){

                     String windowName =+windowId++type+窗口 ;

System.out.println(正在获取任务);

                     

//取号

Integer number =

NumberMachine.getInstance().

getCommonMan ager().fetchServiceNumber();

             

                     //提供服务

                     if(number != null){

long beginTime = System.currentTimeMillis() ;

                            int maxServeTime =

Constants.MAX_SERVICE_TIME- Constants.MIX_SERVICE_TIME-C ;

                            long serveTime =

new Random().nextInt() +1 + Constants.MIX_SERVICE_TIME ;

 

                            try{

Thread.sleep(serveTime ;)

}catch(Exception e ){}      

 

//完成服务

long endTime = System.currentTimeMillis() ;

                            long costTime = endTime - beginTime

System.out.println(windowName + 为第 +

number +  + type + 客户完成服务,耗时+) ;

}else{

      

System.out.println(没有服务任务,先休息1s);

                            try{Thread.sleep(1000)

}catch(Exception e ){

}

}

}

              。。。 。。。

              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 ;

       }

}

}

}) ;

}

}

主函数

MainClass{

       main{

建立窗口

 .

建立调度池,添加客户

}

}

你可能感兴趣的:(java面试题之二 银行业务调度系统)