黑马程序员 十八、银行业务系统等

银行业务调度系统模拟
本文介绍了一个模拟银行业务调度系统的实现方案,系统包括6个业务窗口,能够异步随机生成VIP、普通和快速客户,并根据优先级和服务时间调度服务。
NumberManager 类、NumberMachine 类、CustomerType 枚举类、ServiceWindow 类、MainClass 类与 Constants 类
黑马程序员——面试题之银行业务系统

1、需求
模拟实现银行业务调度系统逻辑,具体需求如下:
 银行内有 6 个业务窗口,1 - 4 号窗口为普通窗口,5 号窗口为快速窗口,6 号窗口为
VIP 窗口。
 有三种对应类型的客户:VIP 客户,普通客户,快速客户(办理如交水电费、电话费之
类业务的客户)。
 异步随机生成各种类型的客户,生成各类型用户的概率比例为:
 VIP 客户 :普通客户 :快速客户 = 1 :6 :3。
 客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个 VIP 客户以及普
通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务
的过程可通过线程 Sleep 的方式模拟)。
 各类型客户在其对应窗口按顺序依次办理业务。
 当 VIP(6 号)窗口和快速业务(5 号)窗口没有客户等待办理业务的时候,这两个窗
口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理
对应客户的业务。
 随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。
 不要求实现 GUI,只考虑系统逻辑实现,可通过 Log 方式展现程序运行结果。
2、需求分析
面向对象的分析与设计
1、有三种对应类型的客户:VIP 客户,普通客户,快速客户 ,异步随机生成各种类型的客
户,各类型客户在其对应窗口按顺序依次办理业务 。
1)首先,每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的。所以,
我想到要有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。
2)由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共
要产生三个号码管理器对象,各自管理一类用户的排队号码。这三个号码管理器对象统一
由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设
计成单例。
2、各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。
各个窗口怎么知道该叫哪一个号了呢?
它一定是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务
的号码。
图片
3、NumberManager 类
1、定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码
的队列集合。
2、定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不
同的线程操作了相同的数据,所以,要进行同步。
import java.util.ArrayList;
import java.util.List;
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;
}
}
}
4、NumberMachine 类
定义三个成员变量分别指向三个 NumberManager 对象,分别表示普通、快速和 VIP 客户的
号码管理器,定义三个对应的方法来返回这三个 NumberManager 对象。
将 NumberMachine 类设计成单例。
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;
}
}
5、CustomerType 枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类
型的客户。
重写 toString 方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用
考虑。
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;
}
}
6、ServiceWindow 类
定义一个 start 方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的
方法。
定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信
息。
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.logging.Logger;
/**
* 没有把VIP窗口和快速窗口做成子类,是因为实际业务中的普通窗口可以随时被设置为
VIP窗口和快速窗口。
* */
public class ServiceWindow {
private static Logger logger =
Logger.getLogger("cn.itcast.bankqueue");
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放在case下面
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case 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();
}
}
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();
}
}
}
7、MainClass 类与 Constants 类
MainClass 类
用 for 循环创建出 4 个普通窗口,再创建出 1 个快速窗口和一个 VIP 窗口。
接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的 VIP
客户号码。
Constants 类
定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
public class MainClass {
private static Logger logger =
Logger.getLogger("cn.itcast.bankqueue");
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()
;
/**
* 采用logger 方式,无法看到 直观的运行效果,因为
logger.log方法内部并不是直接把内容打印出出来,
* 而是交给内部的一个线程去处理,所以,打印出来的结果在
时间顺序上看起来很混乱。
*/
//logger.info("第" + serviceNumber + "号普通客户
正在等待服务!");
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);
}
}

