銀行業務調度系統



 ----------------------具體需求
1. 共6個業務窗口,1-4是普通窗口,5是快速窗口,6是VIP窗口; 分別對應三種類型的客戶: 普通客戶, 快速客戶, VIP客戶
2. 隨機生成各種類型的客戶, 生成各類型客戶的概率比例爲普通 : 快速 : VIP = 6 : 3 :1
3. 客戶辦理業務時間有最大和最小值之分, VIP和普通客戶所需服務時間在允許範圍內隨機設定, 快速客戶爲最小值
4. 具體服務邏輯與現實生活相同, 如: 當VIP和快速窗口沒有客戶時, 可以爲普通客戶服務
面向對象的分析與設計
有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶,異步隨機生成各種類型的客戶,各類型客戶在其對應窗口按順序依次辦理業務。
每一個客戶其實就是由銀行的一個取號機器產生號碼的方式來表示的。那麼,我們需要有一個號碼管理器對象,讓這個對象不斷地產生號碼,就等於隨機生成了客戶。
由於有三類客戶,並且每類客戶的號碼編排都是完全獨立的,所以,這個系統一共要產生三個號碼管理器對象,他們分別各自管理一類用戶的排隊號碼。但是,銀行的號碼管理系統只能有一個,所以它需要設計成單例模式。
各種客戶在各自窗口按順序辦理業務,轉化爲面向對象設計來說,我們可以認爲是各個窗口在依次叫號。也就是每次都是通過號碼管理器獲取當前要被服務的號碼。
編碼的實現
首先我們需要先實現的是號碼管理器,(NumberManager)它的作用是用來產生好號和取號。因爲這兩個號碼要用不同的線程進行操作,同時先取到號碼的客戶先進行服務,所以這兩個線程要同步進行。
public class NumberManager {
private int lastNumber = 1;
private List<Integer> queueNumber = new ArrayList<Integer>();//
排隊號碼
public synchronized Integer generageNewManager()// 產生一個號碼
{
queueNumber.add(lastNumber);
return lastNumber++;
}
public synchronized Integer fetchServiceNumber() {//取號
return queueNumber.remove(0);
}
}
號碼機器類


public class NumberMachine {//號碼機器
//返回三個管理器
private NumberManager commonManager=new NumberManager();
private NumberManager expressManager=new NumberManager();
private NumberManager vipManager=new NumberManager();


public NumberManager getCommonManager() {
return commonManager;
}
public NumberManager getExpressManager() {
return expressManager;
}
public NumberManager getVipManager() {
return vipManager;
}
變成單例
private NumberMachine(){}//首先構造函數私有化


public static NumberMachine getInstance(){//得到實例
return instance;
}
private static NumberMachine instance=new NumberMachine();//然後實例化


}


import java.util.Random;
import java.util.concurrent.Executors;
 public void start(){//開始叫號,用線程池
Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {//線程池裏找空閒線程


@Override
public void run() {
while(true){//不停的取號碼
switch(type){//switch也能識別枚舉類型
case COMMON://普通用戶得到普通號碼


commonService();
break;
case EXPRESS://快速用戶得到普通號碼


expressService();
break;
case VIP://vip用戶得到普通號碼
vipService();
break;
}
}
}
});
}
顧客類
public enum CustomerType {//三種顧客類型,普通,快速,貴賓
COMMON,EXPRESS,VIP;
//重寫toString方法,便於理解
public String toString(){
switch(this){//當前對象
case COMMON:
return "普通";


case EXPRESS:
return "快速";


case VIP:
return name();


}
return null;
}
}
ServiceWindow類
1.定義一個start方法,內部啓動一個線程,根據服務窗口的類別分別循環調用三個不同的方法。
2.定義三個方法分別對三種客戶進行服務,爲了觀察運行效果,應詳細打印出其中的細節信息。
 普通服務
private void commonService(){
String windowName="第"+windowId+"號"+type+"窗口";
System.out.println(windowName+"正在獲取任務");
Integer number= NumberMachine.getInstance().getCommonManager().fetchNumber();


if(number!=null){
System.out.println(windowName+"爲第"+number+"個"+"普通"+"客戶服務");
long beginTime=System.currentTimeMillis();
//最大的隨機值
int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//值9000
long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;//1001
--10000毫秒
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;//花費時間
System.out.println(windowName+"爲第"+number+"個"+"普通"+"客戶完成服務,耗
時"+costTime/1000+"秒");
System.out.println();
}else{
System.out.println(windowName+"沒有取到任務,先休息1秒鐘");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//快速服務
private void expressService(){
String windowName="第"+windowId+"號"+type+"窗口";
System.out.println(windowName+"正在獲取任務");
Integer number= NumberMachine.getInstance().getExpressManager().fetchNumber();


if(number!=null){
System.out.println(windowName+"爲第"+number+"個"+type+"客戶服務");
long beginTime=System.currentTimeMillis();
long serveTime=Constants.MIN_SERVICE_TIME;//只能是最小值
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;//花費時間
System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗
時"+costTime/1000+"秒");
System.out.println();
}else{
System.out.println(windowName+"沒有取到任務");
commonService();
}
}
//vip服務
private void vipService(){
String windowName="第"+windowId+"號"+type+"窗口";
System.out.println(windowName+"正在獲取任務");
Integer number= NumberMachine.getInstance().getVipManager().fetchNumber();


if(number!=null){
System.out.println(windowName+"爲第"+number+"個"+type+"客戶服務");
long beginTime=System.currentTimeMillis();
//最大的隨機值
int maxRand=Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;//值9000
long serveTime=new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;//1001
--10000毫秒
try {
Thread.sleep(serveTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
long costTime=System.currentTimeMillis()-beginTime;//花費時間
System.out.println(windowName+"爲第"+number+"個"+type+"客戶完成服務,耗
時"+costTime/1000+"秒");
System.out.println();
}else{
System.out.println(windowName+"沒有取到任務");
commonService();
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章