张孝祥老师7k面试题之银行业务调度:
这道题还是有些难度的,不过一步一步分析,也不那么难理解,本片博客重点说说思路:
一.需求分析:
(1)银行内有6个业务窗口, 4个普通窗口,1快速窗口,1个VIP窗口。
(2)有三种对应类型的客户:VIP客户,普通客户,快速客户。(3)VIP客户以及普通客户办理业务所需的时间有最大值和最小值,快速客户办理业务所需时间为最小值,三种客户比例为VIP客户:普通客户 :快速客户 = 1 :6 :3。
(4)当VIP窗口和快速窗口没有客户等待可以为普通客户服务
二.用面相对象的思想可以提炼出三个对象,
1.银行窗口,
2.号码生成器(可以生成三种对应类型的客户的号码),
3.号码管理器(生成号码和获取窗口马上要服务的号码)
三.整个流程可这样设计:
1.号码管理器产生新号码,并对外提供获取窗口马上要办理的号码的方法。
2.号码生成器,由于只想它在内存中只有一个对象,采用单例设计,并在里面定义3个指向号码管理器的属性对象,分别表示普通客户,快速客户,vip客户。并对外提供访问对象的的方法。
3.开启一个线程循环调用3种窗口那类型,线程种根据不同客户,调用不同的窗口,用executors线程池。可以有switch() case :去判断怎么调用。类型这个变量只有3种考虑用枚举去定义。用if()else()去判断该类型窗口有没有等待的服务的号码,如果是快速窗口和vip窗口没有等待的,就为普通窗口服务。
4.主函数:创建6个窗口,并定于3个定时器,分别去创建新的普通号码,新的快速号码,新的vip号码。(定时器用execoutor接口创建)
四 .具体步骤:
1. 创建号码管理器类:
(1) 定义一个变量记录上一个客户的号码,方便得道下一个客户号码。
(2) 定义一个集合,存储在排队的号码。
(3) 定义一个方法可以产生新的号码。
(4) 定义一个方法能够给窗口提供马上要服务的号码。
(面相对象的思想:谁拥有数据谁对外提供方法。)
代码体现:
public class NumberManager {
/*步骤:1定义一个变量记录上一个生成了多少号,方便给下一个多少号。2定义一个集合来装还没有服务的号
* 3创建取号的方法,4创建个给窗口多少号的方法。*
* 说明3,4是不同线程操作相同 的数据需要同步*/
private int lastNumber=0;
private List< Integer> queueNumbers = new ArrayList<Integer>();
//定义方法生成号码
public synchronized Integer shengChengNumber(){
queueNumbers.add(++lastNumber);
return lastNumber;
}
//为窗口获取号码
public synchronized Integer quChuNumber(){
if(queueNumbers.size()>0){
return