黒馬プログラマー銀行業務スケジューリングシステム

9314 ワード

--------androidトレーニング、javaトレーニング、java学習型技術ブログ、お客様との交流を楽しみにしています!--------
オブジェクト向けの分析と設計を行うには、VIP顧客、一般顧客、快速顧客、非同期ランダム生成各種顧客の3種類の対応タイプの顧客があり、各タイプの顧客はその対応窓口で順番に業務を処理する.
1.まず、銀行でよく業務を行う人は本システムを理解するのに有利で、銀行のこの業務に対して比較的に熟知しています.
各顧客が実際に銀行の番号取り機械によって番号を生成する方法で表されていることを知っておく必要があります.
したがって、番号マネージャオブジェクトを1つ持って、このオブジェクトに絶えず番号を生成させることは、ランダムに顧客を生成することに等しい.
2.3種類の顧客があり、各種類の顧客の番号編成は完全に独立しているため、本システムは全部で3つの番号マネージャオブジェクトを生成し、それぞれ1種類のユーザーのキュー番号を管理すると思います.この3つの番号マネージャオブジェクトは、システム全体で常に1つしか管理できない番号マシンによって統一されているので、単一の例に設計されます.各タイプのお客様は、対応するウィンドウで順番に業務を行い、正確には、ウィンドウが順番に番号を呼ぶべきです.
各窓口はどうしてどの番号を呼ぶべきか知っていますか?
サービスウィンドウが番号マネージャを探して現在サービスされる番号を取得するたびに、対応する番号マネージャに尋ねます.
NumberManagerクラス
このクラスは番号を生成するために使用され、番号発生器と呼ばれ、2つの機能があります.
1.番号を生成し、番号を生成するたびに、お客様を代表して、お客様は番号に従って並んで業務を行います.
2.サービス窓口に番号を提供し、毎回一番早いお客様の番号をサービス窓口に提供する
 この2つの方法は異なるスレッドで同じデータを操作するので,同期を行う.
/*
  NumberManager 
*/
package cn.itcast.bank;

import java.util.ArrayList;
import java.util.List;

public class NumberManager {
	
	//     
	private int lastNumber = 1;
	
	//                                         。
	private List queueNumber = new ArrayList();
	
	//            
	public synchronized Integer generateNewManager(){
		queueNumber.add(lastNumber);
		return lastNumber++;
	}
	//                   ,  ,     。
	
	//                   
	public synchronized Integer fetchServiceNumber(){
		Integer number = null;
		if(queueNumber.size() > 0){
			number = queueNumber.remove(0);
		}
		return number;
	}
}

NumberMachineクラス
この種類の対象は実は銀行内にあの番号取り機を置いて、各銀行は1つだけあって、だから単例のモードに設計します
3つのメンバー変数を定義して、通常、Quick、VIPクライアントの番号マネージャを表す3つのNumberManagerオブジェクトを指します. この3つのNumberManagerオブジェクトを返す3つの方法を定義します.
/*
  NumberMachine 
*/
package cn.itcast.bank;

public class NumberMachine {
	
	//              NumberManager  ,      、   VIP        
	private NumberManager commonManager = new NumberManager();
	private NumberManager expressManager = new NumberManager();
	private NumberManager VIPManager = new NumberManager();
	
	//                NumberManager  。
	public NumberManager getCommonManager() {
		return commonManager;
	}
	public NumberManager getExpressManager() {
		return expressManager;
	}
	public NumberManager getVIPManager() {
		return VIPManager;
	}
	//           ,         
	private NumberMachine(){}
	private static NumberMachine instance = new NumberMachine();
	public static NumberMachine getInstance(){
		return instance;
	}
}

CustomerType列挙クラス1.システムには3種類の顧客がいるので、3つのメンバーを定義してそれぞれ3種類の顧客を表す列挙クラスを定義します.2.toStringメソッドを書き換え、タイプの中国語名を返します.これは後の符号化時に再構成されたもので,最初は考慮しなくてもよい.
/*
  CustomerType   
 */
package cn.itcast.bank;

public enum CustomerType {
	
	//                 。
	COMMON,EXPRESS,VIP;
	
	//  toString  ,         。
	public String toString(){
		switch (this) {
		case COMMON:
			return"  ";
		case EXPRESS:
			return"  ";
		case VIP:
			return"VIP";
		}
		return null;
	}
}

