银行业务调度系统

简介:

这篇文章会学到的相关新知识点

Executors(遗嘱执行人,executor:执行者)、Runnable(可运行)、if语句和switch的区别?、switch的数据类型只能是哪些?、面向对象设计的一个重要原则

Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(command,initialDelay,delay,unit);

跟着大牛视频写出来的

模拟实现银行业务调度系统

具体需求如下

1、银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为vip窗口。

2、有三种对应类型的客户,普通客户,快速客户,VIP客户。

3、异步随机生成各种类型的客户,生成各种类型用户的概率比例为:普通客户:快速客户:VIP客户=3:6:1

4、客户办理业务所需的时间有最大值和最小值,在该范围内随机设定每个客户办理业务所需的时间,而快速用户所需的时间设为最小值。(提示:办理业务的过程可以通过线程Sleep的方式模拟)。

5、各类型客户在其对的应窗口按顺序依次办理业务。

6、当VIP客户和快速业务窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

7、不用实现GUI界面。

面向对象的分析与设计

有三种对应类型的客户:VIP客户,普通客户,快速客户,异步随机生成各种类型的客户,各类型的客户在其对应窗口按顺序依次办理业务。

各类型客户在其对应窗口按顺序依次办理业务,准确的说,应该是窗口依次叫好。

一个客户从进入银行到离开银行,在这系统中做了些什么事

程序的类图

图中◇——代表聚合关系,——代表关联关系。getInstance()是静态方法。因为系统中只有一个取号机,所以这里用单例设计模式。

参看百度百科的解释http://baike.baidu.com/view/977673.htm?fr=aladdin

代码实现

ServiceWindow类的实现

package com.itcast.bank;

import java.util.Random;
import java.util.concurrent.Executors;

import constants.Constant;

import enums.CustomerType;

/**
 * 服务窗口
 *
 * @author Terry
 * @date 2014-6-2
 *
 */
public class ServiceWindow {
	public ServiceWindow(){}//无参构造
	//有参构造
	public ServiceWindow(CustomerType windowType,int windowId){
		this.windowType = windowType;
		this.windowId = windowId;
	}
	
	
	//private int windowType;//一般的写法,但这里只有三种类型,普通,特快,VIP,这里用枚举比较好
	//这两个方法也可以做为构造方法传入,但是不那么做,如果弄成构造函数传值的话,在new一个此对象的时候就
	//确定了它的类型和编号,不便于更改。
	private CustomerType windowType = CustomerType.COMMON;//默认类型COMMON
	private int windowId = 1;
	
	public void setWindowType(CustomerType windowType) {
		this.windowType = windowType;
	}

	public void setWindowId(int windowId) {
		this.windowId = windowId;
	}

