---------------------- android培训、java培训、期待与您交流! ----------------------
银行业务调度系统 分析设计
顾客不定时不结对的去银行办理业务,进银行首先要去取号机取号,那么他会根据自己办理业务的类型取号,业务类别分别是 Vip贵宾业务,快速办理业务,普通客户业务。取完号后,银行对应窗口得到任务依次叫号办理,假如有窗口空闲,顾客取的是vip 或者其他等待办理业务的客户取vip号码,vip优先。
从这段话初步得到可以设计对象为:取号机随机生成号码让顾客取号,所以有个号码管理器,业务窗口得到分配的号码任务,服务窗口服务。
结构如图:
开始设计:
首先设计 号码管理机器NumberManager。该类要具备生成新号码generateNewManager()的方法,同时还要有取号的的方法fetchServiceNumber()。并且他们呢同属于一个队列集合。
第二、 设计NumberMachine 用单例实现。 他管理三个返回的业务号码commonManger (普通业务),ExpressManger(快速业务),vipManger(vip 业务)。
第三。设计窗口叫号WindowService。既然是不断叫号,那么就是一个线程。建立线程并创建线程池取号(普通,快速,vip)
第四 主函数 类 新建线程 模拟三类客户不停取号。
下面是部分代码:
public class NumberMachine {
//他有三个管理器
private NumberManager commonManger=new NumberManager();
private NumberManager ExpressManger=new NumberManager();
private NumberManager vipManger=new NumberManager();
//返回三个方法
public NumberManager getCommonManger() {
return commonManger;
}
public NumberManager getExpressManger() {
return ExpressManger;
}
public NumberManager getVipManger() {
return vipManger;
}
//单例构造方法
private NumberMachine(){
}
//静态调用 需要返回一个对象 ,对象由自己创立
public static NumberMachine getInstance(){
return instance;
}
//自己创建对象
private static NumberMachine instance=new NumberMachine();
}
public class NumberManager {
//定义上一次返回的号码
private int lastNumber=1;
//排队队列
private List<Integer> queueNumber=new ArrayList<Integer>();
//号码生成器 返回上一个号码 ++ 为了互斥 采用synchronized
public synchronized Integer generateNewManager(){
//将号码存起来
queueNumber.add(lastNumber);
return lastNumber++;
}
//取号
public synchronized Integer fetchServiceNumber(){
if(queueNumber.size()>0){
return (Integer)queueNumber.remove(0);
}else{
return null;
}
}
}
public class ServiceWindow {
//定义窗口类型
private CustomerType type=CustomerType.COMMON;
//定义窗口号
private int window =1;
//提供set方法
public void setType(CustomerType type) {
this.type = type;
}
public void setWindow(int window) {
this.window = window;
}
//叫号 启动一个线程池
public void start(){
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
//取号
while(true){
//找NumberMachine 取号
switch (type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
});
}
private void commonService() {
String windowName="第"+window+"号"+"普通窗口";
Integer number=NumberMachine.getInstance()
.getCommonManger().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
long beginTime=System.currentTimeMillis();
int maxRand=Constants.MAX_SERVISE_TIMER
-Constants.MIN_SERVISE_TIMER;
long serveTime=new Random().nextInt(maxRand)+1
+Constants.MIN_SERVISE_TIMER;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"
+number+"个"+"普通客户完成服务,耗时"
+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到服务任务,先休息一下");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void expressService() {
String windowName="第"+window+"号"+type+"窗口";
Integer number=NumberMachine.getInstance()
.getExpressManger().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
long beginTime=System.currentTimeMillis();
try {
Thread.sleep(Constants.MIN_SERVISE_TIMER);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"
+number+"个"+type+"客户完成服务,耗时"
+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到服务任务,先休息一下");
commonService();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void vipService() {
String windowName="第"+window+"号"+type+"窗口";
Integer number=NumberMachine.getInstance()
.getVipManger().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
long beginTime=System.currentTimeMillis();
int maxRand=Constants.MAX_SERVISE_TIMER
-Constants.MIN_SERVISE_TIMER;
long serveTime=new Random().nextInt(maxRand)+1
+Constants.MIN_SERVISE_TIMER;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"
+number+"个"+type+"客户完成服务,耗时"
+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有取到服务任务,先休息一下");
commonService();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}