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

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
银行业务调度系统

根据需求我们得到一个关系,银行客服--问-->取号器-->要号-->排队的第一个人--->服务窗口(是不断循环的)
顾客-->取号--->排队--->叫到号--->服务窗口(也是不断循环的)
1,分析,在面向对象的编程中我们要现实银行 所有的工具,例如:服务员、取号器、叫号、排队、服务窗口等,都需要我们来用面向对象的形势来把现实中的事物抽象成一个类。把事物的动作抽象成方法,把属性抽象成变量
2,服务员:应为她是不停地工作的所以我们用一个线程不断的向取号器要号,一下是服务员要完成的任务
//模拟普通客服为普通客户服务
private void commonService() {
//声明一个字符串变量用来存放该窗口是多少号以及服务类型
String windowName = "第" + windowId + "号" + type + "窗口";
//声明一个整型的变量,用调用取号机器的getInstance来获取该取号机器,然后再调用取号机的获取普通客户的方法来获取普通号管理器,然后调用普通号管理器来获取要服务的对应的排队中的第一个号
Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
//打印出改窗口正在要号
System.out.println(windowName + "正在获取普通任务");
//判断要号是否成功
if(number != null)
{
//要号成功,则打印出该窗口正在为number号type类型的客户服务
System.out.println(windowName + "号窗口正在为第" + number + "号" + type + "客户服务");
//计时开始,记录当前服务的开始时间
long beginTime = System.currentTimeMillis();
//计算出一次服务所需的最长时间
int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
//根据客户的服务不用,因此服务的时间也有所不同,因此用一个随机数来代替被服务的时间
long serviceTime = new Random().nextInt(maxRand) + 1 + Constants.MIN_SERVICE_TIME;
try {//在这个时间内是为number客户服务的时间
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//服务结束,算出服务共需了多久时间
long costTime = System.currentTimeMillis() - beginTime;
//打印出该窗口为number号客户服务所需的时间(秒)
System.out.println(windowName + "为第" + number + "个" + type + "客户完成服务,耗时" + costTime/1000 + "秒");
}
else//如果没有取到普通客户的号,则休息1秒钟
{
System.out.println(windowName + "没有取到任务,先休息1秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

3,取号机用NumberMachine个类来表示,应为不同的客户要的号也是相互独立的,因此也需要不同的取号机器来分辨
//创建一个普通客户的号管理对象
private NumberManager commonManager  = new NumberManager();
//创建一个快速客户的号管理对象
private NumberManager expressManager  = new NumberManager();
//创建一个VIP客户的号管理对象
private NumberManager vipManager  = new NumberManager();
用以上三个对象分别对应不同的取号机,取号机的功能要能出号:
//客户来了,取号码
public synchronized Integer generateNewManager()
{
//将客户添加到排队的队列中
queueNumbers.add(++lastNumber);
//返回最后一个客户的号码
return lastNumber;
}
取号机的功能要能要号功能:
//该方法是用来获取正在排队中的最小的号,排在最前面的人的号
public synchronized Integer fetchServiceNumber()
{
//判断是否有人在排队
if(queueNumbers.size() > 0)
{
//如果有人在排队,则返回正在排队的第一个号码
return queueNumbers.remove(0);
}
else//没有人则返回null
return null;
}


4,排队是属于叫号器管理的,在这里我们使用了一个集合来代表排队的人
//存放正在排队的号码
private List<Integer> queueNumbers = new ArrayList<Integer>(); 
 要号的时候每次都是集合的第一个,即排在最前的顾客
---------------------- ASP.Net+Android+IOS开发 .Net培训 、期待与您交流! ----------------------详细请查看: http://edu.csdn.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值