银行管理系统:
需求:分别有6个窗口,1~4号为普通客户窗口,5号为快速窗口,6号为VIP窗口,当VIP窗口没有任务是就为普通客户服务,如果有VIP客户来了就为VIP客户服务
分析与设计:
有三种对应类型的客户VIP客户、普通客户、快速客户、异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务。
1、 每一个客户就是有银行的一个取号机产生号码的方式来表示的,所以有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户
2、 由于有三种类型客户,每种类型客户的号码编排都是完全独立的,所以本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码,这三个号码管理器统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以它要被设计成单列,
各类型客户在其对应窗口按顺序依次办理业务,也就是窗口依次叫号
服务窗口每次找号码管理器获取当前要被服务的号码号码产生器类:
package com.isftstome.interview.bank;
import java.util.ArrayList;
import java.util.List;
/**
* 号码产生器
* @author Administrator
*因为两个线程要同时操作一个数据所以加上了synchronized
*/
public class NumberManager {
//上一次返回的代码
private int lastNumber=1;
//排队的号码
private List<Integer> queneNumber = new ArrayList<Integer>();
//客户生产号方法
public synchronized Integer generateNewManager(){
queneNumber.add(lastNumber);
return lastNumber++;
}
//窗口取号的方法
public synchronized Integer fetchServiceNumber(){
Integer number= null;
if (queneNumber.size()>0) {
number = queneNumber.remove(0);
}
return number;
}
}
号码管理器类:
package com.isftstome.interview.bank;
/**
* 号码管理器
* @author Administrator
*
*/
public class NumberMachine {
//vip管理器
private NumberManager VipManeger = new NumberManager();
//快速客户管理器
private NumberManager expressManager = new NumberManager();
//普通客户管理器
private NumberManager commonManeger = new NumberManager();
public NumberManager getVipManeger() {
return VipManeger;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getCommonManeger() {
return commonManeger;
}
//单列
private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}
}
窗口类型:
package com.isftstome.interview.bank;
/**
* 窗口类型
* @author Administrator
*
*/
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString() {
switch (this) {
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return "VIP";
default:
break;
}
return null;
};
}
服务窗口类:
package com.isftstome.interview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
/**
* 服务窗口
*
* @author Administrator
*
*/
public class ServiceWindow {
// 定义变量是哪个窗口
private CustomerType type = CustomerType.COMMON;
//窗口号码,默认1号窗口
private int windowId = 1;
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
// 叫号方法
public void start() {
Executors.newScheduledThreadPool(1).execute(new Runnable() {
@Override
public void run() {
while (true) {
switch (type) {
case COMMON:
comonService();
break;
case EXPRESS:
excuteService();
break;
case VIP:
VIPService();
break;
default:
break;
}
}
}
});
}
private void comonService() {
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在取任务");
Integer number = NumberMachine.getInstance()
.getCommonManeger().generateNewManager();
if (number!=null) {
//服务该号
System.out.println(windowName+"正在为第"+number+"个"+type+"客户服务");
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
int maxServiceTime = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
long serviceTime=new Random().nextInt(maxServiceTime)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long castTime = endTime-startTime;
System.out.println(windowName+"为第"+number+"个"+type+"客户服务,耗时"+castTime);
} else {
System.out.println(windowName+"没有取到服务,休息1秒钟");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void excuteService() {
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在取任务");
Integer number = NumberMachine.getInstance()
.getExpressManager().generateNewManager();
if (number!=null) {
//服务该号
System.out.println(windowName+"正在为第"+number+"个"+type+"客户服务");
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
long castTime = endTime-startTime;
System.out.println(windowName+"为第"+number+"个"+type+"客户服务,耗时"+castTime);
} else {
comonService();
}
}
private void VIPService() {
String windowName = "第"+windowId+"号"+type+"窗口";
System.out.println(windowName+"正在取任务");
Integer number = NumberMachine.getInstance()
.getVipManeger().generateNewManager();
if (number!=null) {
//服务该号
System.out.println(windowName+"正在为第"+number+"个"+type+"客户服务");
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
int maxServiceTime = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
long serviceTime=new Random().nextInt(maxServiceTime)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long castTime = endTime-startTime;
System.out.println(windowName+"为第"+number+"个"+type+"客户服务,耗时"+castTime);
} else {
comonService();
}
}
}
服务时间类:
package com.isftstome.interview.bank;
/**
* 服务时间类
* @author Administrator
*
*/
public class Constants {
//最大时间
public static int MAX_SERVICE_TIME=10000;
//最小时间
public static int MIN_SERVICE_TIME=10000;
//客户各多少时间来
public static int conmonTime = 1;
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------