----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
package com.isoftstone.interview.bank;
import java.util.ArrayList;
import java.util.List;
/*分析和设计:
(一)有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务。
1.首先,经常在银行办理业务的人更有利于理解本系统,
2.由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生三个号码管理器对象,
各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。
(二)各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。
1.各个窗口怎么知道该叫哪一个号了呢?它一定是问的相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。
2.需要多次亲身经历银行的这种业务,再加之积累了大量面向对象的应用开发经验,轻松进行这种设计,
发掘出其中隐含的对象信息就是日积月累出来的一种感觉。*/
/**
*
* @author Administrator
*
*/
//(一)NumberManager类:号码出现,获取类
public class NumberManager {
private int lastNumber = 1 ;// 定义一个客户号码
private List<Integer> queueNumbers = new ArrayList<Integer>();//存储所有等待服务的客户号码的队列集合。
public synchronized Integer generateNewManager()
{
queueNumbers.add(lastNumber);//把上一个客户的号码存入
return ++lastNumber;//把新的号码给新来的客户
}
/*
线程1:是客户进来排号
线程2:是服务窗口来拿号
都是对queueNumbers这个相同的数据进行操作
因此,要进行同步
*/
public synchronized Integer fetchNumber()//服务窗口来取号
{
if(queueNumbers.size()>0)//判断是否有客户
{
return queueNumbers.remove(0);//把最先的客户号码返回
}
else
{
return null;//返回null
}
}
}
package com.isoftstone.interview.bank;
/*(二)NumberMachine类
源码如下:
*/
public class NumberMachine { //号码管理类:3类
private NumberManager commonMansger = new NumberManager();//普通客户
private NumberManager expressMansger = new NumberManager();//快速
private NumberManager VipMansger = new NumberManager(); //vip客户
/*
* 因为这个号码管理类的客户是固定的,客户不能随便进来,必须由唯一一个类的对象进行处理
* 所以,应把NumberMachine类设计成单例。
*/
private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance()
{
return instance;
}
//返回普通号
public NumberManager getCommonMansger()
{
return commonMansger;
}
//返回快速号
public NumberManager getExpressMansger()
{
return expressMansger;
}
//返回Vip号
public NumberManager getVipMansger()
{
return VipMansger;
}
}
package com.isoftstone.interview.bank;
/*(三)CustomerType枚举类
1.系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
2.重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的。
源码如下:
*/
public enum CustomerType {
COMMON,EXPRESS,VIP;
//重写toString()方法
public String toString()
{
String name = null;
switch(this)
{
case COMMON :
name = "COMMON";
case EXPRESS:
name = "EXPRESS";
case VIP:
name = "VIP";
}
return name;
}
}
package com.isoftstone.interview.bank;
import java.util.Random;
import java.util.concurrent.Executors;
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------