ServiceWindowクラス
銀行の中のサービスウィンドウ:普通のウィンドウに分けて、高速ウィンドウとVIPウィンドウ1.startメソッドを定義して、内部は1つのスレッドを起動して、サービスウィンドウのカテゴリによってそれぞれ3つの異なるメソッドを循環して呼び出します.  2.3つの方法を定義し、それぞれ3つのお客様にサービスを提供します.実行効果を観察するために、詳細情報を詳細に印刷する必要があります.
/*
  ServiceWindow 
*/
package cn.itcast.bank;

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;
	}
	
	//    start  ,        ,                      。 
	public void start(){
		Executors.newSingleThreadExecutor().execute(new Runnable() { 
			public void run() {		
				while(true){
					switch (type) {  
						case COMMON:
							commonService();
							break;											
						case EXPRESS:
							expressService();
							break;			
						case VIP:
							vipService();
							break;
					}		
				}			
			}
		});
	}
		
	//                 ,        ,             。
	private void commonService() {
		String windowName = " "+windowId+" "+type+"  ";
		System.out.println(windowName+"      ");
		Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
		if(number != null){
			System.out.println(windowName+"    "+number+"       ");
			long beginTime = System.currentTimeMillis();
			int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
			long serveTime = new Random().nextInt((maxRand)+1+Constants.MIN_SERVICE_TIME);
			try {
				Thread.sleep(serveTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long costTime = System.currentTimeMillis() - beginTime;
			System.out.println(windowName+"  "+number+"         "+costTime/1000+" ");
		}
		else{
			System.out.println(windowName+"        1 ");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}	
	private void expressService() {
		String windowName = " "+windowId+" "+type+"  ";
		Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
		System.out.println(windowName+"      ");
		if(number != null){	
			System.out.println(windowName+"    "+number+" "+type+"    ");
			long beginTime = System.currentTimeMillis();
			//long serveTime = new Random().nextInt(Constants.COMMON_CUSTOMER_INTERVAL__TIME);
			try {
				Thread.sleep(Constants.MIN_SERVICE_TIME);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long costTime = System.currentTimeMillis() - beginTime;
			System.out.println(windowName+"  "+number+" "+type+"      "+costTime/1000+" ");
		}
		else{
			System.out.println(windowName+"      ");
			commonService();
		}
	}		
	private void vipService() {
		String windowName = " "+windowId+" "+type+"  ";
		Integer number = NumberMachine.getInstance().getVIPManager().fetchServiceNumber();
		System.out.println(windowName+"      ");
		if(number != null){
			System.out.println(windowName+"    "+number+" "+type+"    ");
			long beginTime = System.currentTimeMillis();
			int maxRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
			long serveTime = new Random().nextInt((maxRand)+1+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+" ");
		}
		else{
			System.out.println(windowName+"      ");
			commonService();
		}
	}		
}

MainClassクラス
1.forループで4つの一般的なウィンドウを作成し、1つの高速ウィンドウと1つのVIPウィンドウを作成します.
2.次に3つのタイマーを作成し、それぞれのタイミングで新しい一般顧客番号、新しい快速顧客番号、新しいVIP顧客番号を作成します.
package cn.itcast.bank;

import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class MainClass {

	public static void main(String[] args) {
		
		//  4     
		for(int i=1; i<5; i++){
			ServiceWindow commonWindow = new ServiceWindow();
			commonWindow.setWindowId(i);
			commonWindow.start();
		}
		
		//  1     
		ServiceWindow expressWindow = new ServiceWindow();
		expressWindow.setType(CustomerType.EXPRESS);
		expressWindow.start();
		
		//  1 VIP  
		ServiceWindow vipWindow = new ServiceWindow();
		vipWindow.setType(CustomerType.VIP);
		vipWindow.start();
	
		//      
		//       ,       ,  (1)      
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				
				//     ,           run    
				new Runnable() {
					public void run() {
						Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
						System.out.println(" "+number+"         !");
				}},
				0, //              
				Constants.COMMON_CUSTOMER_INTERVAL__TIME,//             
				TimeUnit.SECONDS //        
			);	
		
		//vip    
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(			
				new Runnable() {
					public void run() {
						Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
						System.out.println(" "+number+"         !");					
				}},
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL__TIME * 2,
				TimeUnit.SECONDS 
			);		
		//      
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				
				new Runnable() {
					public void run() {
						Integer number = NumberMachine.getInstance().getVIPManager().generateNewManager();
						System.out.println(" "+number+" VIP      !");						
				}},
				0, 
				Constants.COMMON_CUSTOMER_INTERVAL__TIME * 6,
				TimeUnit.SECONDS 
			);		
	  }
}

Constantsクラス
3つの定数の定義:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME
package cn.itcast.bank;

public class Constants {
	public static int MAX_SERVICE_TIME = 10000;
	public static int MIN_SERVICE_TIME = 1000;	
	public static int COMMON_CUSTOMER_INTERVAL__TIME = 1;
}

--------androidトレーニング、javaトレーニング、java学習型技術ブログ、お客様との交流を楽しみにしています!--------