	public void start(){
		//Executors(执行者)线程池
		Executors.newSingleThreadExecutor().execute(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				while(true){
//					问题:if语句和swicth语句的区别?
//					if (windowType == CustomerType.COMMON) {
//						
//					}else if(){
//						
//					}else if(){
//						
//					}
					switch (windowType) {
					case COMMON:
						commonService();
						break;
					case EXPRESS:
						NumberMachine.getInstance().getExpressManager();
						expressService();
						break;
					case VIP:
						NumberMachine.getInstance().getVIPManager();
						VIPService();
						break;
					default:
						break;
					}
				}
			}
		});
	}
	
	/**
	 * 普通服务
	 */
	private void commonService(){
		String windowName = "第"+windowId+"号"+windowType+"窗口";
		//System.out.println(windowName + "正在获取普通服务任务!");//这代码不应该写在这里,应该写在下面一行代码的后面,这样结果更直观
		Integer number = NumberMachine.getInstance().getCommomManager().fetchServiceNumber();
		System.out.println(windowName + "正在获取普通服务任务!");
		if(number != null){
			long beginTime = System.currentTimeMillis();
			int maxServiceTime =Constant.MAX_SERVICE_TIME - Constant.MIN_SERVECE_TIME;
			//获取1000-10000的随机数
			long serviceTime = new Random().nextInt(maxServiceTime) + 1 + Constant.MIN_SERVECE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				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) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}  
	}
	
	/**
	 * 快速服务
	 */
	private void expressService(){
		String windowName = "第"+windowId+"号"+windowType+"窗口";
		//System.out.println(windowName + "正在获取快速服务任务!");
		Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
		System.out.println(windowName + "正在获取快速服务任务!");
		if(number != null){
			long beginTime = System.currentTimeMillis();
			//int maxServiceTime =Constant.MAX_SERVICE_TIME - Constant.MIN_SERVECE_TIME;
			//long serviceTime = new Random().nextInt(maxServiceTime) + 1 + Constant.MIN_SERVECE_TIME;
			try {
				
				Thread.sleep(Constant.MIN_SERVECE_TIME);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			long costTime = System.currentTimeMillis()-beginTime;
			System.out.println(windowName + "为第"+number+"个"+"快速"+"客户完成服务,耗时" + costTime/1000+"秒");
			
		}else{
			System.out.println("没有取到快速服务!那我就取普通业务服务!");
			commonService();
		}  
	}
	
	
	
	private void VIPService(){
		String windowName = "第"+windowId+"号"+windowType+"窗口";
		Integer number = NumberMachine.getInstance().getVIPManager().fetchServiceNumber();
		System.out.println(windowName + "正在获取VIP服务任务!");
		if(number != null){
			long beginTime = System.currentTimeMillis();
			int maxServiceTime =Constant.MAX_SERVICE_TIME - Constant.MIN_SERVECE_TIME;
			long serviceTime = new Random().nextInt(maxServiceTime) + 1 + Constant.MIN_SERVECE_TIME;
			try {
				
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			long costTime = System.currentTimeMillis()-beginTime;
			System.out.println(windowName + "为第"+number+"个"+"VIP"+"客户完成服务,耗时" + costTime/1000+"秒");
			
		}else{
			System.out.println("没有取到VIP服务任务,接着取普通任务!");
			commonService();
		}  
	}
}

NumberManager类的实现

package com.itcast.bank;

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

/**
 * 生产号码的机器
 *
 * @author Terry
 * @date 2014-6-1
 *
 */
public class NumberManager {
	//上一个号码
	private int lastNumber = 1;
	//这里用List,是面向接口编程,可以使程序有更好的延展性
	private List<Integer> queueNumber = new ArrayList<Integer>();
	/**
	 * 取号的方法,客户来了就调用这方法
	 * @return
	 */
	public synchronized Integer generateNewManager(){
		queueNumber.add(lastNumber);
		return lastNumber++;
	}
	
	/**
	 * 获取号码的方法,窗口没业务办理时,要领任务时,调用这个方法
	 * 原来的想法是返回 int 基本类型的但是有问题,详细了解的时候就进方法看.
	 * @return
	 */
	public synchronized Integer fetchServiceNumber(){
		if(queueNumber.size() > 0){
			//如果下面的queueNumber当中没有元素,那它的remove方法返回的值是null,而要让null
			//强转成int是不行的,所以上面方法的返回值改为了integer
			return queueNumber.remove(0);//这里是返回移除的对象,现在返回的是Integer因为List<Integer> queueNumber = new Array
										 //List<Integer>();如果将Integer改成Object那前面返回的就是Object
		}
		return null;	
	}
}

NumberMachine类的实现

package com.itcast.bank;

/**
 * 管理号码的机器
 *
 * @author Terry
 * @date 2014-6-1
 *
 */
public class NumberMachine {
	//普通号码生产机
	private NumberManager commomManager = new NumberManager();
	//特快号码生产机
	private NumberManager expressManager = new NumberManager();
	//VIP客户号码生产机
	private NumberManager VIPManager = new NumberManager();
	
	/**
	 * 获得普通号码生产机
	 * @return
	 */
	public NumberManager getCommomManager() {
		return commomManager;
	}
	/**
	 * 获得快速号码生产机
	 * @return
	 */
	public NumberManager getExpressManager() {
		return expressManager;
	}
	/**
	 * 获得VIP号码生产机
	 * @return
	 */
	public NumberManager getVIPManager() {
		return VIPManager;
	}
	
	
	
	private NumberMachine(){}
	/**
	 * 得到单例
	 * @return
	 */
	public static NumberMachine getInstance(){
		//return new NumberMachine();这种写法应该不是单列设计模式,感觉这样写每次返回的都是新的一个对象
		return instance;
	}
	private static NumberMachine instance = new NumberMachine();
}
顾客类型的枚举类CustomerType实现

package enums;
/**
 * 顾客类型
 * customer:顾客
 * @author Terry
 * @date 2014-6-2
 *
 */
public enum CustomerType {
	COMMON,EXPRESS,VIP;
	
	@Override
	public String toString(){
		switch (this) {
		case COMMON:	
			return "普通";
		case EXPRESS:	
			return "快速";
		case VIP:	
			return name();
		}
		return null;
	}
}

窗口类型的枚举类WindowType实现

package enums;
/**
 * 窗口类型
 *
 * @author Terry
 * @date 2014-6-2
 *
 */
public enum WindowType {
	/**
	 * 普通窗口
	 */
	ORDINARYWINDOW,FASTWINDOW,VIDWINDOW
}

Constant类实现Constant:常量

package constants;

public class Constant {
 public final static int MAX_SERVICE_TIME = 10000;
 public final static int MIN_SERVECE_TIME = 1000;
 public final static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}
程序入口Main类的实现

package main;

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

import com.itcast.bank.NumberMachine;
import com.itcast.bank.ServiceWindow;

import constants.Constant;

import enums.CustomerType;

/**
 * 程序的入口类
 *
 * @author Terry
 * @date 2014-6-2
 *
 */
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**
		 * 创建4个普通类型的窗口
		 */
		for (int i = 1; i < 5; i++) {
			ServiceWindow commonWindow = new ServiceWindow();
			commonWindow.setWindowId(i);
			commonWindow.start();
		}
		/**
		 * 创建快速服务类型的窗口
		 */
		ServiceWindow expressWindow = new ServiceWindow();
		expressWindow.setWindowType(CustomerType.EXPRESS);
		expressWindow.start();
		/**
		 * 创建VIP类型的窗口
		 */
		ServiceWindow vipWindow = new ServiceWindow();
		vipWindow.setWindowType(CustomerType.VIP);
		vipWindow.start();
		//调度线程池(Scheduled:调度,Pool:池子)
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						Integer number = NumberMachine.getInstance().getCommomManager().generateNewManager();
						System.out.println(number + "号普通客户等待服务!");
					}
				}, 
				0, 
				Constant.COMMON_CUSTOMER_INTERVAL_TIME,
				TimeUnit.SECONDS
				);
		
		
		//调度线程池(Scheduled:调度,Pool:池子)
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
						System.out.println(number + "号快速客户等待服务!");
					}
				}, 
				0, 
				Constant.COMMON_CUSTOMER_INTERVAL_TIME * 2,
				TimeUnit.SECONDS
				);
		
		
		
		//调度线程池(Scheduled:调度,Pool:池子)
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
				new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						Integer number = NumberMachine.getInstance().getVIPManager().generateNewManager();
						System.out.println(number + "号VIP客户等待服务!");
					}
				}, 
				0, 
				Constant.COMMON_CUSTOMER_INTERVAL_TIME * 6,
				TimeUnit.SECONDS
				);
		
	}

}


