黑马程序员:银行业务调度系统学习
2012-02-29 17:20
381 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
1,三种客户类型:普通客户,快速客户,VIP客户。
客户到银行后要通过一个排号机排号,排号机上有三个选项分别是普通业务,快速业务,VIP业务。
2,银行的服务窗口开启口,工作人员会按一个按钮,喇叭就会通知哪位客户到哪个窗口,这是由一个号码管理器安排的。
3,如果VIP窗口和快速窗口空闲时,也可以临时处理普通客服的服务。
排号机要有三个方法分别获取三种客户类型。三种客户类型有各自的管理器,但是都由同一个排号机产生
所以排号机是单例模式
getCommonManager(),getExpressManager(),getVipManager()
2, NumberManager类
定一个集合储存所以排号机产生的所有客户,
当窗口启动服务后排号机要把对应的客户分配给不同的窗口。
3, ServiceWindow类:对视频中的代码做了优化但存在小问题。
定义一个start方法,表示工作人员按了按钮,向号码管理器要客户。
在定义三个不同的方法表示对不同服务。
4, CustomerType类
用枚举定义三种类型的客户
Constant 类
Main类
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
银行业务调度系统
一、项目分析
提示:画图非常有助于理解和分析项目的问题,所以一定要先画图理清楚思路。1,三种客户类型:普通客户,快速客户,VIP客户。
客户到银行后要通过一个排号机排号,排号机上有三个选项分别是普通业务,快速业务,VIP业务。
2,银行的服务窗口开启口,工作人员会按一个按钮,喇叭就会通知哪位客户到哪个窗口,这是由一个号码管理器安排的。
3,如果VIP窗口和快速窗口空闲时,也可以临时处理普通客服的服务。
二,对象具体功能的分析
1, NumberMachine类排号机要有三个方法分别获取三种客户类型。三种客户类型有各自的管理器,但是都由同一个排号机产生
所以排号机是单例模式
getCommonManager(),getExpressManager(),getVipManager()
package com.itcast.bank; 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类
定一个集合储存所以排号机产生的所有客户,
当窗口启动服务后排号机要把对应的客户分配给不同的窗口。
package com.itcast.bank; import java.util.ArrayList; import java.util.List; public class NumberManager { private Integer lastNumber = 1; //储存产生的所有号码 private List<Integer> queueNumber = new ArrayList<Integer>(); public synchronized Integer generateNewManager(){ queueNumber.add(lastNumber); return lastNumber++; } public Integer fetchServiceNumber(){ Integer number = null; if(queueNumber.size()>0) return queueNumber.remove(0); return number; } }
3, ServiceWindow类:对视频中的代码做了优化但存在小问题。
定义一个start方法,表示工作人员按了按钮,向号码管理器要客户。
在定义三个不同的方法表示对不同服务。
package com.itcast.bank; import java.util.Random; import java.util.concurrent.Executors; public class ServiceWindow { private CustomerType type = CustomerType.COMMON; public 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(){ Integer number = null; while(true){ switch(type){ case COMMON: number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); service(CustomerType.COMMON,number); break; case EXPRESS: number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); service(CustomerType.EXPRESS,number); break; case VIP: number = NumberMachine.getInstance().getVipManager().fetchServiceNumber(); service(CustomerType.VIP,number); break; } } } }); } //建立窗口服务的方法。 private void service(CustomerType type,Integer number) { String windowName = "第" + windowId + "号【"+type+"】 窗口"; System.out.println(windowName + "正在提供服务"); if(number!=null){ System.out.println(windowName + "正在为第(" + number + ")位"+ "【"+type+"】客户服务!"); long beginTime = System.currentTimeMillis(); int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; long serverTime = new Random().nextInt(maxRand) + 1 + Constants.MIN_SERVICE_TIME; try { Thread.sleep(serverTime); } catch (Exception e) { e.printStackTrace(); } long costTime = System.currentTimeMillis() - beginTime; System.out.println(windowName + "为第(" + number + ")位"+ "【"+type+"】客户完成服务!服务时间为:"+ costTime/1000 +"秒"); }else{ System.out.println(windowName + "没有取到任务,喝口茶等1秒!"); try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } } }
4, CustomerType类
用枚举定义三种类型的客户
package com.itcast.bank; public enum CustomerType { COMMON,EXPRESS,VIP; public String toString(){ switch(this){ case COMMON: return "普通"; case EXPRESS: return "快速"; case VIP: return name(); } return null; } }
Constant 类
package com.itcast.bank; public class Constants { public static int MAX_SERVICE_TIME = 10000; public static int MIN_SERVICE_TIME = 1000; }
Main类
package com.itcast.bank; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) { for (int i=1; i<5; i++){ ServiceWindow commonWindow = new ServiceWindow(); commonWindow.setWindowId(i); commonWindow.start(); } ServiceWindow vipWindow = new ServiceWindow(); vipWindow.setType(CustomerType.VIP); vipWindow.start(); ServiceWindow expressWindow = new ServiceWindow(); expressWindow.setType(CustomerType.EXPRESS); expressWindow.start(); Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager(); System.out.println(number + "号普通客户等待服务"); } }, 0, 1, TimeUnit.SECONDS); Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager(); System.out.println(number + "号快速客户等待服务"); } }, 0, 6, TimeUnit.SECONDS); Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer number = NumberMachine.getInstance().getVipManager().generateNewManager(); System.out.println(number + "号VIP客户等待服务"); } }, 0, 3, TimeUnit.SECONDS); } }
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
相关文章推荐
- 黑马程序员——银行业务调度系统学习日志
- 黑马程序员——java基础学习(银行业务调度系统)
- 黑马程序员--银行业务调度系统学习
- 黑马程序员-银行业务调度系统学习-No.12
- 黑马程序员学习笔记之十(银行业务调度系统学习)
- 黑马程序员 JAVA学习笔记 ——银行业务调度系统
- 黑马程序员--银行业务调度系统学习
- 黑马程序员_java学习日记银行业务调度系统
- 黑马程序员-JAVA学习之银行业务调度系统分析与实现
- 黑马程序员---张老师银行业务调度系统学习
- 【黑马程序员】银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员_学习日记_银行业务调度系统
- 黑马程序员—Java基础学习笔记之7K月薪面试题破解_银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员——7K面试题之银行业务调度系统
- 黑马程序员————银行业务调度系统(第十篇)
- 黑马程序员——银行业务调度系统学习笔记
- 黑马程序员---银行业务调度系统