黑马程序员Java应用之银行业务调度

原创 2012年03月30日 16:25:12

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

面向对象的分析:有三种类型的客户,VIP、普通和快速;异步随机生成各种类型的客户;各种类型客户在其对应窗口按顺序依次办理业务。

1.NumberManager号码管理器,负责产生号码和取号,这两个号码要用不同的线程操作,同时先取到号码的客户先进行服务,所以两个线程要同步

package horse;
import java.util.ArrayList;
import java.util.List;
/**这个类负责生产号码和取号
 */
public class NumberManager {
	private int lastNumber = 1;
	//排队号码
	private List<Integer> queueNumber = new ArrayList<Integer>();
	//生产一个号码
	public synchronized Integer generageNewManager() {
		queueNumber.add(lastNumber);
		return lastNumber++;
	}
	//取号
	public synchronized  Integer fetchServiceNumber() {
		return queueNumber.remove(0);
	} 
}

2.号码管理器类NumberMachine,负责三类客户号码管理,一个银行业务系统只有一个号码机器,所以要设计为单利模式

package horse;
/**这个类负责三类客户号码管理
 */
public class NumberMachine {
	//创建一个普通用户
	private NumberManager commonManager = new NumberManager();
	//创建一个快速用户
	private NumberManager expressManager = new NumberManager();
	//创建一个vip用户
	private NumberManager vipManager = new NumberManager();
	//普通用户的get、set方法
	public NumberManager getCommonManager() {
		return commonManager;
	}
	public void setCommonManager(NumberManager commonManager) {
		this.commonManager = commonManager;
	}
	//快速用户的get、set方法
	public NumberManager getExpressManager() {
		return expressManager;
	}
	public void setExpressManager(NumberManager expressManager) {
		this.expressManager = expressManager;
	}
	//vip用户的get、set方法
	public NumberManager getVipManager() {
		return vipManager;
	}
	public void setVipManager(NumberManager vipManager) {
		this.vipManager = vipManager;
	}
	private NumberMachine() {
		super();
	}
	//创建一个实例
	public static NumberManager getInstance(){
		return instance;
	}
	private static NumberManager instance = new NumberManager();
}

3. 服务窗口类(ServiceWindow)及其相关

CustomerType类用枚举的方法列出三类人群,需要重写toString()方法,返回中文名名称。

package horse;
/**这是一个枚举用户列出三类人群
 * 另重写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;
	}
}

Constants用于设置客户所需服务的时间,分为最大值和最小值

package horse;
/**用于设置客户所需服务的时间,分为最大值和最小值
 */
public class Constants {
	
	public static int MAX_SERVICE_TIME = 10000; //10秒!
	public static int MIN_SERVICE_TIME = 1000; //1秒!
	public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}

服务窗口类ServiceWindow,负责处理叫号

package horse;
import java.util.Random;
import java.util.concurrent.Executors;
/**定义三种方法为为三类客户服务
 * 其中用到了Constants类(用于设置客户所需服务的时间)
 * 用到了NumberManager中的方法
 */
public class ServiceWindow {
	//private static Logger = Logger.getLogger
	private CustomerType type = CustomerType.COMMON;
	private int windowId = 1;
	//普通用户的服务函数
	private void commonService(){
		String windowName = "第"+windowId+"号"+type+"窗口";
		System.out.println(windowName+"开始获取普通任务");
		//Integer number = NumberManager.getInstance().getCommonManager().fetchNumber();
		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 = "第"+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) {
			    e.printStackTrace();
			   }  
			   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) {
		    e.printStackTrace();
		   }  
		   System.out.println(windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒");  
		  }else{
		   System.out.println(windowName + "没有取到VIP任务!");    
		   commonService();
		  } 
		 }
	//启动了一个单线程
	public void start(){
		Executors.newSingleThreadExecutor().execute(new Runnable(){
			public void run(){
				while(true){
					switch(type){
					case COMMON: commonService();break;
					case EXPRESS: expressService();break;
					case VIP: vipService();break;
					}
				}
			}
		});
	}	
	public int getWindowId() {
		return windowId;
	}
	public void setWindowId(int windowId) {
		this.windowId = windowId;
	}
	public CustomerType getType() {
		return type;
	}
	public void setType(CustomerType type) {
		this.type = type;
	}
}

4测试类(MainClas

package horse;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**用于测试
 */
public class MainTest {
	public static void main(String[] args) {
		//产生4个普通窗口
		for(int i=1;i<5;i++){
			//创建一个服务窗口
			ServiceWindow window = new ServiceWindow();
			window.setWindowId(i);
			window.start();
		}
		//产生一个快速窗口
		ServiceWindow expressWindow = new ServiceWindow();
		expressWindow.setType(CustomerType.EXPRESS);
		expressWindow.start();
		//产生一个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().generageNewManager();
				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().generageNewManager();
				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);

		}
}

感受:直至今天我的文章终于写完了,写完并不代表我都会了,确切的说我是把相关的基础知识加上配套的代码整理了下,本来还想写awt的,可怕来不及,就留到以后整理了。在此也很感谢黑马推出的这个平台,因为这十篇文章里的很多东西(包括代码),都是从论坛以及其他同学的文章借鉴过来的,我不敢居功

 ---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima

黑马程序员------张孝祥老师------银行业务调度系统

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------...
  • wowojiajiawowojiajia
  • wowojiajiawowojiajia
  • 2014年06月09日 15:31
  • 346

黑马程序员-java银行业务

------- android培训、java培训、期待与您交流! ---------- java专题之银行业务调度系统 1.首先让我们来看看具体的业务逻辑 模拟实现银行业务调度系...
  • vmvm555
  • vmvm555
  • 2013年04月20日 14:32
  • 883

银行业务调度系统的实现

需求:银行业务调度系统模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通...
  • dlf123321
  • dlf123321
  • 2017年02月22日 11:08
  • 1735

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

2.1 题目: 模拟实现银行业务调度系统逻辑,具体需求如下: ? 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 ? 有三种对应类型的客...
  • urchin_888
  • urchin_888
  • 2014年06月03日 20:51
  • 237

黑马程序员-Java银行业务调度系统

项目分析: 项目中用到的对象:号码、取号机、窗口、顾客的类型。因为项目的侧重点不在“顾客”,所以顾客不作为一个单独的对象,而是和号码对象结合在了一起,号码对象可以产生新号码,则产生的新号码就相当...
  • u011039419
  • u011039419
  • 2014年04月18日 20:47
  • 444

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

------- android培训、java培训、java学习型技术博客、期待与您交流! ---------- 业务需求:     关系图:   各个类的功能 l...
  • woailishan
  • woailishan
  • 2012年12月19日 14:57
  • 163

黑马程序员--java银行业务调度系统

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- 银行业务调度系统 需求: 1、银行内有6...
  • szluyimin
  • szluyimin
  • 2014年06月24日 23:25
  • 453

黑马程序员---银行业务调度系统【java】

------- android培训、java培训、期待与您交流! ---------- 银行业务调度系统 项目需求分析  银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速...
  • LIUJINGPENG123
  • LIUJINGPENG123
  • 2012年12月26日 22:26
  • 187

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

模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。   Ø 有三种对应类型的客户:VIP客户,普通客户,快速...
  • u014348457
  • u014348457
  • 2014年05月21日 13:08
  • 177

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

----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 银行业务调度系统 模拟实现银行业务...
  • sZuoSuYan
  • sZuoSuYan
  • 2013年07月12日 22:15
  • 464
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员Java应用之银行业务调度
举报原因:
原因补充:

(最多只允许输入30个字)