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

来源:互联网 发布:网络新词语选编 编辑:程序博客网 时间:2024/06/04 17:57

模拟实现银行业务调度系统逻辑

需求分析:

  • 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
  • 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
  • 异步随机生成各种类型的客户,生成各类型用户的概率比例为:

        VIP客户 :普通客户 :快速客户 =  163

  • 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
  • 各类型客户在其对应窗口按顺序依次办理业务。 
  • VIP6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
  • 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
  • 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

面向对象的分析与设计

1.有三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务
Ø首先,经常在银行办理业务的人更有利于理解本系统,例如,我经常陪老婆跑银行,对银行的这个业务算是比较熟悉了,我知道每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的。所以,我想到要有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。
Ø由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。
 
2.各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。
Ø各个窗口怎么知道该叫哪一个号了呢?它一定是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。
Ø如果我不是多次亲身经历银行的这种业务,再加之积累了大量面向对象的应用开发经验,我也不知道能否轻松进行这种设计,能否发掘出其中隐含的对象信息,我真说不出具体的经验是什么,就是日积月累出来的一种感觉。难道这就是传说中的:“只可意会,不可言传?”

 

类图

画图非常有助于理解和分析问题,你还有比画图更好的办法吗?


 

NumberManagerNumberMachine

*NumberManager

定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。

定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。

*NumberMachine

定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。

将NumberMachine类设计成单例。

ServiceWindowCustomerType枚举类

*CustomerType枚举类

系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。

重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。

*ServiceWindow

定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。 

定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。


*MainClass

用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。

接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。

*Constants

定义三个常量:MAX_SERVICE_TIMEMIN_SERVICE_TIMECOMMON_CUSTOMER_INTERVAL_TIME


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