本资料239页,全面详细的介绍了银行个人和公司业务的相关内容,对做银行IT的人员来说,确实很有帮助。 目 录 第一部分 零售业务 4 1.1 储蓄业务 4 1.1.1 普通活期储蓄(本外币) 4 1.1.2 定期储蓄(本外币) 5 1.1.3 活期一本通 9 1.1.4 定期一本通 10 1.1.5 电话银行 11 1.1.6 个人支票 11 1.1.7 通信存款 13 1.1.8 其他业务规定 13 1.2 中间业务 20 1.2.1 代收代付业务 20 1.2.2 代售业务 28 1.2.3 银保业务 30 1.2.4 银证业务 32 1.2.5 “银券通”业务 35 1.2.6 基金业务 37 1.2.7 保管箱业务 42 1.2.8 个人实盘外汇买卖 45 1.2.9 个人本外币结算业务 52 1.3 银行卡 65 1.3.1 长城电子借记卡 65 1.3.2 生肖卡(限北京分行) 67 1.3.3 长城人民币信用卡 67 1.3.4 银联标识长城人民币信用卡 75 1.3.5 中银消费信贷记录卡(目前仅限北京分行) 76 1.3.6 庄胜崇光中银信贷消费卡(目前仅限北京分行) 79 1.3.7 万事顺国际电子借记卡业务(上海分行) 81 1.3.8 长城国际卡业务 85 1.3.9 代理卡业务 96 1.4 零售贷款 97 1.4.1 基本业务定义 97 1.4.2 个人住房贷款 98 1.4.3 个人住房公积金贷款 101 1.4.4 个人二手住房贷款业务 104 1.4.5 个人住房担保贷款贴息业务 106 1.4.6 法人购房贷款 108 1.4.7 个人商业用房贷款 111 1.4.8 汽车消费贷款 114 1.4.9 商业性助学贷款业务 117 1.4.10 出国留学外汇贷款业务 123 1.4.11 个人投资经营贷款业务 125 1.4.12 柯达 “创业宝”业务 128 1.4.13 小额信用贷款 130 1.4.14 大额耐用消费品 131 1.4.15 度假旅游消费贷款 133 1.4.16 家居装修贷款 135 1.4.17 个人存单质押贷款 137 1.4.18 凭证式国债质押贷款 138 1.4.19 个人记帐式国债质押贷款 140 1.4.20 个人委托贷款业务 142 第二章 第二部分 公司业务 144 2.1 对公存款 144 2.1.1 帐户管理 144 2.1.2 预留印鉴管理 149 2.1.3 单位定期存款业务介绍和办理手续 149 2.1.4 单位通知存款的业务介绍和办理手续 150 2.1.5 单位协定存款业务介绍和办理手续 151 2.1.6 存款计息管理 151 2.2 公司贷款 152 2.2.1 贷款的基本性质 152 2.2.2 贷款的种类 153 2.2.3 授信 163 2.2.4 贷款担保 170 2.2.5 贷款审批程序 174 2.2.6 贷后管理 185 2.3 保理 190 2.3.1 国际保理 190 2.3.2 国内保理 192 2.4 网上银行 193 2.5 国内支付结算 195 2.5.1 国内信用证 195 2.5.2 银行汇票 196 2.5.3 银行本票 198 2.5.4 支票 199 2.5.5 汇兑 200 2.5.6 托收承付 201 2.5.7 委托收款 202 2.5.8 国内结算业务中国银行的优势: 202 2.5.9 国际汇款 203 2.5.10 光票托收 206 2.6 进口跟单业务 208 2.6.1 进口信用证 208 2.6.2 进口代收 210 2.6.3 进口押汇 211 2.6.4 提货担保 213 2.7 出口跟单业务 214 2.7.1 出口信用证 214 2.7.2 出口托收 216 2.7.3 出口贴现 218 2.7.4 出口押汇 219 2.7.5 打包贷款 221 2.8 保函 222 2.8.1 保函的业务定义 222 2.8.2 保函的当事人 222 2.8.3 保函的种类 223 2.8.4 保函业务的特点 223 2.8.5 中国银行保函开立流程 223 2.8.6 投标保函 225 2.8.7 履约保函 225 2.8.8 预付款保函 226 2.8.9 预留金保函 226 2.8.10 质量保函 227 2.8.11 关税保函 227 2.8.12 付款保函 228 2.8.13 融资保函 229 2.8.14 租赁保函 229 2.8.15 补偿贸易保函 230 2.9 外汇资金业务 230 2.9.1 即期外汇买卖 230 2.9.2 远期外汇买卖 231 2.9.3 择期外汇买卖 232 2.9.4 掉期外汇买卖 233 2.9.5 外汇期权 233 2.9.6 利率掉期 235 2.9.7 货币掉期 236 2.9.8 掉期期权 237 2.9.9 利率期权 237 2.9.10 人民币远期结售汇 239
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值