---------------------- android培训、 java培训、期待与您交流! ----------------------
传说中的银行业务调度系统又重出江湖啦!
张老师说这句话说了很多次了,由此可见,这道题以后面试时是十分有用的,下面来总结一下这节里面学习的内容:
我们来用面向对象的分析与设计,分析其中有多少类,以及多少对象,和他们之间的关系。
银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。
要进行面向对象的程序设计,一定要深入了解你要进行模拟的系统的各个功能流程,这样你才能够设计出好的面向对象设计。
代码如下:
package com.isoftstone.interview.bank;
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 generatorNewManager(){//自动生成号码
queueNumber.add(lastNumber);
return lastNumber++;
}
public synchronized Integer fetchNumberServiceNumber(){
Integer number=null;
if(queueNumber.size()>0){
number=queueNumber.remove(0);//取走队首的号码
}
return number;
}
}
package com.isoftstone.interview.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(){}
private static NumberMachine instance=new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}
}
package com.isoftstone.interview.bank;
public class Constants {
public static int MAX_SERVICE_TIME=10000;
public static int MIN_SERVICE_TIME=1000;
public static int COMMON_CUSTOMER_INTERVAL_TIME=1;//普通客户
}
package com.isoftstone.interview.bank;
public enum CustomerType {
COMMON, EXPRESS, VIP;
public String toString() {
switch (this) {
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}return null;
}
}
package com.isoftstone.interview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
public class ServiceWindow {
private CustomerType type=CustomerType.COMMON;
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
private int windowId=1;
public void start(){
//使用线程,启动吧//线程池,线程池在里面找到一个空闲的线程
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
while(true){
switch (type) {//switch(n)也可以使用枚举值,
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
NumberMachine.getInstance().getCommonManager();
}
}
});
}
private void commonService() {
String windowName="第"+windowId+"号"+type+"窗口";
Integer number=NumberMachine.getInstance().getCommonManager().fetchNumberServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
System.out.println(windowName+"为第"+number
+"个"+"普通"+"客户服务");
long beginTime= System.currentTimeMillis();
int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//9000
long serviceTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costTime= System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number
+"个"+"普通"+"客户完成服务,耗时"
+(costTime/1000)+"秒");
}else{
System.out.println(windowName+"没有取到任务,先休息1秒钟!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void expressService() {
String windowName="第"+windowId+"号"+type+"窗口";
Integer number=NumberMachine.getInstance().getExpressManager().fetchNumberServiceNumber();
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;//9000
//long serviceTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(Constants.MIN_SERVICE_TIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costTime= System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number
+"个"+type+"客户完成服务,耗时"
+(costTime/1000)+"秒");
}else{
System.out.println(windowName+"没有取到任务,先休息1秒钟!");
commonService();//express没有客户的时候,处理普通客户
}
}
private void vipService() {
String windowName="第"+windowId+"号"+type+"窗口";
Integer number=NumberMachine.getInstance().getVipManager().fetchNumberServiceNumber();
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;//9000
long serviceTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long costTime= System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number
+"个"+type+"客户完成服务,耗时"
+(costTime/1000)+"秒");
}else{
System.out.println(windowName+"没有取到任务!");
commonService();//vip没有客户的时候,处理普通客户
}
}
}
package com.isoftstone.interview.bank;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MainClass {
public static void main(String[] args) {
for(int i=1;i<5;i++){
ServiceWindow commonWindow=new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.start();
}
ServiceWindow expressWindow=new ServiceWindow();
expressWindow.setType(CustomerType.EXPRESS);
expressWindow.start();
ServiceWindow vipWindow=new ServiceWindow();
vipWindow.setType(CustomerType.VIP);
vipWindow.start();
//异步随机生成各种类型的客户,生成各种类型用户的概率比例vip:comm:express=1:6:3
//普通
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
//叫号
Integer number=NumberMachine.getInstance().getCommonManager().generatorNewManager();
System.out.println("第"+number+"号普通客户正在等待服务!");
}
},
0,//过多长时间来
Constants.COMMON_CUSTOMER_INTERVAL_TIME,//
TimeUnit.SECONDS);//确定来的时间
//快速
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
//叫号
Integer number=NumberMachine.getInstance().getExpressManager().generatorNewManager();
System.out.println("第"+number+"号普通客户正在等待服务!");
}
},
0,//过多长时间来
Constants.COMMON_CUSTOMER_INTERVAL_TIME*3,//
TimeUnit.SECONDS);//确定来的时间
//vip
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
//叫号
Integer number=NumberMachine.getInstance().getVipManager().generatorNewManager();
System.out.println("第"+number+"号vip客户正在等待服务!");
}
},
0,//过多长时间来
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,//
TimeUnit.SECONDS);//确定来的时间
}
}

634

被折叠的 条评论
为什么被折叠?