package com.isoftstone.interview.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 fetchServiceNumber(){//public E remove(int index)//移除并返回此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1)。Integer number = null;if(queueNumber.size()>0){number = queueNumber.remove(0);}return number;}}

package com.isoftstone.interview.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(){@Overridepublic void run() {while(true){//switch case 只能比较 int 型变量或 enum 型变量。switch(type) {case COMMON:commonService();break;case EXPRESS:expressService();break;case VIP:vipService();break;}}}});}private void commonService() {String windowName = "第"+windowID+"号"+type+"窗口";System.out.println(windowName+"正在获取任务...");Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();if(number!=null){System.out.println(windowName+"正在为"+number+"号普通客户服务!");long beginTime = System.currentTimeMillis();int maxRandom = Constants.MAX_SERVER_TIME - Constants.MIN_SERVER_TIME;long serverTime = new Random().nextInt(maxRandom) + 1 + Constants.MIN_SERVER_TIME;try {Thread.sleep(serverTime);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName+"为"+number+"号普通客户办理完业务,耗时"+costTime/1000+"秒");}else{System.out.println(windowName+"没有取到任务,先休息一秒钟嘛!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}private void expressService() {String windowName = "第"+windowID+"号"+type+"窗口";System.out.println(windowName+"正在获取任务...");Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();if(number!=null){System.out.println(windowName+"正在为"+number+"号"+type+"客户服务!");long beginTime = System.currentTimeMillis();//int maxRandom = Constants.MAX_SERVER_TIME - Constants.MIN_SERVER_TIME;//long serverTime = new Random().nextInt(maxRandom) + 1 + Constants.MIN_SERVER_TIME;try {Thread.sleep(Constants.MIN_SERVER_TIME);} catch (InterruptedException e) {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+"窗口";System.out.println(windowName+"正在获取任务...");Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();if(number!=null){System.out.println(windowName+"正在为"+number+"号"+type+"客户服务!");long beginTime = System.currentTimeMillis();int maxRandom = Constants.MAX_SERVER_TIME - Constants.MIN_SERVER_TIME;long serverTime = new Random().nextInt(maxRandom) + 1 + Constants.MIN_SERVER_TIME;try {Thread.sleep(serverTime);} catch (InterruptedException e) {e.printStackTrace();}long costTime = System.currentTimeMillis()-beginTime;System.out.println(windowName+"为"+number+"号"+type+"客户办理完业务,耗时"+costTime/1000+"秒");}else{System.out.println(windowName+"没有取到任务!");commonService();}}}

package com.isoftstone.interview.bank;public enum CustomerType {COMMON,EXPRESS,VIP;@Overridepublic String toString() {switch(this){case COMMON:return "普通";case EXPRESS:return "快速";case VIP:return name(); //Enum中的一个方法,返回自己的名字。}return null;}}

package com.isoftstone.interview.bank;public class Constants {public static int MAX_SERVER_TIME = 10000;public static int MIN_SERVER_TIME = 1000;public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;}

package com.isoftstone.interview.bank;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class MainClass {public static void main(String[] args) {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(5);vipWindow.start();ServiceWindow expressWindow = new ServiceWindow();expressWindow.setType(CustomerType.EXPRESS);expressWindow.setWindowID(6);expressWindow.start();Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {Integer number = NumberMachine.getInstance().getCommonManager().generateNewNumber();System.out.println(number+"号普通客户等待服务...");}}, 0,Constants.COMMON_CUSTOMER_INTERVAL_TIME,TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {Integer number = NumberMachine.getInstance().getVipManager().generateNewNumber();System.out.println(number+"号VIP客户等待服务...");}},0,Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {Integer number = NumberMachine.getInstance().getExpressManager().generateNewNumber();System.out.println(number+"号快速客户等待服务...");}}, 0,Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,TimeUnit.SECONDS);}}

运行结果:

第1号普通窗口正在获取任务...

第4号普通窗口正在获取任务...

第5号VIP窗口正在获取任务...

第3号普通窗口正在获取任务...

第2号普通窗口正在获取任务...

第6号快速窗口正在获取任务...

第1号普通窗口没有取到任务,先休息一秒钟嘛!

第5号VIP窗口没有取到任务!

第6号快速窗口没有取到任务!

第2号普通窗口没有取到任务,先休息一秒钟嘛!

第4号普通窗口没有取到任务,先休息一秒钟嘛!

第3号普通窗口没有取到任务,先休息一秒钟嘛!

第6号快速窗口正在获取任务...

第6号快速窗口没有取到任务,先休息一秒钟嘛!

第5号VIP窗口正在获取任务...

第5号VIP窗口没有取到任务,先休息一秒钟嘛!

1号普通客户等待服务...

1号VIP客户等待服务...

1号快速客户等待服务...

第4号普通窗口正在获取任务...

第1号普通窗口正在获取任务...

第1号普通窗口没有取到任务,先休息一秒钟嘛!

第5号VIP窗口正在获取任务...

第6号快速窗口正在获取任务...

第6号快速窗口正在为1号快速客户服务!

第2号普通窗口正在获取任务...

第2号普通窗口正在为2号普通客户服务!

第3号普通窗口正在获取任务...

第3号普通窗口没有取到任务,先休息一秒钟嘛!

第5号VIP窗口正在为1号VIP客户服务!

2号普通客户等待服务...

第4号普通窗口正在为1号普通客户服务!

3号普通客户等待服务...

第1号普通窗口正在获取任务...

第6号快速窗口为1号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第1号普通窗口正在为3号普通客户服务!

2号快速客户等待服务...

第3号普通窗口正在获取任务...

第3号普通窗口没有取到任务,先休息一秒钟嘛!

第6号快速窗口正在为2号快速客户服务!

4号普通客户等待服务...

第3号普通窗口正在获取任务...

第3号普通窗口正在为4号普通客户服务!

第6号快速窗口为2号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口没有取到任务!

第6号快速窗口正在获取任务...

第6号快速窗口没有取到任务,先休息一秒钟嘛!

5号普通客户等待服务...

3号快速客户等待服务...

第6号快速窗口正在获取任务...

第6号快速窗口正在为3号快速客户服务!

6号普通客户等待服务...

第6号快速窗口为3号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口没有取到任务!

第6号快速窗口正在获取任务...

第6号快速窗口正在为5号普通客户服务!

第3号普通窗口为4号普通客户办理完业务,耗时2秒

第3号普通窗口正在获取任务...

第3号普通窗口正在为6号普通客户服务!

2号VIP客户等待服务...

7号普通客户等待服务...

4号快速客户等待服务...

第1号普通窗口为3号普通客户办理完业务,耗时4秒

第1号普通窗口正在获取任务...

第1号普通窗口正在为7号普通客户服务!

8号普通客户等待服务...

第6号快速窗口为5号普通客户办理完业务,耗时2秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为4号快速客户服务!

第5号VIP窗口为1号VIP客户办理完业务,耗时6秒

第5号VIP窗口正在获取任务...

第5号VIP窗口正在为2号VIP客户服务!

5号快速客户等待服务...

9号普通客户等待服务...

第6号快速窗口为4号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为5号快速客户服务!

10号普通客户等待服务...

第6号快速窗口为5号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口没有取到任务!

第6号快速窗口正在获取任务...

第6号快速窗口正在为8号普通客户服务!

第2号普通窗口为2号普通客户办理完业务,耗时8秒

第2号普通窗口正在获取任务...

第2号普通窗口正在为9号普通客户服务!

11号普通客户等待服务...

6号快速客户等待服务...

第3号普通窗口为6号普通客户办理完业务,耗时4秒

第3号普通窗口正在获取任务...

第3号普通窗口正在为10号普通客户服务!

第4号普通窗口为1号普通客户办理完业务,耗时9秒

第4号普通窗口正在获取任务...

第4号普通窗口正在为11号普通客户服务!

12号普通客户等待服务...

第5号VIP窗口为2号VIP客户办理完业务,耗时3秒

第5号VIP窗口正在获取任务...

第5号VIP窗口没有取到任务!

第5号VIP窗口正在获取任务...

第5号VIP窗口正在为12号普通客户服务!

7号快速客户等待服务...

13号普通客户等待服务...

3号VIP客户等待服务...

14号普通客户等待服务...

15号普通客户等待服务...

8号快速客户等待服务...

第1号普通窗口为7号普通客户办理完业务,耗时7秒

第1号普通窗口正在获取任务...

第1号普通窗口正在为13号普通客户服务!

第2号普通窗口为9号普通客户办理完业务,耗时4秒

第2号普通窗口正在获取任务...

第2号普通窗口正在为14号普通客户服务!

第5号VIP窗口为12号普通客户办理完业务,耗时3秒

第5号VIP窗口正在获取任务...

第5号VIP窗口正在为3号VIP客户服务!

第4号普通窗口为11号普通客户办理完业务,耗时4秒

第4号普通窗口正在获取任务...

第4号普通窗口正在为15号普通客户服务!

16号普通客户等待服务...

第6号快速窗口为8号普通客户办理完业务,耗时5秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为6号快速客户服务!

17号普通客户等待服务...

9号快速客户等待服务...

第6号快速窗口为6号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为7号快速客户服务!

第1号普通窗口为13号普通客户办理完业务,耗时2秒

第1号普通窗口正在获取任务...

第1号普通窗口正在为16号普通客户服务!

18号普通客户等待服务...

第6号快速窗口为7号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为8号快速客户服务!

第5号VIP窗口为3号VIP客户办理完业务,耗时3秒

第5号VIP窗口正在获取任务...

第5号VIP窗口没有取到任务!

第5号VIP窗口正在获取任务...

第5号VIP窗口正在为17号普通客户服务!

4号VIP客户等待服务...

10号快速客户等待服务...

19号普通客户等待服务...

第6号快速窗口为8号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为9号快速客户服务!

20号普通客户等待服务...

第6号快速窗口为9号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为10号快速客户服务!

第3号普通窗口为10号普通客户办理完业务,耗时8秒

第3号普通窗口正在获取任务...

第3号普通窗口正在为18号普通客户服务!

21号普通客户等待服务...

11号快速客户等待服务...

第6号快速窗口为10号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为11号快速客户服务!

22号普通客户等待服务...

第6号快速窗口为11号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口没有取到任务!

第6号快速窗口正在获取任务...

第6号快速窗口正在为19号普通客户服务!

23号普通客户等待服务...

12号快速客户等待服务...

第2号普通窗口为14号普通客户办理完业务,耗时8秒

第2号普通窗口正在获取任务...

第2号普通窗口正在为20号普通客户服务!

24号普通客户等待服务...

25号普通客户等待服务...

5号VIP客户等待服务...

13号快速客户等待服务...

第4号普通窗口为15号普通客户办理完业务,耗时9秒

第4号普通窗口正在获取任务...

第4号普通窗口正在为21号普通客户服务!

第5号VIP窗口为17号普通客户办理完业务,耗时6秒

第5号VIP窗口正在获取任务...

第5号VIP窗口正在为4号VIP客户服务!

第6号快速窗口为19号普通客户办理完业务,耗时3秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为12号快速客户服务!

26号普通客户等待服务...

第6号快速窗口为12号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为13号快速客户服务!

27号普通客户等待服务...

14号快速客户等待服务...

第1号普通窗口为16号普通客户办理完业务,耗时9秒

第1号普通窗口正在获取任务...

第1号普通窗口正在为22号普通客户服务!

第6号快速窗口为13号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口正在为14号快速客户服务!

第3号普通窗口为18号普通客户办理完业务,耗时7秒

第3号普通窗口正在获取任务...

第3号普通窗口正在为23号普通客户服务!

28号普通客户等待服务...

第6号快速窗口为14号快速客户办理完业务,耗时1秒

第6号快速窗口正在获取任务...

第6号快速窗口没有取到任务!

第6号快速窗口正在获取任务...

第6号快速窗口正在为24号普通客户服务!

29号普通客户等待服务...

15号快速客户等待服务...

第2号普通窗口为20号普通客户办理完业务,耗时6秒

第2号普通窗口正在获取任务...

第2号普通窗口正在为25号普通客户服务!

30号普通客户等待服务...

第4号普通窗口为21号普通客户办理完业务,耗时5秒

第4号普通窗口正在获取任务...

第4号普通窗口正在为26号普通客户服务!

6号VIP客户等待服务...

31号普通客户等待服务...

16号快速客户等待服务...

第1号普通窗口为22号普通客户办理完业务,耗时3秒

第1号普通窗口正在获取任务...

第1号普通窗口正在为27号普通客户服务!


...... 



0 0
原创粉丝点击