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

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

2013-12-26 21:56 288 查看
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

面向对象设计:

1.定义一个NumberManager类 用于管理客户服务号码

属性:int lastNumber 用于保存上一个客户号码

List<Integer> queueNumber 用于存储客户队列的集合

方法:Integer generateNewNumber() 将客户号码加入排队队列

Integer fecthServiceNumber() 用于返回队列第一位的客户号

代码实现:

package com.tiheima.bank;

import java.util.ArrayList;
import java.util.List;

publicclassNumberManager{
privateint lastNumber =1;
privateList<Integer> queueNumber =newArrayList<Integer>();
publicsynchronizedInteger generateNewNumber(){
queueNumber.add(lastNumber);
return lastNumber++;
}

publicsynchronizedInteger fecthServiceNumber(){
Integer number =null;
if(queueNumber.size()>0)
number = queueNumber.remove(0);
return number;
}

}

2,定义一个NumberMachine类 做为取号机管理三个号码管理器  设计为单例模式

属性(分别为三个类型的号码管理器):NumberManager commonManager
NumberManager expressManager
                             NumberManager vipManager

方法:三个getter方法分别获得三个类型的号码管理器

代码实现:

package com.tiheima.bank;

publicclassNumberMachine{
privateNumberManager commonManager =newNumberManager();
privateNumberManager expressManager =newNumberManager();
privateNumberManager vipManager =newNumberManager();
publicNumberManager getCommonManager(){
return commonManager;
}
publicNumberManager getExpressManager(){
return expressManager;
}
publicNumberManager getVipManager(){
return vipManager;
}
privateNumberMachine(){};
publicstaticNumberMachine getNumberchine(){
return instance;
}
privatestaticNumberMachine instance =newNumberMachine();

}


3,设计一个ServiceWindow类,作为窗口

属性:CustomerType type  窗口类型

     int windowId       窗口编号

方法:start() 内建一个线程,根据窗口类型循环调用窗口服务方法

     三个窗口服务方法分别用于普通,快速,vip窗口

代码实现:

package com.tiheima.bank;

import java.util.Random;
import java.util.concurrent.Executors;

publicclassServiceWindow{
privateCustomerType type =CustomerType.COMMON;
privateint windowId =1;
publicvoid setType(CustomerType type){
this.type = type;
}
publicvoid setWindowId(int windowId){
this.windowId = windowId;
}

publicvoid start(){
Executors.newSingleThreadExecutor().execute(
newRunnable(){
publicvoid run(){
while(true){
switch(type){
case COMMON:
commomService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;

}

}
}
}
);
}

privatevoid commomService(){
String windowName ="第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在获取普通任务");
Integer serviceNumber =NumberMachine.getNumberchine().getCommonManager().fecthServiceNumber();
if(serviceNumber!=null){
System.out.println(windowName+"开始为第"+serviceNumber+"号普通客户服务");
int maxRandomTime =Constants.MAX_SERVICE_TIME-Constants.MIN_SERIVCE_TIME;
int serviceTime =newRandom().nextInt(maxRandomTime)+1+Constants.MIN_SERIVCE_TIME;
try{
Thread.sleep(serviceTime);
}catch(InterruptedException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNumber+"号普通客户的服务,耗时"+serviceTime/1000+"秒");
}else{
System.out.println(windowName+"没有获取到任务,正在空闲一秒");
try{
Thread.sleep(1000);
}catch(InterruptedException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

privatevoid expressService(){
String windowName ="第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在获取快速任务");
Integer serviceNumber =NumberMachine.getNumberchine().getExpressManager().fecthServiceNumber();
if(serviceNumber!=null){
System.out.println(windowName+"开始为第"+serviceNumber+"号快速客户服务");
int serviceTime =Constants.MIN_SERIVCE_TIME;
try{
Thread.sleep(serviceTime);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNumber+"快速客户的服务,耗时"+serviceTime/1000+"秒");
}else{
System.out.println(windowName+"没有获取到快速任务");
commomService();
}
}

privatevoid vipService(){
String windowName ="第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在获取VIP任务");
Integer serviceNumber =NumberMachine.getNumberchine().getVipManager().fecthServiceNumber();
if(serviceNumber!=null){
System.out.println(windowName+"开始为第"+serviceNumber+"号VIP客户服务");
int maxRandomTime =Constants.MAX_SERVICE_TIME-Constants.MIN_SERIVCE_TIME;
int serviceTime =newRandom().nextInt(maxRandomTime)+1+Constants.MIN_SERIVCE_TIME;
try{
Thread.sleep(serviceTime);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(windowName+"完成为第"+serviceNumber+"VIP客户的服务,耗时"+serviceTime/1000+"秒");
}else{
System.out.println(windowName+"没有获取到VIP任务");
commomService();

}
}
}


4,设计一个MainClass类  创建6个窗口 创建3个定时器定时创建3种客户号码  运行程序

代码实现:

package com.tiheima.bank;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

publicclassMainClass{

/**
* @param args
*/
publicstaticvoid main(String[] args){
for(int i =1; i <5; i++){
ServiceWindow window =newServiceWindow();
window.setWindowId(i);
window.start();

}

ServiceWindow expressWindow =newServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();

ServiceWindow vipWindow =newServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
newRunnable(){
publicvoid run(){
Integer serviceNumber =NumberMachine.getNumberchine().getCommonManager().generateNewNumber();
System.out.println("第"+serviceNumber+"号普通客户正在等待服务");
}
},
0,
Constants.COMMON_TIME,
TimeUnit.SECONDS);

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
newRunnable(){
publicvoid run(){
Integer serviceNumber =NumberMachine.getNumberchine().getExpressManager().generateNewNumber();
System.out.println("第"+serviceNumber+"号快速客户正在等待服务");
}
},
0,
Constants.COMMON_TIME*2,
TimeUnit.SECONDS);

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
newRunnable(){
publicvoid run(){
Integer serviceNumber =NumberMachine.getNumberchine().getVipManager().generateNewNumber();
System.out.println("第"+serviceNumber+"号VIP客户正在等待服务");
}
},
0,
Constants.COMMON_TIME*6,
TimeUnit.SECONDS);

}

}



---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: