黑马程序员_银行业务系统

------- android培训java培训、期待与您交流! ---------- 


业务需求:
1 ·银行有6个业务窗口,1.4窗口为普通窗口,5号为快速窗口,6号为VIP窗口。
2  有三种对应类型的客户:VIP客户,普通客户,快读客户
3  异步随机生成各种类型的客户,生成各种类型的客户的概率比例为
4  VIP客户:普通客户:快速客户=1:6:3;
5  客户办理业务所需时间有最大值和最小值,在该范围内随机设定每隔 VIP客户                                                                                                  

以及普通用户客户办理业务所需时间,快速客户办理业务所需时间为最小值 。                                                                                                

 6  各类型客户在其对应窗口依次办理业务                                                                                                                                   

7  当VIP窗口和快速业务窗口没有客户等待业务时候,这两个窗口可以处理普通客户的业务,                                                                                     

 而一旦有对应客户带带办理业务时候,则优先处理对应客户的业务                                                                                                              

8  随机生成客户时间间隔以及业务办理时间最大值和最小值指定,可以设置                                                                                                    

 9 不要实现GUI,只考虑系统逻辑实现。可通过Log方式展现程序运行结果


面向对象的分析与设计:
1、有三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,                                                                                    

 各类型客户在其对应窗口按顺序依次办理业务 。                                                                                                                            

 (1)每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的。所以,我想到要有                                                                                    

   一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。                                                                                                   

 (2)由于有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生                                                                                 

三个号码管理器对象,各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码                                                                                  

机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。

2、各类型客户在其对应窗口按顺序依次办理业务 ,准确地说,应该是窗口依次叫号。
各个窗口怎么知道该叫哪一个号了呢?它一定是问的相应的号码管理器,即服务窗口每次找                                                                                       

 号码管理器获取当前要被服务的号码。


整体思路:
(1)定义号码管理器,对外提供生成号码和获取号码的方法,创建NumberManager类
(2)定义管理三个号码管理器的机器对象,用单例实现。创建NumberMachine类                                                                                                   

 (3)创建枚举,在里面定义三个客户类型常量。创建Consumer枚举类                                                                                                          

(4)定义业务窗口。创建serviceWindow窗口                                                                                                                                 

 (5)用主类测试,创建四个业务窗口,一个快速窗口,一个VIP窗口,创建定时器的线程池,                                                                                       

模拟不同时间都有各种类型的客户来叫号等待服务。


代码如下

------------------------------------------------------------------------------------------------------------------------------------------

public class NumberManager {
    private int lastNumber=1;
    private List<Integer> queueNumber =new ArrayList<Integer>();
    //将机器产生数据存到的集合中,保证读取产生的号码
public synchronized Integer generateNewManager(){
    queueNumber.add(lastNumber);
return  lastNumber++;
     }
public synchronized Integer fetchServiceNumber(){
//由于两个线程需要访问同一个数据 所以需要用同步让其互斥
Integer number=null;       //定义成Integer类型防止空指针异常
if(queueNumber.size()>0){        //防止角标越界
number= queueNumber.remove(0);   //保证只能取出已产生的号码 非常巧妙
}
return number;
  }
}

-----------------------------------------------------------------------------------------

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(){}
    public static NumberMachine getInstance(){
    return instance;
    }
    private static NumberMachine instance=new NumberMachine();

}

-----------------------------------------------------------------------------------------

//单例模式
public class NumberMachine {
//在NumberMachine类中产生3个NumberManager对象常量common express vip
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;
    }

}

-----------------------------------------------------------------------------------------

//枚举

public enum CustomerType {
   COMMON,VIP,EXPRESS;   
   public String toString(){  //覆盖toString方法
  switch(this){
  case COMMON :
  return "普通";
  case EXPRESS:
  return  "快速";
  case VIP:
  return name();
  }
  return null;
   }
}

-----------------------------------------------------------------------------------------

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;

}

-----------------------------------------------------------------------------------------

