黑马程序员--7k:银行服务系统

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1.需要使用面向对象,但使用面向对象是必须明白,谁拥有数据,则就会对外提供操作这些数据的方法;


2.模拟实现银行业务调度系统逻辑,具体需求如下:


1.银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。


2.有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。


3.异步随机生成各种类型的客户,生成各类型用户的概率比例为:


        VIP客户 :普通客户 :快速客户  =  1 :6 :3。


4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。


5. 各类型客户在其对应窗口按顺序依次办理业务。


6.当VIP(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。


7.随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。


8.不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


3.switch的数据类型只能是哪些:
1.byte
2.char
3.short
4.int
5.JDK1.7新增String


4.null转成int类型会 出现空指针异常;


5.示例代码:


NumberManger:
package BankOf;
import java.util.*;


public class NumberManger {

/*
* 首先要生成号码
*/

private int firstNumber = 1; //设定初始的号码
private List<Integer> queueNUmber = new ArrayList<Integer>(); //正在排队的队列,"List"表示面向接口编程
public synchronized Integer genManger(){ //"synchronized"用于两个线程操作同一个数据时,让其产生互斥
queueNUmber.add(firstNumber); //依次将生成的号码存入动态数组中
return firstNumber++; //生成有顺序的数字
}

/*
* 柜台一次获取正在排队的号码
*/
public synchronized Integer ServerNumber(){ //"synchronized"用于两个线程操作同一个数据时,让其产生互斥; 此处不使用int而使用integer是防止null出现空指针异常
Integer numberInt = null;
if(queueNUmber.size() > 0){
numberInt = queueNUmber.remove(0); //按照存入数字的顺序依次将数字提出并删除
}
return numberInt;
}


}


NumberCustormer:
package BankOf;


public class NumberCustomer {
//三种类型的顾客分别从取号机挂号
private NumberManger comonManger = new NumberManger();
private NumberManger expressManager = new NumberManger();
private NumberManger VipManager = new NumberManger();

/*
* 根据面向对象的思想从拥有数据的对象中获取数据
*/
public NumberManger getCommonManger(){
return comonManger;

}
public NumberManger getExpressManager(){
return expressManager;

}
public NumberManger getVipManager(){
return VipManager;

}

//将"NumberCustomer"变成单例,同时将它私有化,防止别人创建,但若要得到他的对象必须使用静态方法
private NumberCustomer(){

}


//创建返回对象
private static final NumberCustomer instance = new NumberCustomer();
public static NumberCustomer getInstance(){
//这个方法要返回对象
return instance;

}



ServerWindow:
package BankOf;


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


/*
 * 叫号时是银行内部使用,而且需要使用到多线程
 */
public class ServerWindow {
private CustomerType type = CustomerType.COMMON; //利用枚举来查看窗口类型,所以创建一个变量
private int WindowsId = 1; //当获取号码失败时可以显示窗口号码

//便于修改窗口的类型
public void setType(CustomerType type) {
this.type = type;
}


public void setWindowsId(int windowsId) {
this.WindowsId = windowsId;
}

public void start(){

/*
* 类"Exector"的使用:

*  创建并返回设置有常用配置字符串的 ExecutorService 的方法。 
创建并返回设置有常用配置字符串的 ScheduledExecutorService 的方法。 
创建并返回“包装的”ExecutorService 方法,它通过使特定于实现的方法不可访问来禁用重新配置。 
创建并返回 ThreadFactory 的方法,它可将新创建的线程设置为已知的状态。 
创建并返回非闭包形式的 Callable 的方法,这样可将其用于需要 Callable 的执行方法中。 


*/

Executors.newSingleThreadExecutor().execute(new Runnable(){ //这是一个 单线程

public  void run(){
while(true){

//使用switch来替代if..else来使代码效率更高
switch(type){

//普通客户
case COMMON: 
Common_Server();
break;

//快速客户
case EXPRESS: 
Express_Server();
break;

//顶级会员
case VIP:
VIP_Server();
break;
}
}
}


private void Common_Server() {
String WindowName = "第" + WindowsId + "号" + type + "窗口"; //窗口号码和类型;
Integer number = NumberCustomer.getInstance().getCommonManger().ServerNumber(); //获取服务号码
System.out.println( WindowName+ "正在获任务");

//对获取的号码进行识别判断
if(number != null){
int MaxRandom = Constants.MAX_TIME - Constants.MIN_TIME;
long ServerTime = new Random().nextInt(MaxRandom) + 1 + Constants.MIN_TIME;
try {
Thread.sleep(ServerTime);
} catch (InterruptedException e) {

e.printStackTrace();
}

long BeginServerTime = System.currentTimeMillis(); //返回以毫秒为单位的当前时间。
long EndServerTime = System.currentTimeMillis();
long CostTime = (EndServerTime - BeginServerTime) / 1000;

//显示某个窗口为某种客户服务的时间
System.out.println(WindowName + "号窗口为第" + number + "个" + type + "客户完成服务时间为" + CostTime  + "秒");
}else{

//如果获取失败则进行提示
System.out.println(WindowName + "sorry,fail,again");


try {
Thread.sleep(1000);
} catch (InterruptedException e) {

e.printStackTrace();
}
}
}

private void Express_Server() {
String WindowName = "第" + WindowsId + "号" + type + "窗口"; //窗口号码和类型;
Integer number = NumberCustomer.getInstance().getExpressManager().ServerNumber(); //获取服务号码
System.out.println( WindowName+ "正在获任务");

//对获取的号码进行识别判断
if(number != null){


try {
Thread.sleep(0);
} catch (InterruptedException e) {

e.printStackTrace();
}

long BeginServerTime = System.currentTimeMillis(); //返回以毫秒为单位的当前时间。
long EndServerTime = System.currentTimeMillis();
long CostTime = (EndServerTime - BeginServerTime) / 1000;

//显示某个窗口为某种客户服务的时间
System.out.println(WindowName + "号窗口为第" + number + "个" + type + "客户完成服务时间为" + CostTime  + "秒");
}else{

//如果获取失败则进行提示
System.out.println( WindowName + "sorry,fail,again");
Common_Server(); //若没有此类型的顾客则服务窗口切换服务类型


}
}

private void VIP_Server() {
String WindowName = "第" + WindowsId + "号" + type + "窗口"; //窗口号码和类型;
Integer number = NumberCustomer.getInstance().getVipManager().ServerNumber(); //获取服务号码
System.out.println( WindowName+ "正在获任务");

//对获取的号码进行识别判断
if(number != null){
int MaxRandom = Constants.MAX_TIME - Constants.MIN_TIME;
long ServerTime = new Random().nextInt(MaxRandom) + 1 + Constants.MIN_TIME;
try {
Thread.sleep(ServerTime);
} catch (InterruptedException e) {

e.printStackTrace();
}

long BeginServerTime = System.currentTimeMillis(); //返回以毫秒为单位的当前时间。
long EndServerTime = System.currentTimeMillis();
long Cost_time = (EndServerTime - BeginServerTime) / 1000;

//显示某个窗口为某种客户服务的时间
System.out.println(WindowName + "号窗口为第" + number + "个" +  type + "客户完成服务时间为" + Cost_time  + "秒");
}else{

//如果获取失败则进行提示
System.out.println(WindowName + "sorry,fail,again");
Common_Server(); //若没有此类型的顾客则服务窗口切换服务类型


}
}
});


}






}




CustormerType:
package BankOf;


public enum CustomerType {
COMMON, EXPRESS, VIP;

public String toString(){
switch(this){
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name(); //此处直接返回自己的名字,因为枚举中有name方法来返回
}
return null; //因为程序不知这个程序是否会被执行,所以此处需要一个return方法
}
}


MainClass:
package BankOf;


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


public class MainClass {
public static void main(String[] args){

//默认为普通窗口
for(int i = 1; i < 5 ; i++){
ServerWindow commonWindow = new ServerWindow();
commonWindow.setWindowsId(i);
commonWindow.start();

}

//设置一个快速窗口
ServerWindow expressWindow= new ServerWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();

//设置一个VIP窗口
ServerWindow VipWindow = new ServerWindow();
VipWindow.setType(CustomerType.VIP);
VipWindow.start();

/*
* 注意:根据客户类型的比例 V:C:E = 1:6:3
*/

//普通用户的时间
Executors.newScheduledThreadPool(1).scheduleAtFixedRate( //固定频率
new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
Integer number = NumberCustomer.getInstance().getCommonManger().genManger();
System.out.println(number + "号普通客户等待服务!");
}},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME ,
TimeUnit.SECONDS
);

//快速用户的时间
Executors.newScheduledThreadPool(1).scheduleAtFixedRate( //固定频率
new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
Integer number = NumberCustomer.getInstance().getExpressManager().genManger();
System.out.println(number + "号快速客户等待服务!");
}},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 3,
TimeUnit.SECONDS
);

//VIP用户的时间
Executors.newScheduledThreadPool(1).scheduleAtFixedRate( //固定频率
new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
Integer number = NumberCustomer.getInstance().getVipManager().genManger();
System.out.println(number + "号VIP客户等待服务!");
}},
0,
Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
TimeUnit.SECONDS
);
}
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值