银行调度系统

模拟实现银行业务调度系统逻辑,具体需求如下:

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

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

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

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

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

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

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

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

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


设计思路:

类图如下:



叫号器:NumberManager
private int lastNumber = 1;//首次产生服务对象的编号
Private List<Integer> queueNumber //服务对象的容器
Public synchronized Integer generateNewManager()//产生服务对象,
Public synchronized Integer fetchServiceNumber()//取出服务对象来服务
号码管理器 :NumberMachine (这里的号码管理器设计成单例模式,及通过静态方法获取私有号码管理器对象)
getCommonManaget()//产生普通用户叫号器
getExpressManager()//产生快速用户叫号器
getVipManager()//产生Vip用户叫号器
getInstance()//产生叫号管理器的实例对象
由于叫号管理器要管理所有的叫号器,该对象只能有一个,所有产生这个对象只能通过静态方法返回静态的该管理器对象,使得任何时候该对象有且仅有一个,那么他的构造器必将是私有的,就像下面这样:
Private NumberMachine()()
Private static NumberMachine numberMachine= new NumberMachine()
通过静态的方法返回:
Public static NumberMachine getInstance(){
Return numberMachine;//注意静态的方法只能访问静态域
}
正因为 numberMachine 为static 所修饰,所以该管理器对象再整个系统中有且仅有一个!
同理与叫号器对应的是服务窗口:ServiceWindow
Private CustomerType type = CustomeType.COMMON;
Privage int WindowId = 1;
为了程序的后期维护性强,这里不设置有参构造方法
而只是定义set方法:
Public void setWindowId(int windowId){
this.windowId = windowId;//服务窗口编号
}
Public void setType(CustomerType type){
This.type = type;//服务的窗口的类型
}
同样和交通管理系统一样用到了线程工具:Executors 产生单个线程服务
Executots.newSingleThreadExecuteor().execute(Runnable command)
这里的command同样采用匿名对象来实现
在run()方法里,通过传递的type 类型来产生相应的服务窗口:
Switch(type){
case: COMMON:
//这里打印是什么窗口(包括业务和窗口号)正在
Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber()
If(number!=null){//服务获取到的对象
//打印什么窗口(包括业务和窗口号)正在为第几号什么类型的客户服务
}else{
//休息指时间
}
}
在public static void main()方法所在的主类中,创建指定数目普通窗口comonWindow,一个VIP窗口VipWindow,一个快速服务窗口expressWindow。
然后再次利用Executors线程工具类,来创建三个调度线程调度池(定时调用目标线程),
这里也只列举一个类型的服务窗口:
executors.newScheduledThreadPool(1),scheduledAtFixedRate(
new Runnable(){
Integer number = NumberMachine.getInstance().getCommonManager.generateNewManager();
//打印某客户(包括编号和类型)正在等待什么类型服务
},
0,//立即叫号
1,//这里可以单独定义一个static 域
TimeUnit.SECONDS
);
其他的服务叫号和普通服务一样!在此不一一列举,但是注意,当VIP窗口和 快速窗口没有接受服务时,马上进入普通服务,直到有对应业务的客户前来取号是,就重新切换服务状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值