有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶 ,異步隨機生成各種類型的客戶,各類型客戶在其對應窗口按順序依次辦理業務 。
本系統一共要產生三個號碼管理器對象,各自管理一類用戶的排隊號碼。這三個號碼管理器對象統一由一個號碼機器進行管理,這個號碼機器在整個系統中始終只能有一個,所以,它要被設計成單例。
各類型客戶在其對應窗口按順序依次辦理業務 ,准確地說,應該是窗口依次叫號。
各個窗口怎么知道該叫哪一個號了呢?它一定是問的相應的號碼管理器,即服務窗口每次找號碼管理器獲取當前要被服務的號碼。
NumberManager和NumberMachine類
l NumberManager類
- 定義一個用於存儲上一個客戶號碼的成員變量和用於存儲所有等待服務的客戶號碼的隊列集合。
- 定義一個產生新號碼的方法和獲取馬上要為之服務的號碼的方法,這兩個方法被不同的線程操作了相同的數據,所以,要進行同步。
l NumberMachine類
- 定義三個成員變量分別指向三個NumberManager對象,分別表示普通、快速和VIP客戶的號碼管理器,定義三個對應的方法來返回這三個NumberManager對象。
- 將NumberMachine類設計成單例。
private NumberMachine(){}
public static NumberMachine getInstance(){
return
}
private static NumberMachine instance=new Numbermachine();//設計成靜態是因為靜態方法不//能直接訪問非靜態成員變量
public static NumberMachine getInstance(){
return instance;
}
ServiceWindow與CustomerType枚舉類
l CustomerType枚舉類
- 系統中有三種類型的客戶,所以用定義一個枚舉類,其中定義三個成員分別表示三種類型的客戶。
- 重寫toString方法,返回類型的中文名稱。這是在后面編碼時重構出來的,剛開始不用考慮。
l ServiceWindow類
- 定義一個start方法,內部啟動一個線程,根據服務窗口的類別分別循環調用三個不同的方法。
- 定義三個方法分別對三種客戶進行服務,為了觀察運行效果,應詳細打印出其中的細節信息。
Java中switch條件可以是int或枚舉,不能是long可以用枚舉
private void expressService(){
Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
String windowName = "第" + number + "號" + type + "窗口";
System.out.println(windowName + "開始獲取快速任務!");
if(serviceNumber !=null){
System.out.println(windowName + "開始為第" + serviceNumber + "號快速客戶服務");
int serviceTime = Constants.MIN_SERVICE_TIME;
try {
Thread.sleep(serviceTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(windowName + "完成為第" + serviceNumber + "號快速客戶服務,總共耗時" + serviceTime/1000 + "秒");
}else{
System.out.println(windowName + "沒有取到快速任務!");
commonService();
}
}
MainClass類與Constants類
l MainClass類
- 用for循環創建出4個普通窗口,再創建出1個快速窗口和一個VIP窗口。
- 接着再創建三個定時器,分別定時去創建新的普通客戶號碼、新的快速客戶號碼、新的VIP客戶號碼。
l Constants類
- 定義三個常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME