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

---------------------- android培训java培训、期待与您交流! ----------------------
对于银行调度系统来说如果是没有看张老师的视频自己看了那个word文档,自己思考了一下真的觉得很复杂,但是在看了张老师的视频之后自己的思路也慢慢的跟了上来,首先明确的是我们在这里
系统分析一下:
有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务 。

系统中需要的类
l NumberManager类
定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
lNumberMachine
定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。
将NumberMachine类设计成单例。


l CustomerType枚举类
系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。
public enum CustomerType 
{
	COMMON,EXPRESS,VIP;
	public String toString()
	{
		switch(this)
		{
			case:COMMON:
				return "普通";
			case:EXPRESS:
				return "快速";
			case:VIP:
				return name();
		}
		return null;			
	}
}


l ServiceWindow类
定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。
定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。
class ServiceWindow 
{
	public void start()
	{
		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;
		}
		Exectors.newSingleThreadExector().execute(new Runnable()
		{
			public void run()
			{
				while(true)
				{
					//switch的数据类型只能有那些,int和枚举
					switch(type)
						case COMMON:
						commService();
							break;
						case EXPRESS:
							expressService()
							
							break;
						case VIP:
							vipService();
							
							break;

					
				}

			}
		});
		
	}
	private void commService()
		{
			String windowName = "第"+windowId+"号"+type+"窗口"; 
						System.out.println("正在获取任务");
							Integer number = NumberMachine.getInstance().getCommonManager();
							System.out.println(windowName+"为第"+number+"个"+"普通"+"客户服务")
							if(number != null)
							{
								long beginTime = System.currentTimeMillis();
								int maxRandom = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
								long serveTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
								try
								{
									Thread.sleep(servTime);
								}
								catch (InterruptedException e)
								{
									e.printStackTrace();
								}
								int endTime = System.currentTimeMillis();
								System.out.println(windowName+"为第"+number+"个"+"普通"+"客户完成服务,耗时"+(endTime-beginTime)/1000+"秒");
							}
							else
							{
								Sysetm.out.println("第"+number+"没有取到任务");
								try
								{
									Thread.sleep(1000);
								}
								catch (InterruptedException e)
								{
									e.printStackTrace();
								}
							}

		}
		private void expressService()
		{
			String windowName = "第"+windowId+"号"+type+"窗口"; 
						System.out.println("正在获取任务");
							Integer number = NumberMachine.getInstance().getCommonManager();
							System.out.println(windowName+"为第"+number+"个"+type+"客户服务")
							if(number != null)
							{
								long beginTime = System.currentTimeMillis();
								//int maxRandom = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
								//long serveTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
								try
								{
									Thread.sleep(Constants.MIN_SERVICE_TIME);
								}
								catch (InterruptedException e)
								{
									e.printStackTrace();
								}
								int endTime = System.currentTimeMillis();
								System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+(Constants.MIN_SERVICE_TIME+"秒");
							}
							else
							{
								Sysetm.out.println("第"+number+"没有取到任务");
								commService()
							}

		}
		private void vipService()
		{
			String windowName = "第"+windowId+"号"+type+"窗口"; 
						System.out.println("正在获取任务");
							Integer number = NumberMachine.getInstance().getCommonManager();
							System.out.println(windowName+"为第"+number+"个"+type+"客户服务")
							if(number != null)
							{
								long beginTime = System.currentTimeMillis();
								int maxRandom = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
								long serveTime = new Random().nextInt(maxRandom)+1+Constants.MIN_SERVICE_TIME;
								try
								{
									Thread.sleep(servTime);
								}
								catch (InterruptedException e)
								{
									e.printStackTrace();
								}
								int endTime = System.currentTimeMillis();
								System.out.println(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+(endTime-beginTime)/1000+"秒");
							}
							else
							{
								Sysetm.out.println("第"+number+"没有取到任务");
								commService();
							}

		}
	
}


l MainClass类
用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。
l Constants类
定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME
以上的都是按照张老师的思路而来的自己想要写分析出这样的流程首先是要非常的熟悉银行的业务,要有一个就是要有能熟练的掌握面向对象编程的思维,但是通过学习之后学习视频之后自己也慢慢的掌握了老师的那种面向对象的思维。


---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看: http://edu.csdn.net/heima
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值