黑马程序员——银行调度总结

----------------------<a href="http://edu.csdn.net/heima"target="blank">android培训</a>、<a href="http://edu.csdn.net/heima"target="blank">java培训</a>、期待与您交流! ----------------------

业务需求:

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

ServiceWindow

没有把VIP窗口和快速窗口做成子类,是因为实际业务中的普通窗口可以随时被设置为VIP窗口和快速窗口。

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

2.      将三个方法分别对三种客户进行服务用switch对应,在三种方法中详细打印出其中的细节信息。

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

CustomerType枚举类

 1.系统中有三种类型的客户,所以用定义一个枚举类,COMMON,EXPRESS,VIP分别表示三种类型的客户。

 2.重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的。

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

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

 

下面的mainclass

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

 

Constants

 定义出不同窗口服务的时间:MAX_SERVICE_TIMEMIN_SERVICE_TIMECOMMON_CUSTOMER_INTERVAL_TIME

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

 

NumberManager

 

1.一个ArrayList()存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码

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

 

NumberMachine

1.普通、快速和VIP客户的号码管理器commonManagerexpressManagervipManager,并且生成各自方法返回自己

2.因为一个银行大厅里只有一个号码机,所以将NumberMachine类设计成单例。

 

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

 

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

 

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

 

解题思路:

 

面向对象的分析和设计:

 

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

 

1.首先,每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的。要有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。

 

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

 

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

 

1准确地说,应该是窗口依次叫号。客户是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。

 

2.如果我不是多次亲身经历银行的这种业务,再加之积累了大量面向对象的应用开发经验,我也不知道能否轻松进行这种设计,能否发掘出其中隐含的对象信息,我真说不出具体的经验是什么,就是日积月累出来的一种感觉。

 

说实话,这样的贴近实际的项目,若不是有真实开发经验,确实很劳心费神,张老师的代码还得记下来慢慢消化~

 

客户来后通过号码机获得自己所需要的类型的服务,比如普通客户的服务,快速客户的服务以及VIP客户的服务。那么对应的窗口就应该同样有这三种类型的服务窗口了

 

首先有一个号码产生器对象,,这个产生器可以产生3种不同类型的号码。号码也是个对象。那么我们必须要有号码产生器这个对象。号码产生器产生的号码分别对应3个对象,这3个对象对应3个线程,主要是用线程的知识来处理这个问题。

 

客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值。

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

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

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

 

这三个对应类型的客户:VIP客户,普通客户,快速客户

 因为我也跑过银行用过他们的那个取号器,所以对他这个物理的原理还是有一点认识的,但是从来没有想过他的设计原理,今天看了张老师的视频,就感觉,对银行这个取号器,还有业务流程熟悉一点,对这个调度系统就会有更深的理解。、

 

在那个NumberManager类中,定义了一个存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合

 private List queueNumbers = new ArrayList();前面使用List而不是ArrayList,是因为这是面向对象编程吗,以后我不想用这个ArrayList,用LinkList也行,变量的类型,尽量面向父级,或者接口的上一级,尽量用上一级,不要用子级,这样更灵活。

 在向集合中添加一个lastNumber时需要用到同步,因为下面还有一个方法移除集合中的数据的,如果不同步的话,有可能出现错误。

 

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

 这个号码机器只有这一个实例,可以将他设计成单例设计模式。

 

在客户类型CustomerType类中,因为只有三种类型的客户,所以将CustomerType类设计成枚举类,其中定义三个成员分别表示三个类型的客户。然后重写toString方法,返回他们的中文名称。

 

服务窗口ServiceWindow类中,定义一个start方法,在内部启动一个线程,根据窗口的类别分别循环调用三个不同的方法,定义三个方法对三中客户进行服务,应该详细的打印其中的详细信息,让别人可以很清楚的看出,这个系统是怎么在运作的,他的各个窗口是怎么处理各种客户的,这些都应可在打印信息中看的出来。

 在每个类型的客户拿号,定义了一个线程池:

 它可安排在给定延迟后运行命令或者定期地执行

 Executors.newScheduledThreadPool(intcorePoolSize).scheduleAtFixedRate(

 Runnable command,

 longinitialDelay,

 longperiod,

 TimeUnit unit)

 

command - 要执行的任务

 initialDelay - 首次执行的延迟时间

 period - 连续执行之间的周期

 unit- initialDelay period 参数的时间单位

 corePoolSize - 池中所保存的线程数,即使线程是空闲的也包括在内。

 

创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。

 

在以后的编程中,尽量将程序中用到的常量定义到一个特意的类中。在这里也就是Constants类。

 

在主类中,用for循环创建出4个普通窗口,在创建出1个快速窗口,还有一个VIP窗口。接着创建三个定时器,分别定时的去创建新的普通客户号码,新的快速客户号码和新的VIP客户号码。

 

 

 

把各种线程的等待时间什么的都设置成一个合理的值,还有线程等待的时间也设置好,这样就可以运行测试系统的调度信息了,看看打印出来的信息,分析一下,看看系统的功能都实现了没有,逻辑方面的是否都合理。


 

----------------------<a href="http://edu.csdn.net/heima"target="blank">android培训</a>、<a href="http://edu.csdn.net/heima"target="blank">java培训</a>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值