-------------------------------------------------android培训、java培训期待与您交流!----------------------------------
一、面向对象的分析与设计
1.有三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务 。
1)每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的,要有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。
2)由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。
2.各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。
1)各个窗口怎么知道该叫哪一个号了呢?它一定是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。
二、程序实现
1.NumberManager号码管理类
public class NumberManager {
private List<Integer> numbers=new ArrayList<Integer>();
private int number=1;
//生成号码,synchronized多线程安全访问,同步
public synchronized Integer generateNewNumber() {
numbers.add(number);
return number++;
}
//依次取走号码
public synchronized Integer fetchNumber() {
if(numbers.size()>0)
return numbers.remove(0);
return null;
}
}
2.NumberMachine号码类型机类
public class NumberMachine {
private NumberManager commonMachine=new NumberManager();
private NumberManager expressMachine=new NumberManager();
private NumberManager vipMachine=new NumberManager();
public NumberManager getCommonMachine() {
return commonMachine;
}
public NumberManager getExpressMachine() {
return expressMachine;
}
public NumberManager getVipMachine() {
return vipMachine;
}
//单例
private static NumberMachine numberMachine=new NumberMachine();
private NumberMachine() {}
public static NumberMachine getInstance()
{
return numberMachine;
}
}
3.Constants常量类
public interface Constants {
int MAX_WAIT_TIME=10;//最大等待时间
int MIN_WAIT_TIME=1;//最小等待时间
int COMMON_CUSTOMER_INTERVAL_TIME=1;//普通用户回调时间
}
4.CustomerType用户类型
public enum CustomerType {
COMMON,EXPRESS,VIP;
public String toString() {
switch (this) {
case COMMON:
return "普通";
case EXPRESS:
return "快速";
case VIP:
return name();
}
return null;
}
}
5.ServiceWindow窗口类
public class ServiceWindow {
private int windowId;
private CustomerType windowType;
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public void setWindowType(CustomerType windowType) {
this.windowType = windowType;
}
//各类型窗口开始服务
public void start()
{
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
switch(windowType)
{
case COMMON:
while(true)
commonService();
case EXPRESS:
while(true)
expressService();
case VIP:
while(true)
vipService();
}
}
});
}
public void commonService() {
Integer num=NumberMachine.getInstance().getCommonMachine().fetchNumber();
System.out.println(windowId+"号"+windowType+"窗口等待服务-----");
if(null!=num)
{
System.out.println(windowId+"号"+windowType+"窗口正在为"+num+"号普通客户服务");
int ranNum=new Random().nextInt(Constants.MAX_WAIT_TIME)+Constants.MIN_WAIT_TIME;
try {
Thread.sleep(ranNum*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowId+"号"+windowType+"窗口为"+num+"号普通客户服务完成,耗"+ranNum+"秒");
}
else
{
System.out.println(windowId+"号"+windowType+"窗口没有要服务的客户,休闲一秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void expressService() {
Integer num=NumberMachine.getInstance().getExpressMachine().fetchNumber();
System.out.println(windowId+"号"+windowType+"窗口等待服务-----");
if(null!=num)
{
System.out.println(windowId+"号"+windowType+"窗口正在为"+num+"号"+windowType+"客户服务");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowId+"号"+windowType+"窗口为"+num+"号"+windowType+"客户服务完成,耗1秒");
}
else
{
System.out.println(windowId+"号"+windowType+"窗口没有要服务的客户,转向为普通客户服务<--");
commonService();
}
}
public void vipService() {
Integer num=NumberMachine.getInstance().getVipMachine().fetchNumber();
System.out.println(windowId+"号"+windowType+"窗口等待服务-----");
if(null!=num)
{
System.out.println(windowId+"号"+windowType+"窗口正在为"+num+"号"+windowType+"客户服务");
int ranNum=new Random().nextInt(Constants.MAX_WAIT_TIME)+Constants.MIN_WAIT_TIME;
try {
Thread.sleep(ranNum*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowId+"号"+windowType+"窗口为"+num+"号普通客户服务完成,耗"+ranNum+"秒");
}
else
{
System.out.println(windowId+"号"+windowType+"窗口没有要服务的客户,转向为普通客户服务<--");
commonService();
}
}
}
6.Test 测试类
public class Test {
public static void main(String[] args) {
ServiceWindow commonWindow=null;
//四个普通窗口
for(int i=1;i<5;i++)
{
commonWindow=new ServiceWindow();
commonWindow.setWindowId(i);
commonWindow.setWindowType(CustomerType.COMMON);
commonWindow.start();
}
//一个快速窗口
ServiceWindow expressWindow=new ServiceWindow();
expressWindow.setWindowId(6);
expressWindow.setWindowType(CustomerType.EXPRESS);
expressWindow.start();
//一个vip窗口
ServiceWindow vipWindow=new ServiceWindow();
vipWindow.setWindowId(7);
vipWindow.setWindowType(CustomerType.VIP);
vipWindow.start();
//加入普通客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer commonId=NumberMachine.getInstance().getCommonMachine().generateNewNumber();
System.out.println(commonId+"号普通客户等待服务******");
}
}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS);
//加入快速客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer expressId=NumberMachine.getInstance().getExpressMachine().generateNewNumber();
System.out.println(expressId+"号快速客户等待服务******");
}
}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*2, TimeUnit.SECONDS);
//加入vip客户
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Integer vipId=NumberMachine.getInstance().getVipMachine().generateNewNumber();
System.out.println(vipId+"号vip客户等待服务******");
}
}, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME*6, TimeUnit.SECONDS);
}
}
-------------------------------------------------android培训、java培训期待与您交流!----------------------------------