银行业务调度系统

来源:互联网 发布:淘宝2元充值话费 编辑:程序博客网 时间:2024/06/05 18:43

1.根据银行业务调度系统需求,模拟实现银行业务调度系统。

个人实现思路如下:

结合平时在银行办理业务的一些例子:

首先,经常一进银行,看到有一排办理业务的窗口,然后有一台取号的机器。

通常办理业务的有VIP业务的还前普通业务的。

具备了张老师第一个视频的基础,有面向对象的思想来说,已经有一个大概的轮廓,具体实现如下:

//1.模拟银行取号机器的一个类:

public class NumberMachine {
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;
}

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

}

//2.NumberManager 的具体实现

public class NumberManager {
private int lastNumber = 1;
//定义一个接口,用来存储和管理号码,尽可能使用超类。
private List<Integer> queueNumbers = new ArrayList<Integer>();

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

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

//3.设置办理业务的时间,定义为常量,定义为常量的类建议重新用一类来封装

public class Constants {
//常量单独定义 一个类
public static int MAX_SERVICE_TIME=10000;
public static int MIN_SERVICE_TIME=1000;

public static int COMMON_CUSTOMER_TIME=1;
}

//4.定义一个枚举

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

//5.实现银行窗口办理业务的逻辑

// 没有把VIP窗口设计成子类,是因为实际业务中的普通窗口随时设置为VIP窗口和快速窗口。
public class ServiceWindow {
private CustomerType type = CustomerType.COMMON;
private int windowId = 1;
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
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 = "第" + windowId + "号" + type + "窗口服务!";
System.out.println(windowName + "开始获取普通任务!");
Integer number = NumberMachine.getInstance().getCommonManager()
.fetchNumber();
if (number != null) {
System.out.println(windowName + "开始为第" + number + "号普通客户服务");
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) {
System.out.println("普通客户错误!!");
}
System.out.println(windowName + "完成为第" + number + "号普通客户服务,总共耗时"
+ serviceTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有取到普通任务,正在空闲1秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


// 快速窗口服务
private void expressService() {
Integer serviceNumber = NumberMachine.getInstance().getExpressManager()
.fetchNumber();
String windowName = "第" + windowId + "号" + 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) {
System.out.println("快速客户错误!");
}
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 = "第" + windowId + "号" + 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) {
System.out.println("VIP客户错误!!");
}
System.out.println(windowName + "完成为第" + serviceNumber
+ "号VIP客户服务,总共耗时" + serviceTime / 1000 + "秒");
} else {
System.out.println(windowName + "没有取到VIP任务!");
commonService();
}
}
}

//最后,模拟自现业务流程

public class MainClass {
public static void main(String[] args) {
//产生4个普通窗口
for (int i = 1; i < 5; i++) {
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.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() {
@Override
public void run() {
//要号
Integer number=NumberMachine.getInstance().getCommonManager().generateNewNumber();
System.out.println(number+"号普通客户正在等待服务!");
}},
0, 
Constants.COMMON_CUSTOMER_TIME, 
TimeUnit.SECONDS);
//快速客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number=NumberMachine.getInstance().getExpressManager().generateNewNumber();
System.out.println(number+"号快速客户正在等待服务!");
}
;},
0, 
Constants.COMMON_CUSTOMER_TIME*2, 
TimeUnit.SECONDS);
//vip客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
Integer number=NumberMachine.getInstance().getVipManager().generateNewNumber();
System.out.println(number+"号VIP客户正在等待服务!");
}
;},
0, 
Constants.COMMON_CUSTOMER_TIME*6, 
TimeUnit.SECONDS);
}
}

原创粉丝点击