需求
模拟实现银行业务调度系统逻辑,具体需求如下:
银行内有6个业务窗口,1 – 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。
异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户 = 1 :6 :3。
客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。
各类型客户在其对应窗口按顺序依次办理业务。
当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。
随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
不要求实现GUI,,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
分析
我们知道客户去银行办理业务,首先要去取号机取号,然后等待窗口叫号,那么窗口是通过什么叫号的呢,就是根据取号机内部产生和维护的不同的业务队列来完成的
所以
涉及的对象有:业务窗口、客户、取号机、业务类型以及取号机内部维护的业务队列
为了简化设计,用字符串形式代替客户信息,主要实现系统逻辑为主
面向对象分析与设计 业务类型BusinessType类:
采用枚举的方式,创建3个实例分别表示普通业务、快速业务、VIP业务
内部维护的业务队列Queue类:
内部维护一个集合用来存放队列中的客户信息
以及一个整型变量用来表示当天的客户队列号
实现加入一个客户到队列的方法
以及从队列中取出一个客户的方法(即叫号过程)
取号机TicketMachine类:
简化编程,我们将取号机设计成一个单例
内部维护三个不同业务类型的队列
对外提供取号方法给用户
提供获取队列方法给业务窗口
业务窗口Windows类:
业务窗口属性有:业务类型及窗口编号
对外提供开始业务的方法供银行调度
思考:
在对业务窗口进行设计的时候发现,虽然各窗口同属一类,但在提供服务的过程不尽相同,所以考虑的两种实现方式,如图
第一种就是考虑到在开展业务的时候各窗口的代码有不同之处,所以考虑用这种方式来设计,将不同的业务类型的窗口分配到不同的类 第二种是直接将所有业务类型的服务代码写在同一个类中
由于不太懂设计模式,个人的感觉是,这里主要实现的是系统逻辑,所以每个窗口的服务代码差异并没有想象的大,故采用第二种方式
如果是一个比较系统的需要长期维护的项目,我会采用第一种,确保每个类的单一功能
代码实现
业务类型BusinessType类:
1: /** 2: * 业务类型 3: * @author Shawn 4: * 5: */BusinessType { 7:GENERAL,//普通业务类型 8:QUICK,//快速业务类型 9:VIP;//VIP业务类型 10: 11:@Override 12:public String toString() { 13:switch(this){ 14:case GENERAL:; 16:case QUICK:; 18:case VIP:; 20:} 21:return null; 22:} 23: }夫妇一条心,泥土变黄金。