黑马程序员_银行业务调度系统 _11




----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


需求分析:

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

概要设计:

 

由需求中分析,并且对银行业务的了解,我们应该设计3个号码生成器也就是NumberManager对应着3种客户也就是1个类的3个对象,这3个号码生成器再有一个一个管理号码生成器的管理器也就是NumberMachine来进行管理。

NumberManager应该具备生成号码,和获取号码的功能(方便被银行调用)。

NumberMachine就应该具备得到3NumberManager实例对象分别对应的方法。因为NumberMachine一个银行就一个,所以要用到单例实际模式,也就应该具备静态的getInstance()方法。

ServiceWindows类就应该具备开始作业的方法。这个方法要在单独的线程中进行,所以要用到线程池。具体的类图如下:

 

 

 

详细设计:也就是上面3个类的实现。

 

NumberManager类,因为是多线程的,所以要保证添加号码,及获取号码的同步。要用到同步关键字,synchronized。具体实现如下:

 
package cn.itcast.bankqueue;
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;
	}
}
}

 

NumberMachine类的用到单例设计模式,代码如下:

package cn.itcast.bankqueue;
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;
}

}

之后就是 ServiceWindow 的实现了。这个类要完成业务的读取,是银行业务调度的主要部分。要注意判断各个 Manager 的状态:

package cn.itcast.bankqueue;
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();
	}	
}
}

之后添加上零散的支撑代码,就得到了银行调度系统的模拟,运行结果如下

 

 

 

通过学习这个系统,我知道了,代码的主体是基础部分,要想掌握深入技术,基础一定要牢。


----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值