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

黑马程序员-学习笔记/银行业务系统

2014-02-24 00:52 274 查看
------- android培训java培训、期待与您交流! ---------

 

黑马程序员培训-android培训,java面试题之 ---- 银行系统业务

 

根据我们在银行办理业务的时候,首先,我们进入银行肯定是需要办理业务的,所以第一步,我们需要排号

然后银行呢,根据我们的排号去进行处理,而且银行业务中,有VIP通道,快速通道,普通通道,即我们常见的VIP窗口,快速窗口,普通窗口

 

现在,我们来编写一个银行系统的小demo

从头到尾开始

public static void main(String[] args) {
//产生4个普通窗口
for(int i=1;i<5;i++){
//定义银行系统业务窗口,及办理业务
ServiceWindow window =  new ServiceWindow();
window.setNumber(i);
window.start();
}

//产生1个快速窗口
ServiceWindow expressWindow =  new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();

//产生1个VIP窗口
ServiceWindow vipWindow =  new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();

//普通客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getCommonManager	().generateNewNumber();
System.out.println("第" + serviceNumber + "号普通客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME,
TimeUnit.SECONDS);

//快速客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager	().generateNewNumber();
System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,
TimeUnit.SECONDS);

//VIP客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer serviceNumber = NumberMachine.getInstance().getVipManager	().generateNewNumber();
System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");
}
},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
TimeUnit.SECONDS);
}


开始我们编写这么一个test测试类。

根据需求,我们银行业务有4个普通的窗口,一个快速窗口,一个VIP窗口

所以需要有一个银行业务台窗口 ServiceWindow,那么银行业务肯定又会有快速窗口和VIP窗口还有普通窗口

那么,我们又需要定义一个普通的窗口客户业务办理,快速办理业务窗口和VIP客户业务办理

public class ServiceWindow {
private CustomerType type = CustomerType.COMMON;
private int number = 1;

public CustomerType getType() {
return type;
}

public void setType(CustomerType type) {
this.type = type;
}

public void setNumber(int number){
this.number = number;
}

public void start(){
Executors.newSingleThreadExecutor().execute(
new Runnable(){
public void run(){
while(true){
switch(type){
case COMMON:	// 普通
commonService();
break;
case EXPRESS:	// 快速
expressService();
break;
case VIP:		// VIP
vipService();
break;
}
}
}
}
);
}

//普通窗口
private void commonService(){
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取普通任务!");
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();
if(serviceNumber != null ){
System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");
// 计时
int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "秒");
}else{
System.out.println(windowName + "没有取到普通任务,正在空闲一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

//快速窗口
private void expressService(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取快速任务!");
if(serviceNumber !=null){
System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务");
// 计时
int serviceTime = Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "秒");
}else{
System.out.println(windowName + "没有取到快速任务!");
commonService();
}
}

// VIP窗口
private void vipService(){

Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
String windowName = "第" + number + "号" + type + "窗口";
System.out.println(windowName + "开始获取VIP任务!");
if(serviceNumber !=null){
System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务");
// 计时
int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒");
}else{
System.out.println(windowName + "没有取到VIP任务!");
commonService();
}
}
}


同时,我们还得考虑,排号中,VIP客户是否过多,这样的话,我们是否需要改普通客户窗口为VIP窗口业务办理

根据上面,我们需要用到一个枚举类型的银行业务类型(type)

public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
String name = null;
switch(this){
case COMMON:
name = "普通";
break;
case EXPRESS:
name = "快速";
break;
case VIP:
name = name();
break;
}
return name;
}
}


同时,我们也用到了。快速窗口和普通窗口VIP窗口办理业务计时所用到都Constants类

假设每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来

平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以,1秒钟产生一个普通客户比较合理

 

public class Constants {
public static int MAX_SERVICE_TIME = 10000; //10秒!
public static int MIN_SERVICE_TIME = 1000; //1秒!
// 假设一秒钟产生一个客户
public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}


那么,随机产生客户,客户来了之后,客户进行排号后,录入到系统中,让客户等待业务办理、

所以我们需要模拟一个客户随机生成类

public class NumberMachine {

private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}

private NumberManager commonManager = new NumberManager();
private NumberManager expressManager = new NumberManager();
private NumberManager vipManager = new NumberManager();
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}

}


 

public class NumberManager {
private int lastNumber = 0;
private List queueNumbers = new ArrayList();

public synchronized Integer generateNewNumber(){
queueNumbers.add(++lastNumber);
return lastNumber;
}

public synchronized Integer fetchNumber(){
if(queueNumbers.size()>0){
return (Integer)queueNumbers.remove(0);
}else{
return null;
}
}
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息