到这里程序就全部写完了


看了张孝祥老师的视频后自己思考写出来的

(下面之所以重复是为了看的时候方便点,免得看的时候一会上,一会下的麻烦)

模拟实现银行业务调度系统

具体需求如下

1、银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为vip窗口。

2、有三种对应类型的客户,普通客户,快速客户,VIP客户。

3、异步随机生成各种类型的客户,生成各种类型用户的概率比例为:普通客户:快速客户:VIP客户=3:6:1

4、客户办理业务所需的时间有最大值和最小值,在该范围内随机设定每个客户办理业务所需的时间,而快速用户所需的时间设为最小值。(提示:办理业务的过程可以通过线程Sleep的方式模拟)。

5、各类型客户在其对的应窗口按顺序依次办理业务。

6、当VIP客户和快速业务窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

7、不用实现GUI界面。


一个客户从进入银行到离开银行,在这系统中做了些什么事(这里应该使用用例图吧)

这里可以用模板方法设计模式(行为型的设计模式)。客户的行为大致上是一致的就是:到银行------->去取号------>等待区等待------>办理业务------>离开银行,只是办理的业务不同而已。

面向对象的分析与设计

步骤一:找系统中用到的类和方法

找主要名词:

业务窗口:普通业务窗口、快速业务(Business)窗口、vip业务窗口

客       户:普通类型客户、快速类型客户、vip类型客户

办理业务的时间、

(附加的隐含名词:取号机、小票、等待区)

找主要动词
取号机生成小票、窗口办理业务、随机设定办理业务的时间

(附加的隐含动词:取号、窗口叫号)

上面的名词动词找完了,一般我们经常去银行处理业务吧,到银行后都是先去找取号机去取号,然后得到小票,去等待区等待窗口叫号,最后去办理业务。由于取票机是不会产生下票的,只是在他的内部有产生小票的机器,所以还有个对象下票制作机。所以这时候就会多了一些隐含名词和动词

步骤二:根据上面找到的类和方法,画类图

                TakeANumberMachine取票机的类,本打算偷懒把创建三种票的方法,设计给取票机的,但是到后面出了问题,就是不好给票计数,vip票有vip票的计数器,普通票有普通票的计数器,快速票有快速票的计数器都交给取票机的话会混乱,也违背了面向对象的5条基本设计原则之单一职责原则。

                单一职责原则:阐述的类容是:一个类,应该只有一个引起它变化的原因。即一个类中应该只有一种职责,如果一个类有一个以上的职责,那么这些职责就会耦合在一起。当一个职责发生变化时,可能会影响其他的职责。另外,多个职责偶合在一起,会影响复用性。

                在单一职责中,将职责定义为“变化的原因”,也就是说一个类应该具有一个引起它改变的原因,不能存在多个变化原因。这个定义很简单,也很容易理解,但是在实际的应用上却是比较难以掌控的。因为,"变化的原因"很难界定,而且有一些“变化”可能还是个未知数不能确定,各种实际情况都会存在。我们在做具体项目的时候,需要仔细分析类中的功能职责,通常意味着单一的功能,因此不要让类实现过多的功能点,以保证一个实体类只有一个引起它变化的原因。

                如何实现单一职责原则:一句话,尽可能地让一个类实现单一的功能点。

上面大量用到抽象类,下次试试用接口

代码实现:

工程目录结构图、

各类的实现:

BusinessTimer类

package com.itcast;

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : BusinessTimer.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//



/**
 * 业务时间类,保持与时间相关的常量,后面好像没用到
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class BusinessTimer {
	private  final int MINTIME = 1000;
	private  final int MAXTIME = 10000;
	public int getMINTIME() {
		return MINTIME;
	}
	public int getMAXTIME() {
		return MAXTIME;
	}
	
	
}

TakeANumberMachine

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : TakeANumberMachine.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//
package com.itcast;

import com.itcast.abstracts.AbstractCustomers;
import com.itcast.abstracts.AbstractSmallTicket;
import com.itcast.smallticket.GeneralSmallTicket;



/**
 * 取票的机器类
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class TakeANumberMachine {
	/**
	 * 单例设计模式
	 */
	private static TakeANumberMachine temp = new TakeANumberMachine();
	private TakeANumberMachine(){}
	public static TakeANumberMachine getTakeANumberMachine(){
		return temp;
	}
	private  MakingSmallTicketMachine1 generalTicketMachine1 = new MakingSmallTicketMachine1();
	private  MakingSmallTicketMachine1 fastTicketMachine1 = new MakingSmallTicketMachine1();
	private  MakingSmallTicketMachine1 vipTicketMachine1 = new MakingSmallTicketMachine1();
	public synchronized AbstractSmallTicket getSmallTicket(AbstractCustomers a) {
		switch (a.getType()) {
		case GENERAL:	
			return generalTicketMachine1.makeGeneralTicket();
		case FAST:
			return fastTicketMachine1.makeGeneralTicket();
		case VIP:
			return vipTicketMachine1.makeGeneralTicket();
		}
		return null;
	}
}

