黑马程序员——总结:银行调度系统

------- android培训java培训、期待与您交流! ----------

面向对象分析:
1,银行的每一个客户其实就是由银行的取号机产生的号码来表示的,所以应该有一个取号机对象,这个对象产生号码,相当于生成了客户。而这三类客户(VIP、普通和快速)都是由这一台机器产生的,因此这个机器始终只有一个,应设计成单例。

2,3类客户要在不同的窗口办理不同的业务,需要有三类客户对象,也需要有三类窗口来为其服务。

3,VIP窗口和快速窗口可以办理普通客户,但会优先办理自己的客户,所以需要在VIP窗口和快速窗口中,判断如果没有自己的客户,就调用普通窗口的服务方法。

类的编写:
号码管理器类NumberManager:

public class numberManager{
	private int lastNumber = 1;
	private List<Integer> queueNumber = new ArrayList<Integer>();//创建一个号码队列List
	public synchronized Integer generateNewManager(){//产生用户号码,由于与fetchServiceNumber是两个不同线程操作同一个数据,所以需要同步
		queueNumber.add(lastNumber);
		return lastNumber++;
	}

	public synchronized Integer fetchServiceNumber(){//窗口取号
		if(queueNumber.size() > 0){//在实际操作中,发现执行到此处附近时会出现数组角标越界异常,因此需要先判断queueNumber集合不为空元素时,再执行remove(0)的操作。
			return queueNumber.remove(0);
		}
	}
}


取号机类NumberMachine

public class NumberMachine{
	private NumberManager commonManager = new NumberManager();//普通号码管理器
	private NumberManager expressManager = new NumberManager();//快速号码管理器
	private NumberManager vipManager = new NumberManager();//VIP号码管理器

	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();

}


服务窗口类ServiceWindow

public class ServiceWindow{
	private CustomerType type = CustomerType.COMMON;//用枚举定义三种窗口类型
	private int windowId = 1;//当前窗口号

	public void start(){
		Executors.newSingelThreadExecutor().execute(new Runnable(){
			public void run(){
				while(true){
					swich(type){
						case COMMON:
							commonService();
							break;
						case EXPRESS:
							expressService();
							break;
						case VIP:
							vipService();
							break;
					}
					if(type == CustomerType.COMMON){
						NumberMachine.getInstance().getCommonManager();
					}
				}
			});
		}
	}

	//对窗口类型和窗口号提供set方法,用来切换窗口
	public void setType(CustomerType type){
		this.type = type;
	}

	public void setWindowId(int windowId){
		this.windowId = windowId;
	}

	//普通窗口取号方法
	private void commonService(){
		String windowName = "第" + windowId + "号" + "普通" + "窗口"
		
		Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
		System.out.println(windowName + "正在获取任务");
		if(number != null){//取到号码
			System.out.println(windowName + "正在为第" + number + "个" + "普通" + "客户服务);
			long beginTime = System.currentTimeMillis();
			long maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
			long serverTime = new Random().nextInt(maxRand) + 1 + Constants.MIN_SERVICE_TIME;//休息的时间1-10秒
			try{
				Thread.sleep(serverTime);
			}catch(){
				
			}

			long costTime = System.currentTimeMillis() - beginTime;

			System.out.println(windowName + "为第" + number + "个" + "普通" + "客户完成服务,耗时" + costTime/1000 + "秒");
		}else{//没有取到号
			System.out.println(windowName + "没有取到服务任务,休息1秒");
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}

	//快速窗口取号方法
	private void expressService(){
		String windowName = "第" + windowId + "号" + type + "窗口"
		Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
		System.out.println(windowName + "正在获取任务");
		if(number != null){//取到号码
			System.out.println(windowName + "正在为第" + number + "个" + type + "客户服务);
			long beginTime = System.currentTimeMillis();
			
			try{
				Thread.sleep(Constants.MIN_SERVICE_TIME);//快速窗口办理时间为1秒
			}catch(){
				
			}

			long costTime = System.currentTimeMillis() - beginTime;

			System.out.println(windowName + "为第" + number + "个" + type + "客户完成服务,耗时" + costTime/1000 + "秒");
		}else{//没有取到号
			System.out.println(windowName +"没有取到服务任务");
			commonService();//没有取到VIP任务时,为普通客户服务。
						
		}
	}

	//VIP窗口取号方法
	private void vipService(){
		String windowName = "第" + windowId + "号" + type + "窗口"
		Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
		System.out.println(windowName + "正在获取任务");
		if(number != null){//取到号码
			System.out.println(windowName + "正在为第" + number + "个" + type + "客户服务);
			long beginTime = System.currentTimeMillis();
			
			try{
				Thread.sleep(Constants.MIN_SERVICE_TIME);//VIP窗口办理时间为1秒
			}catch(){
				
			}

			long costTime = System.currentTimeMillis() - beginTime;

			System.out.println(windowName + "为第" + number + "个" + type + "客户完成服务,耗时" + costTime/1000 + "秒");
		}else{//没有取到号
			System.out.println(windowName + "没有取到服务任务");
			commonService();//没有取到VIP任务时,为普通客户服务。
			
		}
	}
}


窗口枚举类CustomerType

public enum CustomerType{
	COMMON,EXPRESS,VIP;

	public String toString(){
		swich(this){
			case COMMON:
				
				return "普通";;

			case EXPRESS:
				return "快速";
			
			case VIP;
				return name();
		}

		return null;
	}
}


定义常量类Constants

public class Constants{
	public static int MAX_SERVICE_TIME = 10000;//最大办理时间
	public static int MIN_SERVICE_TIME = 1000;//最小办理时间
	public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;//普通客户间隔时间

} 


主方法运行测试类MainClass:

public class MainClass{
	public static void main(String[] args){
		ServiceWindow commonWindow = null;

		//创建5个普通窗口、1个VIP窗口和1个快速窗口
		for(int i=1;i<5;i++){
			commonWindow = new ServiceWindow();
			commonWindow.setWindowId(i);
			commonWindow.start();
		}

		ServiceWindow vipWindow = new ServiceWindow();
		vipWindow.setType(CustomerType.VIP);
		vipWindow.start();

		ServiceWindow expressWindow = new ServiceWindow();
		vipWindow.setType(CustomerType.EXPRESS);
		vipWindow.start();
		
		//创建普通客户对象。
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
		new Runnable(){
			public void run(){
				Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
				System.out.println(number + "号普通客户等待服务!");

			}
		},
		0,
		1,
		TimeUnit.SECONDS);

		//创建快速客户对象。
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
		new Runnable(){
			public void run(){
				Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
				System.out.println(number + "号快速客户等待服务!");
			}
		},
		0,
		Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2,
		TimeUnit.SECONDS);

		//创建VIP客户对象。
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
		new Runnable(){
			public void run(){
				Integer number = NumberMachine.getInstance().getVIPManager().generateNewManager();
				System.out.println(number + "号VIP客户等待服务!");
			}
		},
		0,
		Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
		TimeUnit.SECONDS);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值