黑馬程式員 銀行業務調度系統學習筆記

來源:互聯網
上載者:User

----------- android培訓、java培訓、期待與您交流! ------------

銀行業務調度系統

類比實現銀行業務調度系統邏輯,具體需求如下:

1、銀行內有6個業務視窗,1 - 4號視窗為普通視窗,5號視窗為快速視窗,6號視窗為VIP視窗。

2、有三種對應類型的客戶:VIP客戶,普通客戶,快速客戶(辦理如交水電費、電話費之類業務的客戶)。

3、非同步隨機產生各種類型的客戶,產生各類型使用者的機率比例為:

      VIP客戶 :普通客戶 :快速客戶  =  1 :6 :3。

4、客戶辦理業務所需時間有最大值和最小值,在該範圍內隨機設定每個VIP客戶以及普通客戶辦理業務所需的時間,快速客戶辦理業務所需時間為最小值

     (提示:辦理業務的過程可通過線程Sleep的方式類比)。

5、各類型客戶在其對應視窗按順序依次辦理業務。

6、當VIP(6號)視窗和快速業務(5號)視窗沒有客戶等待辦理業務的時候,這兩個視窗可以處理普通客戶的業務,而一旦有對應的客戶等待辦理業務的時候,

      則優先處理對應客戶的業務。

7、隨機產生客戶時間間隔以及業務辦理時間最大值和最小值自定,可以設定。

8、不要求實現GUI,只考慮系統邏輯實現,可通過Log方式展現程式運行結果。

 

物件導向分析:

找類:

1、取號機:銀行客戶到銀行第一件事,就是取號,排隊。

2、號碼管理器:用於告知客戶,誰可以來辦理業務。

3、服務視窗:可以分別為三種類型客戶服務。

4、客戶:三種類型,數組少,固定,可選擇枚舉類型

5、常量:編程過程中發現有固定數位資料,而且經常使用,可以選擇用常量的形式表示。

6、主類,用於啟動服務視窗並類比客戶取號。

 

總結:編寫代碼時,剛開始有可能一個類只能寫一部分內容,隨著整個系統類別的不斷增加,每個類的實際功能便越寫越清晰。

 

 號碼管理器:具體實現代碼

import java.util.*;public class NumberManager {private int lastNumber;//裝"業務號"資料的容器private List queueNumbers = new ArrayList();//產生業務號,要同步public synchronized int  generateNumber() {queueNumbers.add(++lastNumber);return lastNumber;}//取號,要同步public synchronized int getNumber() {if(queueNumbers.size() > 0) {return (Integer) queueNumbers.remove(0);} else {return -1;}}}

取號機:即取號系統

public class NumberMachine {//單例設計,取號系統只有一個。private static NumberMachine instance = new NumberMachine();private NumberMachine() {};public static NumberMachine getInstance() {return instance;}//系統裡有三個不同的號碼管理器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;}}

服務視窗:

import java.util.Random;import java.util.concurrent.Executors;public class ServiceWindow {//預設視窗類別型為普通客戶視窗private CustomerType type = CustomerType.COMMON;//視窗的編號private int windowId = 1;//設定視窗類別型public void setType(CustomerType type) {this.type = type;}//設定視窗編號public void setWindowId(int windowId) {this.windowId = windowId;}//視窗開始對外服務public void start() {System.out.println(type + ":::" + windowId + "開始服務了");//1.5版本的線程建立Executors.newSingleThreadExecutor().execute(new Runnable() {public void run() {while(true) {//不停的提供服務switch(type) {case COMMON :commonService();//服務普通客戶break;case EXPRESS :expressService();//服務快速客戶break;case VIP :vipService();//服務VIP客戶break;}}}});}//普通客戶服務public void commonService() {//視窗名String windowName = "第" + windowId + "號" + type + "視窗";//喊一位客戶號為number的普通客戶int number = NumberMachine.getInstance().getCommonManager().getNumber();System.out.println(windowName + "正在擷取任務");//如果有客戶if(number != -1) {System.out.println(windowName + "為第" + number + "個普通客戶服務");int maxRand = Constants.MAX_SERVICE_TIME;//普通客戶服務時間為1秒-10秒不等。int serveTime = new Random().nextInt(maxRand) + Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);//這個時間段在服務中} catch (InterruptedException e) {e.printStackTrace();}System.out.println(windowName + "為第" + number + "個普通客戶完成服務,耗時" + serveTime + "秒");} //如果沒有客戶else {System.out.println(windowName + "沒有取到服務任務,先休息1秒鐘");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}//快速客戶服務public void expressService() {//視窗名String windowName = "第" + windowId + "號" + type + "視窗";//喊一位客戶號為number的快速客戶int number = NumberMachine.getInstance().getExpressManager().getNumber();System.out.println(windowName + "正在擷取任務");//如果有客戶if(number != -1) {System.out.println(windowName + "為第" + number + "個快速客戶服務");//服務1秒int serveTime = Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);//這個時間段在服務中} catch (InterruptedException e) {e.printStackTrace();}//實際耗時System.out.println(windowName + "為第" + number + "個快速客戶完成服務,耗時" + serveTime + "秒");} //如果沒有客戶else {System.out.println(windowName + "沒有取到服務任務");//為普通客戶服務commonService();}}//VIP客戶服務public void vipService() {//視窗名String windowName = "第" + windowId + "號" + type + "視窗";//喊一位客戶號為number的VIP客戶int number = NumberMachine.getInstance().getVipManager().getNumber();System.out.println(windowName + "正在擷取任務");//如果有客戶if(number != -1) {System.out.println(windowName + "為第" + number + "個VIP客戶服務");int maxRand = Constants.MAX_SERVICE_TIME;//普通客戶服務時間為1秒-10秒不等。int serveTime = new Random().nextInt(maxRand) + Constants.MIN_SERVICE_TIME;try {Thread.sleep(serveTime);//這個時間段在服務中} catch (InterruptedException e) {e.printStackTrace();}System.out.println(windowName + "為第" + number + "個VIP客戶完成服務,耗時" + serveTime + "秒");} //如果沒有客戶else {System.out.println(windowName + "沒有取到服務任務");//為普通客戶服務commonService();}}}

中間用到的枚舉客戶類型:

//枚舉使用者類型public enum CustomerType {COMMON, EXPRESS, VIP;}

 

常量:

//常量public class Constants {public static int MAX_SERVICE_TIME = 10;//最長服務時間10秒public static int MIN_SERVICE_TIME = 1;//最短服務時間1秒public static int COMMON_SERVICE_INTERVAL_TIME = 1;//普通客戶1秒來一個。}

主啟動類:

 

 

import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class MainClass {public static void main(String[] args) {//產生四個普通客戶視窗for(int i=1; i<5; i++) {ServiceWindow commonWindow = new ServiceWindow();commonWindow.setWindowId(i);commonWindow.start();}//產生一個快速客戶視窗ServiceWindow expressWindow = new ServiceWindow();expressWindow.setType(CustomerType.EXPRESS);expressWindow.start();//產生一個VIP客戶視窗ServiceWindow vipWindow = new ServiceWindow();vipWindow.setType(CustomerType.VIP);vipWindow.start();//每隔1秒來1位普通客戶要號Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {public void run() {//普通客戶要號int number = NumberMachine.getInstance().getCommonManager().generateNumber();System.out.println("————————————————————————" + number + "號普通客戶等待服務");}}, 0, Constants.COMMON_SERVICE_INTERVAL_TIME, TimeUnit.SECONDS);//每隔2秒來1位快速客戶要號Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {public void run() {//快速客戶要號int number = NumberMachine.getInstance().getExpressManager().generateNumber();System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~" + number + "號快速客戶等待服務");}}, 0, Constants.COMMON_SERVICE_INTERVAL_TIME * 2, TimeUnit.SECONDS);//每隔6秒來1位VIP客戶要號Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {public void run() {//普通客戶要號int number = NumberMachine.getInstance().getVipManager().generateNumber();System.out.println("★★★★★★★★★★★★★★★" + number + "號VIP客戶等待服務");}}, 0, Constants.COMMON_SERVICE_INTERVAL_TIME * 6, TimeUnit.SECONDS);}}

 

 

 

 

 

 

----------------------- android培訓、java培訓、期待與您交流! ----------------------

 詳情請查看:http://edu.csdn.net/heima

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.