/**
 * 内部类
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
class MakingSmallTicketMachine1 {
	Integer counter = 1;
	AbstractSmallTicket ast;
	synchronized AbstractSmallTicket  makeGeneralTicket(){
		ast = new GeneralSmallTicket();
		ast.setNumber(counter);
		counter ++;
		return ast;
	}
}

WaitingArea

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : WaitingArea.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//
package com.itcast;

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

import com.itcast.abstracts.AbstractCustomers;
import com.itcast.enums.TypeInformation;



/**
 * 等待区的类
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class WaitingArea {
	private WaitingArea(){}
	private static WaitingArea waitingArea = new WaitingArea();
	public static WaitingArea getWaitingArea(){
		return waitingArea;
	}
	
	
	
	
	
	
	
	private  List<AbstractCustomers> generalCustomers = new ArrayList<AbstractCustomers>();
	private  List<AbstractCustomers> fastCustomers = new ArrayList<AbstractCustomers>();;
	private  List<AbstractCustomers> VIPCustomers = new ArrayList<AbstractCustomers>();;
	/**
	 * 
	 * @param type
	 * @return
	 */
	public  AbstractCustomers getCustomer(TypeInformation type) {
		switch (type) {
		case GENERAL:
			if(generalCustomers.size() == 0){
				return null;
			}else{	
				AbstractCustomers temp = generalCustomers.remove(0);
//				System.out.println(temp.getType());
				return temp;
			}	
		case FAST:
			if(fastCustomers.size() == 0){
				return null;
			}else{
				return fastCustomers.remove(0);
			}
		case VIP:
			if(VIPCustomers.size() == 0){
				return null;
			}else{
				return VIPCustomers.remove(0);
			}
		default:
			return null;
		}
	}
	
	public boolean addCustomer(AbstractCustomers a) {
		switch (a.getType()) {
		case GENERAL:		
			return generalCustomers.add(a);
		case FAST:
			return fastCustomers.add(a);
		case VIP:
			return VIPCustomers.add(a);
		}
		return false;
	}
}

AbstractBusinessWindow

package com.itcast.abstracts;

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

import com.itcast.BusinessTimer;
import com.itcast.WaitingArea;
import com.itcast.constant.Constant;
import com.itcast.enums.TypeInformation;


//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : AbstractBusinessWindow.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//



/**
 * 抽象业务窗口
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public abstract class AbstractBusinessWindow {
	public Integer name;
	public TypeInformation type;
	protected BusinessTimer businessTimer;
	protected AbstractCustomers custromer;
	protected Constant constant = new Constant();
	protected Random random = new Random();
	
	public void start(final AbstractBusinessWindow abstractBusinessWindow){
		Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
				new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						abstractBusinessWindow.acceptTheTask(abstractBusinessWindow);
					}
				},
				1,
				1,
				TimeUnit.SECONDS);
	}
	
	
	public  void acceptTheTask(AbstractBusinessWindow abstractBusinessWindow){
		
	};
	
	/**
	 * 处理普通业务
	 * @param a
	 */
	public void abstractProcessingBusiness(AbstractBusinessWindow abw,AbstractCustomers a) {
		long beginTime = System.currentTimeMillis();
		//System.out.println(beginTime);
		long temp = (random.nextInt(constant.MAXTIME-constant.MINTIME)+1)+1000;
		try {
			Thread.sleep(temp);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long endTime = System.currentTimeMillis() - beginTime;
		System.out.println(abw.name + "号" + abw.type + "窗口为" + a.getTicket().getNumber() + "号" + a.getType() + "顾客服务,耗时" + endTime/1000 + "秒");
	}
}


AbstractCustomers

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : AbstractCustomers.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//

package com.itcast.abstracts;

import com.itcast.TakeANumberMachine;
import com.itcast.constant.Constant;
import com.itcast.enums.TypeInformation;



/**
 * 抽象客户
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public abstract class AbstractCustomers {
	protected TypeInformation type;
	protected AbstractSmallTicket ticket;
	//取票机
	protected TakeANumberMachine tanm;
	protected Constant constant = new Constant();
	public TypeInformation getType() {
		return type;
	}


	public void setType(TypeInformation type) {
		this.type = type;
	}


	public AbstractSmallTicket getTicket() {
		return ticket;
	}


	public void setTicket(AbstractSmallTicket ticket) {
		this.ticket = ticket;
	}
	
	/**
	 * 客户找取票机,取票
	 */
	private void goGetATicket(){
		ticket = tanm.getSmallTicket(this);
	}
	/**
	 * 去等待区等待叫号
	 */
	private void goWaitingArea(){
		constant.waitingArea.addCustomer(this);
		System.out.println(ticket.getNumber() + "号" + type +"正在等待服务!");
	}
	/**
	 * 开始
	 */
	public void abstractStart() {
		goGetATicket();
		goWaitingArea();
	}
}

AbstractSmallTicket

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : AbstractSmallTicket.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//


package com.itcast.abstracts;
/**
 * 抽象小票
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public abstract class AbstractSmallTicket {
	private  Integer number;

	public Integer getNumber() {
		return number;
	}

	public void setNumber(Integer number) {
		this.number = number;
	}
	
}

FastBusinessWindow

package com.itcast.businesswindow;

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

import com.itcast.abstracts.AbstractBusinessWindow;
import com.itcast.abstracts.AbstractCustomers;
import com.itcast.enums.TypeInformation;



/**
 * 办理快速业务的窗口也能办理普通业务
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class FastBusinessWindow extends AbstractBusinessWindow {
	public FastBusinessWindow(Integer i){
		name = i;
		type = TypeInformation.FAST;
	}
	
	public FastBusinessWindow(){
		type = TypeInformation.FAST;
	}
	@Override
	public void acceptTheTask(final AbstractBusinessWindow abstractBusinessWindow) {
		// TODO Auto-generated method stub
		System.out.println(abstractBusinessWindow.name +"号"+ abstractBusinessWindow.type + "窗口正在领取" + type +"的任务!");
		if((custromer = constant.waitingArea.getCustomer(type)) != null){
			abstractProcessingBusiness(custromer);
		}else{
			System.out.println("没有取到"+type+"任务,准备领取普通任务!");
			GeneralBusinessWindow gbw = new GeneralBusinessWindow();
			gbw.acceptTheTask(abstractBusinessWindow);
		}
	}
	
	/**
	 * 处理快速业务
	 * @param a
	 */
	public void abstractProcessingBusiness(AbstractCustomers a) {
		// TODO Auto-generated method stub
		long beginTime = System.currentTimeMillis();
		//System.out.println(beginTime);
		long temp = (random.nextInt(constant.MAXTIME-constant.MINTIME)+1)+1000;
		try {
			Thread.sleep(constant.MINTIME);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long endTime = System.currentTimeMillis() - beginTime;
		System.out.println(name + "号" + type + "窗口为" + a.getTicket().getNumber() + "号" + a.getType() + "顾客服务,耗时" + endTime/1000 + "秒");
	}
}

GeneralBusinessWindow

