您的位置:首页 > 职场人生

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

2014-01-08 16:15 375 查看
---------------------- 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: