银行业务系统:
如果是我面试拿到这样的面试题,我想我也该慌了,这不仅仅是要求对,知识学的好,还要求会准确明了的分析实际情况。
在看了该系统要求之后,用面向对象的思想分析:其中一共包括三类客户窗口,分别为COMMON(普通客户), EXPRESS(快速客户), VIP(高级客户),这三个客户的取号都是由一台机器产出的,所以考虑使用单例设计模式。
由对系统需求的分析:开始建立类图,一共三个类,以及类中所定义的方法
(1)NumberMachine类:此类为单例设计模式的体现,把其构造方法进行私有化,而且采用到的是饿汉式加载;getCommonManger();getVipManger();getExpressManger() getInstance()
代码块体现:
public class NumberMachine {
private NumberManger commonManger = new NumberManger();
private NumberManger expressManger = new NumberManger();
private NumberManger vipessManger = new NumberManger();
public NumberManger getCommonManger() {
return commonManger;
}
public NumberManger getExpressManger() {
return expressManger;
}
public NumberManger getVipManger() {
return vipessManger;
}
private NumberMachine() {
// TODO Auto-generated constructor stub
}
public static NumberMachine getInstance() {
return instance;
}
private static NumberMachine instance = new NumberMachine();
}
(2)NumberManger 类:此用来管理号码
generateNewManager();用来返回上一个号码。fetchServiceNumber() ;返回下一个该服务的号,这两个方法要用 synchronized ,来互斥。
代码块:
public class NumberManger {
private int lastNumber = 1;
private List<Integer> queueNumber=new ArrayList<Integer>();
//用 synchronized ,来互斥。
public synchronized Integer generateNewManager() {
queueNumber.add(lastNumber);
return lastNumber++;
}
//用 synchronized ,来互斥
public synchronized Integer fetchServiceNumber() {
Integer number =null;
if(queueNumber.size()>0){
return queueNumber.remove(0);
}
return number;
}
}
(3)ServiceWindow :为服务方法类,分别有三种服务模式
start() ; commonService() ;expressService() ;vipService()
private void commonService() {
String windowName="第"+windowId+"号"+type+"窗口;";
System.out.println("正在获取任务");
Integer number = NumberMachine.getInstance()
.getCommonManger().fetchServiceNumber();
if (number != null) {
long beginTime = System.currentTimeMillis();
int maxRand =Constants.MAX_SERVICE_TYPE-Constants.MIN_SERVICE_TYPE;
long serviceTime =new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TYPE;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"个"+type+"客户完成,耗时"+costTime/1000+"秒");
}else{
System.out.println("没有取到任务,先休息一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}