public class ServiceWindow {
private CustomerType type=CustomerType.COMMON;//初始化type
private int windowId=1;
public void setType(CustomerType type) {
this.type = type;
}
public void setWindowId(int windowId) {
this.windowId = windowId;
}
public void start(){   
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
while(true){
  switch(type){        //switch语句比if语句效率更高
case COMMON:
commonservice();
break;
case VIP:
expressservice();
break;
case EXPRESS :
vipservice();
break;
}
}
}
});
}
private void commonservice() {
String windowName="第"+windowId+"号"+type+"窗口";//窗口号
Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
//获得客户号码
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;
//服务时间范围为1000~10000
long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serveTime);//线程停止时间为serveTime
} catch (InterruptedException e) {
e.printStackTrace();
}
long  costTime=System.currentTimeMillis()-beginTime;         //算出中间一共花费的时间
System.out.println(windowName+"为第"+number+"号"+"普通"+"客户完成服务"+"耗时"+costTime/1000+"秒");
}else{
System.out.println(windowName+"没有获取任务,休息一秒");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
private void vipservice() {
String windowName="第"+windowId+"号"+type+"窗口";
Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
System.out.println(windowName+"正在为"+number+"号"+"vip客户服务");
long  beginTime=System.currentTimeMillis();
int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long  costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"号"+"vip客户完成服务"+"耗时"+costTime/1000+"秒");
}else{
commonservice();    //vip和快速窗口在没有任务时处理普通任务

}
private void expressservice() {
String windowName="第"+windowId+"号"+type+"窗口";
Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
System.out.println(windowName+"正在获取任务");
if(number!=null){
System.out.println(windowName+"正在为"+number+"号"+"vip客户服务");
long  beginTime=System.currentTimeMillis();
int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long  costTime=System.currentTimeMillis()-beginTime;
System.out.println(windowName+"为第"+number+"号"+"vip客户完成服务"+"耗时"+costTime/1000+"秒");
}else{
commonservice();         //vip和快速窗口在没有任务时处理普通任务

}
}

-----------------------------------------------------------------------------------------

public class Mainclass {


public static void main(String[] args) {
for(int i=1;i<4;i++){
ServiceWindow commonwindow=new ServiceWindow();
commonwindow.setWindowId(i);      //由于初始化为COMMON所以不需要设置type
commonwindow.start();
}

ServiceWindow expresswindow=new ServiceWindow();
expresswindow.setType(CustomerType.VIP);
expresswindow.start();

ServiceWindow vipwindow=new ServiceWindow();
vipwindow.setType(CustomerType.EXPRESS);
vipwindow.start();

       //定时器
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number=NumberMachine.getInstance().getCommonManager().generateNewManager();
//设置generateNewManager()的方法非常巧妙
System.out.println(number+"号普通客户等待服务");
}}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME,     //常数普通和vip和快速客户的比例分别是1:6:3
TimeUnit.SECONDS
);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number=NumberMachine.getInstance().getVipManager().generateNewManager();
System.out.println(number+"号vip客户等待服务");
}}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,  
TimeUnit.SECONDS
);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
Integer number=NumberMachine.getInstance().getExpressManager().generateNewManager();
System.out.println(number+"号快速客户等待服务");
}}, 
0, 
Constants.COMMON_CUSTOMER_INTERVAL_TIME*3,  
TimeUnit.SECONDS
);
   }
}

----------------------------------------------------------------------------------

打印结果

1号普通客户等待服务
1号vip客户等待服务
1号快速客户等待服务
2号普通客户等待服务
第1号普通窗口正在获取任务
第1号普通窗口正在为1号普通客户服务
第1号VIP窗口正在获取任务
第1号VIP窗口正在为1号vip客户服务
第3号普通窗口正在获取任务
第3号普通窗口正在为2号普通客户服务
第1号快速窗口正在获取任务
第1号快速窗口正在为1号vip客户服务
第2号普通窗口正在获取任务
第2号普通窗口没有获取任务,休息一秒
3号普通客户等待服务
4号普通客户等待服务
2号快速客户等待服务
第2号普通窗口正在获取任务
第2号普通窗口正在为3号普通客户服务
5号普通客户等待服务
第1号VIP窗口为第1号vip客户完成服务耗时2秒
第1号VIP窗口正在获取任务
第1号VIP窗口正在为2号vip客户服务
6号普通客户等待服务
2号vip客户等待服务
7号普通客户等待服务
3号快速客户等待服务
8号普通客户等待服务
9号普通客户等待服务
第2号普通窗口为第3号普通客户完成服务耗时4秒
第2号普通窗口正在获取任务
第2号普通窗口正在为4号普通客户服务
10号普通客户等待服务
4号快速客户等待服务
11号普通客户等待服务
第3号普通窗口为第2号普通客户完成服务耗时8秒
第3号普通窗口正在获取任务
第3号普通窗口正在为5号普通客户服务
第1号快速窗口为第1号vip客户完成服务耗时8秒

----------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------






------- android培训java培训、期待与您交流! ----------

详细请查看:http://edu.csdn.net/heima/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值