----------- android培訓、java培訓、java學習型技術博客、期待與您交流! -----------
銀行業務調度系統
模擬實現銀行業務調度系統邏輯,具體需求如下:1、銀行內有6個業務窗口,1-4號窗口爲普通窗口,5號窗口爲快速窗口,6號窗口爲vip窗口。
2、有三種對應類型的客戶:普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。
3、異步隨機生成各種類型的客戶,生成各類性用戶的概率比例爲:
VIP客戶:普通客戶:快速客戶 = 1:6:3
4、客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間爲最小值(提示:辦理業務的過程可通過線程sleep的方式模擬)。
5、各類型客戶在其對應窗口按順序依次辦理業務。
6、當VIP(6號)窗口和快速業務(5號)窗口沒有客戶等待辦理業務的時候,這兩個窗口可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,則優先處理對應客戶的業務。
7、隨機生成客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設置。
8、不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程序運行結果。
需求分析:
1、根據面向對象的思想,分析上述需求,可以分爲三個最主要的對象:窗口、客戶和號碼機。
客戶類:限定只有三種客戶,即普通客戶、快速客戶和VIP客戶,可以考慮用枚舉實現。枚舉CustomerType{}CustomerType
{
COMMON,EXPRESS,VIP;
}
號碼機:包含生成客戶號碼的方法和叫號的方法,同時又分爲三種類型:普通客戶號碼,快速客戶號碼和VIP客戶號碼。
類NumberMachine{}:用於獲得三種不同類型的客戶號碼。
NumberMachine
{
getInstance(){};//應用單例設計模式,獲得該類的唯一對象,以保證三種號碼類型的唯一性。
getCommonManager(){};//獲得普通客戶號碼生成與叫號
getExpressManager(){};//獲得快速客戶號碼生成與叫號
getVipManager(){};//獲得VIP客戶號碼生成與叫號
}
類NumberManager{}:用於實現客戶號碼生成及叫號的操作。
NumberManager
{
generateNewNumber(){};//生成新的客戶號碼
fetchServiceNumber(){};//叫號的實現
}
窗口類:ServiceWindow{},實現不同窗口對不同客戶的具體服務操作。
普通窗口:面向普通客戶服務。
快速窗口:面向快速客戶服務,若沒有快速客戶等待服務,則面向普通客戶服務,但是一旦有快速客戶等待服務,優先服務快速客戶。
VIP窗口:面向VIP客戶服務,若沒有VIP客戶等待服務,則面向普通客戶服務,但是一旦有VIP客戶等待服務,優先服務VIP客戶。
ServiceWindow
{
屬性windowType;//表明窗口類型,普通窗口、快速窗口和VIP窗口
屬性windowId;//表明窗口號碼
start(){};//各種窗口對各種客戶的具體實現
commonService(){};//普通窗口對普通客戶服務的具體實現
expressService(){};//快速窗口對客戶服務的具體實現
vipService(){};//VIP窗口對客戶服務的具體實現
]
主函數類:MainClass,調用各個對象,各個方法,以保證整個程序的執行。
窗口服務啓動:生成各個窗口,並讓各個窗口開始執行服務。
號碼機啓動:生成各種類型客戶的各種號碼。
2、分析
圖示如下:
3、技術要點
枚舉類的使用:因爲窗口類型只能是普通、快速和VIP三種,不能有其他值,因此可以使用枚舉。新特性線程池的使用:
Executors.newSingleThreadExecutor().execute(Runnable runnable):用線程池技術生成單個線程。
Executors.newScheduledThreadPool().scheduleAtFixedRate():連續定時啓動,實現了號碼機生成各種號碼的操作。
4、整個流程
1)主函數類中啓動,號碼類生成普通、快速和VIP三種號碼;窗口類生成三種窗口。2)各種號碼進入等待狀態,各種窗口進入服務狀態。
3)普通類窗口:判斷是否有普通客戶在等待服務,若有,提供服務;若無,短暫休息,然後再判斷是否有普通客戶在等待服務。
快速類窗口:判斷是否有快速客戶在等待服務,若有,提供服務;若無,判斷是否有普通客戶在等待服務,若有提供服務;若無,繼續判斷是否有快速客戶在等待服務。
VIP類窗口:判斷是否有VIP客戶在等待服務,若有,提供服務;若無,判斷是否有普通客戶在等待服務,若有,提供服務;若無,判斷是否有VIP客戶在等待服務。
4)用while(true)保證各個窗口一直在服務狀態。
5、代碼實現
NumberManager類
定義一個用於存儲上一個客戶號碼的成員變量和用於存儲所有等待服務的客戶號碼的隊列集合。定義一個產生新號碼的方法和獲取馬上要爲之服務的號碼的方法,這兩個方法被不同的線程操作了相同的數據,所以,要進行同步。
NumberMachine類
定義三個成員變量分別指向三個NumberManager對象,分別表示普通、快速和VIP客戶的號碼管理器,定義三個對應的方法來返回這三個NumberManager對象。
將NumberMachine類設計成單例。
定義三個成員變量分別指向三個NumberManager對象,分別表示普通、快速和VIP客戶的號碼管理器,定義三個對應的方法來返回這三個NumberManager對象。
將NumberMachine類設計成單例。
CustomerType枚舉類
系統中有三種類型的客戶,所以用定義一個枚舉類,其中定義三個成員分別表示三種類型的客戶。
重寫toString方法,返回類型的中文名稱。這是在後面編碼時重構出來的,剛開始不用考慮。
系統中有三種類型的客戶,所以用定義一個枚舉類,其中定義三個成員分別表示三種類型的客戶。
重寫toString方法,返回類型的中文名稱。這是在後面編碼時重構出來的,剛開始不用考慮。
ServiceWindow類
定義一個start方法,內部啓動一個線程,根據服務窗口的類別分別循環調用三個不同的方法。
定義三個方法分別對三種客戶進行服務,爲了觀察運行效果,應詳細打印出其中的細節信息。
定義一個start方法,內部啓動一個線程,根據服務窗口的類別分別循環調用三個不同的方法。
定義三個方法分別對三種客戶進行服務,爲了觀察運行效果,應詳細打印出其中的細節信息。
Constants類
定義三個常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME
定義三個常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME
MainClass類
用for循環創建出4個普通窗口,再創建出1個快速窗口和一個VIP窗口。
接着再創建三個定時器,分別定時去創建新的普通客戶號碼、新的快速客戶號碼、新的VIP客戶號碼。
用for循環創建出4個普通窗口,再創建出1個快速窗口和一個VIP窗口。
接着再創建三個定時器,分別定時去創建新的普通客戶號碼、新的快速客戶號碼、新的VIP客戶號碼。