1.銀行業務調度系統的項目需求
類比實現銀行業務調度系統邏輯,具體需求如下:
Ø 銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。
Ø 有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。
Ø 非同步隨機產生各種類型的客戶,產生各類型使用者的機率比例為:
VIP客戶:普通客戶:快速客戶 = 1:6:3。
Ø 客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間為最小值(提示:辦理業務的過程可通過線程Sleep的方式類比)。
Ø 各類型客戶在其對應視窗按順序依次辦理業務。
Ø 當VIP(6號)視窗和快速業務(5號)視窗沒有客戶等待辦理業務的時候,這兩個視窗可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。
Ø 隨機產生客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設定。
Ø 不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式運行結果。
2.物件導向的分析與設計
l 有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶,非同步隨機產生各種類型的客戶,各類型客戶在其對應視窗按順序依次辦理業務 。
Ø 首先,經常在銀行辦理業務的人更有利於理解本系統,知道每一個客戶其實就是由銀行的一個取號機產生號碼的方式來表示的。所以,我想到要有一個號碼管理器對象,讓這個對象不斷地產生號碼,就等於隨機產生了客戶。
Ø 由於有三類客戶,每類客戶的號碼編排都是完全獨立的,所以,我想到本系統一共要產生三個號碼管理器對象,各自管理一類使用者的排隊號碼。這三個號碼管理器對象統一由一個號碼機器進行管理,這個號碼機器在整個系統中始終只能有一個,所以,它要被設計成單例。
l 各類型客戶在其對應視窗按順序依次辦理業務 ,準確地說,應該是視窗依次叫號。
Ø 各個視窗怎麼知道該叫哪一個號了呢。它一定是問的相應的號碼管理器,即服務視窗每次找號碼管理器擷取當前要被服務的號碼。
物件導向設計把握一個重要的經驗:誰擁有資料,誰就對外提供操作這些資料的方法。再牢牢掌握幾個典型的案例就可以了:列車司機緊急刹車;人關門等。司機緊急刹車這個過程,對象不是司機而是列車,司機只是操作了列車,實際內部還是靠列車中的制動系統來迫使列車停下的;人關門對象是門而不是人,假想如果門沒有轉軸你怎麼也關不了它的,或者關的過程中遇見障礙物你也是關不了它的。
3.類圖
畫圖非常有助於理解和分析問題,你還有比畫圖更好的辦法嗎。
該系統主要用到以上三個類:分別是取號機器、號碼管理對、服務視窗;系統運作過程中可能還需要其他的類做輔助,這些都是後話,後面具體編寫的時候再提。
NumberMachine:取號機器;其中運用單例模式來面向客戶getInstance(),其中封裝了普通客戶getCommonManager()、快速客戶getExpressManager()以及VIP客戶getVipManager()相對應的方法;
NumberManager:號碼管理對象;包括產生號碼generateNumber()和抓取號碼fetchNumber()兩種方法。
ServiceWindow:服務視窗;包括面向客戶的開始辦理的業務的方法Start();以及三種客戶分別對應的方法,不再贅述。
4.改系統主要要編寫的類
l NumberManager類
l 定義一個用於儲存上一個客戶號碼的成員變數和用於儲存所有等待服務的客戶號碼的隊列集合。
l 定義一個產生新號碼的方法和擷取馬上要為之服務的號碼的方法,這兩個方法被不同的線程操作了相同的資料,所以,要進行同步。
l NumberMachine類
l 定義三個成員變數分別指向三個NumberManager對象,分別表示普通、快速和VIP客戶的號碼管理器,定義三個對應的方法來返回這三個NumberManager對象。
l 將NumberMachine類設計成單例。
l CustomerType枚舉類
l 系統中有三種類型的客戶,所以用定義一個枚舉類,其中定義三個成員分別表示三種類型的客戶。
l 重寫toString方法,傳回型別的中文名稱。這是在後面編碼時重構出來的,剛開始不用考慮。
l ServiceWindow類
l 定義一個start方法,內部啟動一個線程,根據服務視窗的類別分別迴圈調用三個不同的方法。
l 定義三個方法分別對三種客戶進行服務,為了觀察運行效果,應詳細列印出其中的細節資訊。
l MainClass類
l 用for迴圈建立出4個普通視窗,再建立出1個快速視窗和一個VIP視窗。
l 接著再建立三個定時器,分別定時去建立新的普通客戶號碼、新的快速客戶號碼、新的VIP客戶號碼。
l Constants類
l 定義三個常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME