银行业务调动系统:
系统需求::
<1>. 一共有6个窗口,1到4号是普通窗口,5号是快速窗口,6号VIP窗口; 分别对应三种类型客户,普通的客户, 快速的客户, VIP的客户;
<2>. 随机生成各种类型客户, 生成的概率比例是, 6 : 3 :1;
<3>. 办理业务时间有最大值和最小值, VIP客户和普通客户需要服务的时间在允许范围内, 随机设定的, 快速客户是最小值
<4>. 具体服务的逻辑和现实生活是相同的;
1. 具体思路:
<1>. 生成客户: 每一个银行都有一个取号器, 取号器可以生产三种类型客户, 每产生一个号, 就等于生产了一个相应类型的客户, 每种类型客户号码编排都是独立的;
<2>. 银行办理过程: 业务办理由窗口叫号来完成, 办理业务不是客户自己去办理, 是等到某一个窗口叫到自己的号码时, 就等于开始服务了, 所以要有一个叫号器;
<3>. 窗口叫号分析: 叫号器要先知道取号器那里当前总共有多少个号码, 然后每一个相应类型的窗口优先叫自己对应类型的客户, 当没有获取到本类型客户服务时,VIP客户和快速窗口客户也可以去叫普通号码, 这里需要将取号器产生的所有号码存起来, 可以用一个集合, 这样当取号器那里生成了一个号码时, 叫号器就记录这个号码, 然后开始一次叫号:
2. 实现代码:
<1>. NumberManager类-----定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合,定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步
public class NumberManager {
private int lastNumber = 0;
private List queueNumbers = new ArrayList();
public synchronized Integer generateNewNumber(){
queueNumbers.add(++lastNumber);
return lastNumber;
}
public synchronized Integer fetchNumber(){
if(queueNumbers.size()>0){
return (Integer)queueNumbers.remove(0);
}else{
return null;
}
}
}
<2>.NumberMachine类-----定义三个成员变量分别指向三个NumberManager对象,分别表示普通.快速和VIP客户的号码管理器,定义三个对应的方法来返回这个NumberManager对象,将NumberMachine类设计成单例
private NumberMachine(){}
private static NumberMachine instance = new NumberMachine();
public static NumberMachine getInstance(){
return instance;
}
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;
}
<3>.ServiceWindow类-----定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法,定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息
public void start(){
Executors.newSingleThreadExecutor().execute(
new Runnable(){
public void run(){
//下面这种写法的运行效率低,最好是把while放在case下面
while(true){
switch(type){
case COMMON:
commonService();
break;
case EXPRESS:
expressService();
break;
case VIP:
vipService();
break;
}
}
}
}
);
}
在看完张老师所讲的银行业务调动系统的视频后, 干觉自己在对面向对象方面的逻辑提高了很多, 使自己丰富了很多扩展性的知识,张老师在视频中传授给我们一些很重要的经验
“ 面向对象设计把握一个重要的经验: 谁拥有数据, 谁就对外提供操作这些数据的方法 ”和在解决问题上非常实用的经验 “ 画图非常有助于理解和分析问题, 你还有比画图更好的办法吗? ”看过张老师的视频后非常充实, 谢谢张前辈!
---------------------- android培训、 java培训、期待与您交流! ----------------------