您的位置:首页 > 职场人生

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

2014-06-16 13:33 387 查看
------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------
需求(略)
思路
1、需求简述
客户拿号等着办理业务,业务窗口叫号为客户办理业务
2、名次提炼找对象
客户、号码、窗口、业务(隐性)
3、简析对象
客户:普通、快速、vip三种类型客户,可用枚举表示,不同客户有不同服务号码
号码:三种客户需要分别服务,因而有三种号码,每个号码对应一个客户且按先后排序,
     客户拿号和窗口叫号对应号码对象则提供两种方法
窗口:普通、快速、vip三种类型窗口,不同类型窗口服务方式不一样,但都是按获取的号码依次提供服务
业务:无需体现具体业务,可用随机方式设置办理业务时间
4、对象关联
客户-->明确服务类型-->获取该服务类型号码-->等待窗口叫号服务
(明确类型,银行是通过一台机器客户在上面选择的方式完成)
5、类的创建
号码管理
属性:下一个需要服务号码、装号码的集合
行为:为客户产生新号码方法、无窗口提供下一个服务号码
客户
普通、快速、vip三种实例对象
不同类型号码管理
属性:普通、快速、vip三种类型号码管理
行为:仅一个对象来明确需那种类型、三种生成号码管理的方法
窗口
属性:窗口类型、窗口编号
方法:开始服务的方法,三种服务方法
主函数类
创建1、2、3、4号普通窗口,5号快速窗口,6号vip窗口
创建3个线程分别来模拟生成三种客户且取相应的服务号码
另定义一个常量类来装程序所需的常量
package cn.ithema.interview.bank1;

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 generateNewNumber(){
queueNumber.add(lastNumber);
return lastNumber++;
}
//定义一个为窗口获取服务号码的方法,
//因为取号叫号为多个线程控制,所以使用同步函数
public synchronized Integer fetchNumber(){
if(queueNumber.size()>0)
return queueNumber.remove(0);
return null;
}
}
package cn.ithema.interview.bank1;
public class NumberMachine {
//单例设计
private static final NumberMachine instance = new NumberMachine();
private 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;
}
}
package cn.ithema.interview.bank1;
public enum ClientType {
COMMON,EXPRESS,VIP;
public String toString() {
switch(this){
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return "vip";
}
return null;
}
}
package cn.ithema.interview.bank1;
public class Constants {
public static final int MAX_SERVICE_TIME = 10000;
public static final int MIN_SERVICE_TIME = 1000;
public static final int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
package cn.ithema.interview.bank1;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
//定义窗口服务客户类型和窗口编号,并创建其set和get方法
private int id;
private ClientType type;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public ClientType getType() {
return type;
}
public void setType(ClientType type) {
this.type = type;
}
//定义窗口启动服务方法,需要多线程循环执行
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 void commonService(){
//定义一个窗口名字
String windowName = "<"+id+"号"+type+"窗口"+">";
//获取服务号码
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();
//若号码有值则服务,若号码无值,则等待1s
if(serviceNumber!=null){
System.out.println(windowName+"开始获取普通客户服务任务");
//随机产生服务时间,通过sleep方法实现服务时间
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+"没有需要服务的普通客户,等待1s后再发起服务");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void expressService(){
String windowName = "<"+id+"号"+type+"窗口"+">";
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
//若号码有值则服务,若号码无值,则服务普通客户
if(serviceNumber!=null){
System.out.println(windowName+"开始获取快速客户服务任务");
//服务时间为最短时间,通过sleep方法实现服务时间
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();
}
}
public void vipService(){
String windowName = "<"+id+"号"+type+"窗口"+">";
Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
//若号码有值则服务,若号码无值,则服务普通客户
if(serviceNumber!=null){
System.out.println(windowName+"开始获取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();
}
}
}
package cn.ithema.interview.bank1;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
public static void main(String[] args) {
//1、2、3、4号普通窗口,5号快速窗口,6号vip窗口,并调用start方法
for(int i=1;i<5;i++){
ServiceWindow commonWindow = new ServiceWindow();
commonWindow.setId(i);
commonWindow.setType(ClientType.COMMON);
commonWindow.start();
}
ServiceWindow expressWindow = new ServiceWindow();
expressWindow.setId(1);
expressWindow.setType(ClientType.EXPRESS);
expressWindow.start();

ServiceWindow vipWindow = new ServiceWindow();
vipWindow.setId(6);
vipWindow.setType(ClientType.VIP);
vipWindow.start();

//创建三个定时器,通过定期由NumberMachine按类型拿号来模拟客户拿号
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run() {
Integer serviceNumber = NumberMachine.getInstance().getCommonManager().generateNewNumber();
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().generateNewNumber();
System.out.println("第"+serviceNumber+"号快速客户正在等待服务");
}
}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, TimeUnit.SECONDS);
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);
}
}


------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: