1. 程式人生 > >黑馬程式設計師_7K面試題之銀行排程系統

黑馬程式設計師_7K面試題之銀行排程系統

------- android培訓java培訓、期待與您交流! ----------

銀行業務排程系統
1. 
模擬實現銀行業務排程系統邏輯,具體需求如下:銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。有三種對應型別的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。非同步隨機生成各種型別的客戶,生成各型別使用者的概率比例為:
        VIP
客戶:普通客戶:快速客戶  =  1 3客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間為最小值(提示:辦理業務的過程可通過執行緒

Sleep的方式模擬)。各型別客戶在其對應視窗按順序依次辦理業務。VIP6號)視窗和快速業務(5號)視窗沒有客戶等待辦理業務的時候,這兩個視窗可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。隨機生成客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設定。

不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式執行結果。

2. 思路分析

分析有三種對應型別的客戶:VIP客戶,普通客戶,快速客戶,非同步隨機生成各種型別的客戶,各型別客戶在其對應視窗按順序依次辦理業務。其實每一個客戶辦理業務順序的依據是他所取到的號碼。所以要想到定義一個號碼產生器,因為有三種不同型別的客戶,所以要定義一個類來進行著三種客戶進行管理。讓哪個使用者進行辦理業務實際上是視窗進行不斷的叫號,視窗叫號實際上就是想號碼管理器要號。

類的功能程式碼實現出號機類

public class NumberManager {
    private int number=0;
    private List<Integer> storeNumber=new ArrayList<Integer>();
    //產生票
    public synchronized Integer produceNumber()
    {
       storeNumber.add(++number);
       //System.out.println(number+"////////////////");
       return number;
    }
    //取票
    public  synchronized IntegerfetchNumber()
    {
       if(storeNumber.size()>0)
       {
           return (Integer)storeNumber.remove(0);
       }
       else
       {
       return null;
       }
    }
}

管理三種不同的號

public class NumberMechine {
   private NumberManager commonNumber=new NumberManager();
   private  NumberManager rapidNumber=new NumberManager();
   private NumberManager vipNumber=new NumberManager();
   //獲取普通使用者
   public NumberManager getCommonNumber() {
    return commonNumber;
}
   //獲得快速使用者
public NumberManager getRapidNumber() {
    return rapidNumber;
}
//獲得VIP使用者
public NumberManager getVipNumber() {
    return vipNumber;
}
private NumberMechine(){};
   private static NumberMechine numbermechine=new NumberMechine();
   public static NumberMechine getInstance()
   {
       return numbermechine;
   }
}

視窗類:

import java.util.Random;
import java.util.concurrent.Executors;
 
public class Servicewindow {
    private ComstorStyle type=ComstorStyle.COMMON;
    private  int number=1;
   
     public ComstorStylegetType() {
       return type;
    }
 
    public void setType(ComstorStyle type) {
       this.type = type;
    }
 
    public void setNumber(int number) {
       this.number = number;
    }
 