package com.itcast.businesswindow;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import com.itcast.abstracts.AbstractBusinessWindow;
import com.itcast.enums.TypeInformation;

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : GeneralBusinessWindow.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//
/**
 * 只能办理普通业务
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class GeneralBusinessWindow extends AbstractBusinessWindow {
	public GeneralBusinessWindow(Integer i){
		name = i;
		type = TypeInformation.GENERAL;
	}
	
	public GeneralBusinessWindow(){
		type = TypeInformation.GENERAL;
	}
	@Override
	public void acceptTheTask(final AbstractBusinessWindow abstractBusinessWindow) {
		// TODO Auto-generated method stub
		System.out.println(abstractBusinessWindow.name +"号"+ abstractBusinessWindow.type + "窗口正在领取普通的任务!");
		if((custromer = constant.waitingArea.getCustomer(type)) != null){
			abstractProcessingBusiness(abstractBusinessWindow,custromer);
		}else{
			System.out.println(abstractBusinessWindow.name +"号"+ abstractBusinessWindow.type + "没有取到普通任务,休息一会!");
			try {	
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
	}
}

VIPBusinessWindow

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : VIPBusinessWindow.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//
package com.itcast.businesswindow;
import com.itcast.abstracts.AbstractBusinessWindow;
import com.itcast.enums.TypeInformation;

/**
 * 办理VIP业务也能办理普通业务
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class VIPBusinessWindow extends AbstractBusinessWindow {
	public VIPBusinessWindow(Integer i){
		name = i;
		type = TypeInformation.VIP;
	}
	
	public VIPBusinessWindow(){
		type = TypeInformation.VIP;
	}
	@Override
	public void acceptTheTask(final AbstractBusinessWindow abstractBusinessWindow) {
		// TODO Auto-generated method stub
		System.out.println(abstractBusinessWindow.name +"号"+ abstractBusinessWindow.type + "窗口正在领取" + type +"的任务!");
		if((custromer = constant.waitingArea.getCustomer(type)) != null){
			abstractProcessingBusiness(abstractBusinessWindow,custromer);
		}else{
			System.out.println("没有取到"+type+"任务,领取普通任务!");
			AbstractBusinessWindow gbw = new GeneralBusinessWindow();
			gbw.acceptTheTask(abstractBusinessWindow);
		}
	}
}

Constant

package com.itcast.constant;

import com.itcast.TakeANumberMachine;
import com.itcast.WaitingArea;
/**
 * 用来存储常量的类
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public  class Constant {
	public static final WaitingArea waitingArea = WaitingArea.getWaitingArea();
	public static final TakeANumberMachine takeANumberMachine = TakeANumberMachine.getTakeANumberMachine();
	public final int MAXTIME = 10000; 
	public final int MINTIME = 1000; 
}

FastCustomers

package com.itcast.customer;

import com.itcast.abstracts.AbstractCustomers;
import com.itcast.constant.Constant;
import com.itcast.enums.TypeInformation;

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : FastCustomers.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//



/**
 * 前来办理快速业务的客户
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class FastCustomers extends AbstractCustomers {
	public FastCustomers(){
		Constant cons = new Constant();
		type = TypeInformation.FAST;
		tanm = cons.takeANumberMachine;
	}
}

GeneralCustomers

package com.itcast.customer;

import com.itcast.abstracts.AbstractCustomers;
import com.itcast.constant.Constant;
import com.itcast.enums.TypeInformation;

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : GeneralCustomers.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//



/**
 * 前来办理普通客户的业务
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class GeneralCustomers extends AbstractCustomers {
	
	public GeneralCustomers(){
		Constant cons = new Constant();
		type = TypeInformation.GENERAL;
		tanm = cons.takeANumberMachine;
	}
}

VIPCustomers

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : VIPCustomers.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//

package com.itcast.customer;

import com.itcast.abstracts.AbstractCustomers;
import com.itcast.constant.Constant;
import com.itcast.enums.TypeInformation;

/**
 * 前来办理VIP业务的客户
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class VIPCustomers extends AbstractCustomers {
	public VIPCustomers(){
		Constant cons = new Constant();
		type = TypeInformation.VIP;
		tanm = cons.takeANumberMachine;
	}
}

TypeInformation

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : TypeInformation.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//
package com.itcast.enums;


/**
 * 类型的枚举
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public enum TypeInformation {
	GENERAL,FAST,VIP;
	public String toString() {
		switch (this) {
		case GENERAL:		
			return "普通";
		case FAST:
			return "快速";
		case VIP:				
			return "VIP";
		}
		return null;
	};
}

Main

package com.itcast.main;

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

import com.itcast.abstracts.AbstractBusinessWindow;
import com.itcast.abstracts.AbstractCustomers;
import com.itcast.businesswindow.FastBusinessWindow;
import com.itcast.businesswindow.GeneralBusinessWindow;
import com.itcast.businesswindow.VIPBusinessWindow;
import com.itcast.customer.FastCustomers;
import com.itcast.customer.GeneralCustomers;
import com.itcast.customer.VIPCustomers;
/**
 * 程序入口
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**
		 * 开启普通窗口
		 */
		for (int i = 1; i < 5; i++) {
			AbstractBusinessWindow abw1 = new GeneralBusinessWindow(i);
			abw1.start(abw1);
		}
		/**
		 * 开启快速窗口
		 */
		AbstractBusinessWindow abw2 = new FastBusinessWindow(1);
		abw2.start(abw2);
		/**
		 * 开启VIP窗口
		 */
		AbstractBusinessWindow abw3 = new VIPBusinessWindow(1);
		abw3.start(abw3);
	
		/**
		 * 普通客户来了
		 */
		Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
				new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						AbstractCustomers ac = new GeneralCustomers();
						ac.abstractStart();
					}
				}, 
				1,
				1,
				TimeUnit.SECONDS);
		
		
		
		
		/**
		 * 快速客户来了
		 */
		Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
				new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						AbstractCustomers ac = new FastCustomers();
						ac.abstractStart();
					}
				}, 
				1*3,
				1*3,
				TimeUnit.SECONDS);
		
		/**
		 * VIP客户来了
		 */
		Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(
				new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						AbstractCustomers ac = new VIPCustomers();
						ac.abstractStart();
					}
				}, 
				1*10,
				1*10,
				TimeUnit.SECONDS);
		}
}

