模擬實現銀行業務排程系統邏輯,具體需求如下:銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為vip視窗。
有三種對應型別的客戶:vip客戶,普通客戶,快速客戶(辦理如交水電費、**費之類業務的客戶)。
非同步隨機生成各種型別的客戶,生成各型別使用者的概率比例為:
vip客戶 :普通客戶 :快速客戶 = 1 :6 :3。
各型別客戶在其對應視窗按順序依次辦理業務。
當vip(6號)視窗和快速業務(5號)視窗沒有客戶等待辦理業務的時候,這兩個視窗可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。
隨機生成客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設定。
和交通燈管理系統一樣,同樣,還是要有深刻的物件導向的思想,分析可得出該系統會有顧客物件,視窗物件,而熟知銀行業務的話,就會知道,會有乙個取號機器來給每個來辦業務的顧客分配號碼,其中會有普通顧客,快速顧客以及vip顧客,,取號機器只有乙個,這時想到了單例,即只生成乙個產生號碼的機器物件,然後隨機產生各種型別的顧客。具體分析類圖如下:
畫圖是解決問題的絕好方法,一定要畫圖理清思路。
各個實現類如下:
numbermanager類
定義乙個用於儲存上乙個客戶號碼的成員變數和用於儲存所有等待服務的客戶號碼的佇列集合。
定義乙個產生新號碼的方法和獲取馬上要為之服務的號碼的方法,這兩個方法被不同的執行緒操作了相同的資料,所以,要進行同步。
具體實現**如下:
public class numbermanager
public synchronized integer fetchnumber()else}}
numbermachine類 隨機產生三種客戶的號碼
定義三個成員變數分別指向三個numbermanager物件,分別表示普通、快速和vip客戶的號碼管理器,定義三個對應的方法來返回這三個numbermanager物件。
將numbermachine類設計成單例。具體實現**如下:
public class numbermachine
private static numbermachine instance = new numbermachine();
public static numbermachine getinstance()
private numbermanager commonmanager = new numbermanager();
private numbermanager expressmanager = new numbermanager();
private numbermanager vipmanager = new numbermanager();
public numbermanager getcommonmanager()
public numbermanager getexpressmanager()
public numbermanager getvipmanager() }
customertype列舉類 定義系統中有三種型別的客戶,只有這三種型別
系統中有三種型別的客戶,所以用定義乙個列舉類,其中定義三個成員分別表示三種型別的客戶。
重寫tostring方法,返回型別的中文名稱。這是在後面編碼時重構出來的,剛開始不用考慮。
public enum customertype
return name;}}
servicewindow類 定義服務視窗,為每一種型別的客戶服務
定義乙個start方法,內部啟動乙個執行緒,根據服務視窗的類別分別迴圈呼叫三個不同的方法。
定義三個方法分別對三種客戶進行服務,為了觀察執行效果,應詳細列印出其中的細節資訊。
public class servicewindow
public void settype(customertype type)
public void setnumber(int number)
public void start()}}
});}private void commonservice() catch (interruptedexception e)
system.out.println(windowname + "完成為第" + servicenumber + "號普通客戶服務,總共耗時" + servicetime/1000 + "秒");
}else catch (interruptedexception e) }}
private void expressservice() catch (interruptedexception e)
system.out.println(windowname + "完成為第" + servicenumber + "號快速客戶服務,總共耗時" + servicetime/1000 + "秒");
}else
}private void vipservice() catch (interruptedexception e)
system.out.println(windowname + "完成為第" + servicenumber + "號vip客戶服務,總共耗時" + servicetime/1000 + "秒");
}else }}
mainclass類
用for迴圈建立出4個普通視窗,再建立出1個快速視窗和乙個vip視窗。
接著再建立三個定時器,分別定時去建立新的普通客戶號碼、新的快速客戶號碼、新的vip客戶號碼。
具體實現如下**:
public class mainclass
//產生1個快速視窗
servicewindow expresswindow = new servicewindow();
expresswindow.settype(customertype.express);
expresswindow.start();
//產生1個vip視窗
servicewindow vipwindow = new servicewindow();
vipwindow.settype(customertype.vip);
vipwindow.start();
//普通客戶拿號
executors.newscheduledthreadpool(1).scheduleatfixedrate(
new runnable()
},0,
constants.common_customer_interval_time,
timeunit.seconds);
//快速客戶拿號
executors.newscheduledthreadpool(1).scheduleatfixedrate(
new runnable()
},0,
constants.common_customer_interval_time * 2,
timeunit.seconds);
//vip客戶拿號
executors.newscheduledthreadpool(1).scheduleatfixedrate(
new runnable()
},0,
constants.common_customer_interval_time * 6,
timeunit.seconds);
}constants類
定義三個常量:max_service_time、min_service_time、common_customer_interval_time
具體**如下:
package cn.itcast.bankqueue;
public class constants
銀行業務排程系統 面試題思考
public class employee protected thread thread public employee 當前辦理業務的客戶 protected customer currentcustomer 獲取下乙個要處理的客戶 protected virtual void getcusto...
銀行業務排程系統
一 銀行業務排程系統 一 需求 模擬實現銀行業務排程系統邏輯,具體需求如下 1.銀行內有6個業務視窗,1 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為vip視窗。2.有三種對應型別的客戶 vip客戶,普通客戶,快速客戶 辦理如交水電費 費之類業務的客戶 3.非同步隨機生成各種型別的客戶,生成各...
銀行業務排程系統
今天看了張老師的銀行業務排程系統,還是感覺不可思議。開始看專案需求時感覺這裡邊的業務邏輯太複雜。沒想到還是被張老師寫了個把小時的 給搞定。雖然看完之後腦海中對於程式執行過程有些模糊,但起碼現在努力努力寫出個類似的程式不是天方夜談。張老師分析專案的時候,又通過物件導向的思想結合專案分析了下。不禁又想感...