银行业务调度系统学习心得
银行这个地方是我们每个人都去过的地方,在那里有无数的人存钱,取钱和进行各项金融业务的办理,大家有没有想过是什么让
我们的业务员能正常的进行业务的办理呢? 其实就是银行内部的调度系统完成着这一坚决的任务。
昨天刚刚做完了交通灯管理系统的项目,今天就来试试这个银行业务调度系统的学习吧!也把我的学习心得和大家分享一下。
进行初步的分析
银行业务调度系统这个项目和交通灯管理系统一样也是源自于我们的生活。因此我们可以根据一些平时去银行办理业务的经验来
慢慢的思考和分析一下。对于银行而言,业务员,客户,和号码管理器,这些是必不可少的吧。那么哪些东西我们都必要去封装成一个
对象呢?哪些又没有必要去封装成一个对象呢?对于对象的正确封装可以让我们的程序更加的简单。下面我们就来进行对这个系统中的
对象进行分析和设计吧!
面向对象的分析和设计
一.有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次
办理业务。
1.首先。这里可以根据实际的情况出发,在银行办理业务的时候,我们都应该在办理业务之前我们要先到取号机那里去取号。那
么这样我们就应该设计一个号码管理器的类,就管理那几种业务。并且可以源源不断的产生出一系列的号码出来,这样就更加
贴近于生活中的实际情况了。产生出来的号码是随机的,所以就等于随机生成了客户。从而那么我们的客户对象就不用在去设计
了。而是通过号码的随机表现出来。因为有号码就一定有客户。一个号码对应着一个客户。
2.由于有三类客户,每类客户的号码编排都是完全独立的,所以,本系统一共要产生三个号码管理器的对象,各自管理一类用户的
排队号码。这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,他要被设计
成单例模式。
二.各类型客户在其对应窗口按顺序依次办理业务,准确地说,应该是窗口依次叫号。
1.各个窗口通过问相应的号码管理器来获取当前要被服务的号码。
类的定义
NumberManager类
1.定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
2.定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
NumberMachine类
1.定产生3个号码的管理器。
ServiceWindow类
1. 定义一个叫号的方法
2.定义3类客户的办理方法。
定义枚举。因为3类窗口适合使用枚举。
下面就是具体的代码实现了
package com.bank.lupan;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
private int windowId = 1;
private CustomerType type = CustomerType.COMMON;
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public void setType(CustomerType type) {
this.type = type;
}
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:
vipService();
break;
}
}
}
});
}
private void commonService() {
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在获取任务");
Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
if(number!=null){
System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务");
long beginTime = System.currentTimeMillis();
int maxRand = (Constants.MAX - Constants.MIN)+1+Constants.MIN;
long servicetime =new Random().nextInt(maxRand) ;
try {
Thread.sleep(servicetime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costtime = System.currentTimeMillis()-beginTime;
System.out.println(windowId+"为第"+number+"个"+type+"客户完成服务,耗时"+costtime/1000+"秒");
}else{
System.out.println(windowName+"窗口没有取到任务,先休息一秒钟");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void expressService() {
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在获取任务");
Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
if(number!=null){
System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务");
long beginTime = System.currentTimeMillis();
//int maxRand = (Constants.MAX - Constants.MIN)+1+Constants.MIN;
//long servicetime =new Random().nextInt(maxRand) ;
try {
Thread.sleep(Constants.MIN);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costtime = System.currentTimeMillis()-beginTime;
System.out.println(windowId+"为第"+number+"个"+type+"客户完成服务,耗时"+costtime/1000+"秒");
}else{
System.out.println(windowName+"窗口没有取到任务");
commonService();
}
}
private void vipService() {
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在获取任务");
Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
if(number!=null){
System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务");
long beginTime = System.currentTimeMillis();
int maxRand = (Constants.MAX - Constants.MIN)+1+Constants.MIN;
long servicetime =new Random().nextInt(maxRand) ;
try {
Thread.sleep(servicetime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costtime = System.currentTimeMillis()-beginTime;
System.out.println(windowId+"为第"+number+"个"+type+"客户完成服务,耗时"+costtime/1000+"秒");
}else{
System.out.println(windowName+"窗口没有取到任务");
commonService();
}
}
}
package com.bank.lupan;
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString(){
switch(this){
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return "VIP";
}
return null;
}
}
package com.bank.lupan;
public class Constants {
public static int MAX = 10000;
public static int MIN = 1000;
}
package com.bank.lupan;
import java.util.*;
public class NumberManager {
private int lastNumber = 1;
private List<Integer> queueNumber = new ArrayList<Integer>();
public synchronized Integer generateNumberManager(){
queueNumber.add(lastNumber);
return lastNumber++;
}
public synchronized Integer fetchServiceNumber(){
Integer number = null;
if(queueNumber.size()>0)
number = queueNumber.remove(0);
return number;
}
}
package com.bank.lupan;
public class NumberMachine {
public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
private NumberManager commonManager = new NumberManager();
private NumberManager expressManager = new NumberManager();
private NumberManager vipManager = new NumberManager();
private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}
}
总结:对于JDK1.5的新特性,我们有必要掌握住,并且对于面向对象的思考我们也应该时时记住。
还要密切的关注生活,因为有些隐藏的对象就在平时我们的生活中出现着。