FastSmallTicket

package com.itcast.smallticket;

import com.itcast.abstracts.AbstractSmallTicket;

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : FastSmallTicket.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//



/**
 * 快速业务的小票
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class FastSmallTicket extends AbstractSmallTicket {
}

GeneralSmallTicket

package com.itcast.smallticket;

import com.itcast.abstracts.AbstractSmallTicket;

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : GeneralSmallTicket.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//



/**
 * 普通业务的小票
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class GeneralSmallTicket extends AbstractSmallTicket {
}

VIPSmallTicket

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : VIPSmallTicket.java
//  @ Date : 2014/6/3
//  @ Author : 
//
//
package com.itcast.smallticket;

import com.itcast.abstracts.AbstractSmallTicket;


/**
 * VIP业务的小票
 *
 * @author Terry
 * @date 2014-6-3
 *
 */
public class VIPSmallTicket extends AbstractSmallTicket {
}

程序到这里就写完了

相关知识点的解说

if语句和switch的区别?

1、作用都差不多的,但是swicth效率高

switch的数据类型只能是哪些?

经过在程序中用java中所有的数据类型做过的试验得出,switch中可以用的数据类型有:byte、char、short、int、枚举类型。(由于自动装箱和拆箱的关系他们的对象类型也可以用)

面向对象设计的一个重要原则

1、谁拥有数据,谁就对外提供操作这些数据的方法。

2、一段话中的名词一般可作为对象,动词一般可作为方法。






相关文章
|
资源调度 分布式计算 安全
伏羲—阿里云分布式调度系统
在12月12日的云栖社区在线培训上,“飞天”分布式系统核心开发人员陶阳宇分享了《伏羲-阿里云分布式调度系统》。他主要从伏羲系统架构、任务调度、资源调度、容错机制、规模挑战、安全与性能隔离方面介绍了伏羲分布式系统架构和设计理念。
22033 0
|
4月前
|
监控 算法 数据挖掘
ERP系统中的生产线排程与调度优化解析
【7月更文挑战第25天】 ERP系统中的生产线排程与调度优化解析
132 6
|
4月前
|
监控 算法 数据可视化
ERP系统中的生产调度与计划排程解析
【7月更文挑战第25天】 ERP系统中的生产调度与计划排程解析
276 1
|
4月前
|
运维 监控 调度
ERP系统中的生产计划与调度
【7月更文挑战第25天】 ERP系统中的生产计划与调度
200 2
|
3月前
|
存储 资源调度 Serverless
阿里巴巴经济体核心调度系统“伏羲”设计问题之伏羲系统的功能如何解决
阿里巴巴经济体核心调度系统“伏羲”设计问题之伏羲系统的功能如何解决
97 0
|
4月前
|
监控 数据可视化 调度
ERP系统中的生产排程与生产效率分析解析
【7月更文挑战第25天】 ERP系统中的生产排程与生产效率分析解析
174 0
|
4月前
|
调度 知识图谱
【综合能源】含氢气氨气综合能源系统优化调度【免费】
该程序参考《_基于氨储能技术的电转氨耦合风–光–火综合能源系统双层优化调度》模型,对制氨工厂、风力发电、电制氢、燃气轮机、火电机组等主体进行建模分析,以火电机组启停成本、煤耗成本、弃风成本和购气成本形成的综合成本为目标,程序采用matlab+cplex求解,注释清晰,方便学习!
|
6月前
|
算法 新能源 人机交互
万界星空科技MES系统中的生产调度流程
MES系统生产调度的目标是达到作业有序、协调、可控和高效的运行效果,作业计划的快速生成以及面向生产扰动事件的快速响应处理是生产调度系统的核心和关键。
246 0
|
存储 调度
开发团队调度系统
开发团队调度系统
|
供应链 调度
考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度(Matlab代码实现)
考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度(Matlab代码实现)
106 0
下一篇
无影云桌面