    public void start()
     {
        Executors.newSingleThreadExecutor().execute(new Runnable(){
           @Override
           public void run() {
              while(true)
              {
                     switch(type)
                     {
                         case COMMON:
                            commonService();
                            break;
                         case RAPID:
                            rapidService();
                            break;
                         case VIP:
                            vipService();
                            break;
                      }
              }
           }
        });
     }
    //快速視窗的服務
    private void rapidService() {  
       //System.out.println(Comstornumber+"======");
        String windownumber="第"+number+"號"+type+"視窗";
        System.out.println(windownumber+"正在獲取快速使用者!");
        Integer Comstornumber=NumberMechine.getInstance().getCommonNumber().fetchNumber();
       if(Comstornumber!=null)
       {  
           System.out.println(windownumber+"正在準備為第"+Comstornumber+"號快速使用者服務!");
              // longstartTime=System.currentTimeMillis();
               //int time= (int)((TimeConstant.TIME_MAX-TimeConstant.TIME_MIN)/1000);
              // longworkTime=new Random().nextInt(time)+1+TimeConstant.TIME_MIN/1000;
                try {
                  Thread.sleep(TimeConstant.TIME_MIN);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              // longendTime=System.currentTimeMillis();
               System.out.println(windownumber+"為第"+Comstornumber+"號普快速戶服務完畢!");
        }
        else
        {
               System.out.println("快速視窗沒有獲取到快速使用者,正等待為普通使用者服務");
               commonService();
               System.out.println("快速視窗為普通使用者服務!!");
        }
    }
    //VIP視窗服務
    private void vipService() {
      
        String windownumber="第"+number+"號"+type+"視窗";
        System.out.println(windownumber+"正在獲取VIP使用者!");
        Integer Comstornumber=NumberMechine.getInstance().getCommonNumber().fetchNumber();
       // System.out.println(Comstornumber+"----------");
       if(Comstornumber!=null)
       {  
           System.out.println(windownumber+"正在準備為第"+Comstornumber+"號VIP使用者服務!");
              // longstartTime=System.currentTimeMillis();
                int time= (int) ((TimeConstant.TIME_MAX-TimeConstant.TIME_MIN));
               long workTime=newRandom().nextInt(time)+1+TimeConstant.TIME_MIN;
                try {
                  Thread.sleep(workTime);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              // longendTime=System.currentTimeMillis()/1000;
               System.out.println(windownumber+"為第"+Comstornumber+"號VIP使用者服務完畢!");
        }
        else
        {
               System.out.println("VIP視窗沒有獲取到VIP使用者,正等待為普通使用者服務");
               commonService();
               System.out.println("VIP視窗為普通使用者服務!!");
        }
    }
   
    //普通視窗服務
    private void commonService() {
      
        String windownumber="第"+number+"號"+type+"視窗";
        System.out.println(windownumber+"正在獲取普通使用者!");
        Integer Comstornumber=NumberMechine.getInstance().getCommonNumber().fetchNumber();
        if(Comstornumber!=null)
       {  
           System.out.println(windownumber+"正在準備為第"+Comstornumber+"號普通使用者服務!");
             
               int time= (int) ((TimeConstant.TIME_MAX-TimeConstant.TIME_MIN));
               long workTime=newRandom().nextInt(time)+1+TimeConstant.TIME_MIN;
               
               try {
                  Thread.sleep(workTime);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
               
               System.out.println(windownumber+"為第"+Comstornumber+"號普通使用者服務完畢!共用"+workTime/1000+"秒");
        }
        else
        {
               System.out.println("沒有任務休息一秒!");
               try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
        }
    }
}

用列舉定義了一個不同型別的使用者:

public enum ComstorStyle {
      COMMON,RAPID,VIP;
       public String toString()
       {
       String name=null;
       switch(this)
       {
        case COMMON:
         name ="普通";
         break;
        case RAPID:
         name="快速";
         break;
        case VIP:
         name=name();
         break;
       }
       return name;
       }
}

專門用於定義常量的類:

public class TimeConstant {
 public static final long TIME_MAX=10000;
 public static final long TIME_MIN=1000;
 public static final long TIME=1;
}

測試類:

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
 
public class BankTest {
    public static void main(String[] args) {
       //產生四個普通視窗
       for(int i=1;i<5;i++)
       {
           Servicewindow commonwindow=new Servicewindow();
           commonwindow.setNumber(i);
           commonwindow.start();
          
       }
      
 
       //產生一個快速視窗
       Servicewindow rapidwindow=new Servicewindow();
       rapidwindow.setType(ComstorStyle.RAPID);
       rapidwindow.start();
      
       //產生一個VIP視窗
       Servicewindow vipwindow=new Servicewindow();
       vipwindow.setType(ComstorStyle.VIP);
       vipwindow.start();
      
       //模擬普通使用者取票
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
               new Runnable(){
                  @Override
                  public void run() {
                     // TODO Auto-generatedmethod stub
                     Integer number=NumberMechine.getInstance().getCommonNumber().produceNumber();
                     //System.out.println(number+"8888888888888888888888888888");
                     System.out.println("第"+number+"普通使用者已拿到號,正等待服務!!");
                  }
               },
               0,
               TimeConstant.TIME,
               TimeUnit.SECONDS);
        //模擬VIP使用者取票
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
               new Runnable(){
                  @Override
                  public void run() {
                     // TODO Auto-generatedmethod stub
                     Integer number=NumberMechine.getInstance().getVipNumber().produceNumber();
                     System.out.println("第"+number+"VIP使用者已拿到號,正等待服務!!");
                  }
               },
               0,
               TimeConstant.TIME*6,
               TimeUnit.SECONDS);
        //模擬快速視窗取票
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
               new Runnable(){
                  @Override
                  public void run() {
                     // TODO Auto-generatedmethod stub
                     Integer number=NumberMechine.getInstance().getRapidNumber().produceNumber();
                     System.out.println("第"+number+"快速使用者已拿到號,正等待服務!!");
                  }
               },
               0,
               TimeConstant.TIME*3,
               TimeUnit.SECONDS);
        
 
    }
 
}
執行結果:


總結:通過銀行排程系統,學會的分析事物,比如說有不同的使用者,但是隻有一個取號的機子,所以想到了單例模式來確保只有一個取號機,因為要有三個不同的使用者,所以這個取號機要管理這三個不同的使用者物件,因為使用者是規定好的,所以想到了用列舉。對於視窗叫號,它得向管理號的機子要。這就學到了一個重要的思想,隨擁有資料,把方法就定義在誰身上。所以要向出號機要。

------- android培訓java培訓、期待與您交流! ----------