高质量技术免费分享
https://blog.csdn.net/everyonetimeismoney/article/details/94412711
这篇文章会学到的相关新知识点
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、一段话中的名词一般可作为对象,动词一般可作为方法。