老板做人不错,做事条理清晰,自己有技术
一、面向对象的分析和设计
1、客户取号
1)、过程:客户——>取号机——>号码管理器生成号码
2)、号码管理器的设计
a) 号码管理器的任务
号码管理器要有一个变量记住产生的号码 ( int number ),产生号码后将其保存,在窗口空闲时将保存的号码交给窗口。
b) 号码管理器的成员:
属性:1、记住号码的int变量,
2、1个集合,用于保存产生的号码,
3、号码管理器的类型
方法:1、将号码保存起来的方法
2、向窗口送出号码的方法
3)、取号机的设计
a) 取号机要异步生成3种类型的号码:普通客户号码,快速客户号码,vip客户号码,所以取号机中要有三个号码管理器。
b) 并且取号机只有一个,所以要设计成单例。
c) 单例
私有构造函数
建立静态的私有的本类对象
设置静态的共有的get方法得到本类对象
2、窗口为客户提供服务
1) 过程:获取号码——>获取到号码——提供服务——>完成——>获取号码… …
没有获取到号码——等待1s——>获取号码… …
2) 窗口的设计
a) 窗口分析
窗口分普通窗口(4个),快速窗口,vip窗口。3种类型的窗口提供服务的过程( 1)表示的过程)是一样的。不同的是,他们服务的对象是由不同的号码管理器送来的,可以在建立对象时由构造函数传入号码管理器。并且窗口有自己的名称和类型。
b) 窗口成员
属性:名称,类型
方法(功能):服务的功能
细节:
1、独立线程
使用线程池Executor.newSingleThreadExecutor().execute(command)
2、集合中没有int,取不到号码,会发生空指针异常,所以要将取号的返回类型用Integer包装
3、执行时间:System.currentTimeMillis,它的返回值是long
4、定义最大时间、最小时间随机时间
i.MAX_SERVICE_TIME——>a
ii.MIN_SERVICE_TIME——>i
iii.随机时间:new Random().nextInt(a-i) + 1/*1到9000的一个随机值*/+ i
5、new Runnable(){},Runnable的匿名子类对象。
6、将vip窗口和快速窗口设置成普通窗口的子类
2、
二 代码模块:
1、服务过程图例
2、号码管理器NumberManager
3、取号机NumberMachine
4、窗口
5、主程序
代码:
号码管理器:NumberManager
public class NumberManager{
private int lastNumber = 1 ;
//定义排队的集合
private List
//生成号码的方法
//两个线程访问相同的数据,要使用同步
public synchroized Integer generateNewManager(){
queueNumber.add(lastNumber);
return lastNumber++ ;
}
//给窗口号码的方法
public synchroized Integer fetchServiceNumber(){
return lastNumber.remove(0) ;
}
}
取号机:NumberMachine
public class NumberMachine{
//创建要用的变量,并提供公共的访问方法
private NumberManager commonManager= new NunberManager() ;
private NumberManager expressManager= new NunberManager() ;
private NumberManager vipManager= new NunberManager() ;
public NumberManager getCommonManager(){
return commonManager ;
}
public NumberManager getCommonManager(){
return expressManager;
}
public NumberManager getCommonManager(){
return vipManager;
}
//单例
private NumberMachine(){}
public static NumberMachine getInstance(){
return intstance ;
}
private static NumberMachint instance = new NumberMachine() ;
}
窗口:window(1~4个普通窗口,5好快速窗口,6vip窗口)
public class Window{
//属性:名称和类型以及get、set方法
private String windowId ;
public void setWindowId(String windowId){
this.windowId = windowId ;
}
public String getWindowId(){
return windowId ;
}
String windowType ;
public void setWindowType(String windowType){
this.windowType = windowType ;
}
public String getWindowType(){
return windowType;
}
//提供服务的方法
public service(NumberManager numberManager){
/*获取号码——>获取到号码——提供服务——>完成——>获取号码… …
没有获取到号码——等待1s——>获取号码… …*/
System.out.println(“”) ;
}
public enum CustomerType{
COMMON,EXPRESS,VIP ;
public String toString(){
switch(){
case COMMON :
return “普通” ;
case COMMON :
return “快速” ;
case COMMON :
return name() ;
}
return null ;
}
}
public class Constants{
public static int MAX_SERVICE_TIME = 10000 ;
public static int MIX_SERVICE_TIME = 1000 ;
}
private CustomerType type = customerType.COMMON ;
private int windowId = 1 ;
public void setType(){
this.type = type ;
}
public void setWindowId(){
this.windowId = windowId ;
}
public void CommonServer (){
String windowName =“第”+windowId+”号”+type+”窗口” ;
System.out.println(“正在获取任务”);
//取号
Integer number =
NumberMachine.getInstance().
getCommonMan ager().fetchServiceNumber();
//提供服务
if(number != null){
long beginTime = System.currentTimeMillis() ;
int maxServeTime =
Constants.MAX_SERVICE_TIME- Constants.MIX_SERVICE_TIME-C ;
long serveTime =
new Random().nextInt() +1 + Constants.MIX_SERVICE_TIME ;
try{
Thread.sleep(serveTime ;)
}catch(Exception e ){}
//完成服务
long endTime = System.currentTimeMillis() ;
long costTime = endTime - beginTime
System.out.println(windowName + “为第” +
number + “个” + type + “客户完成服务,耗时”+) ;
}else{
System.out.println(“没有服务任务,先休息1s”);
try{Thread.sleep(1000)
}catch(Exception e ){
}
}
}
。。。 。。。
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 ;
}
}
}
}) ;
}
}
主函数
MainClass{
main{
建立窗口
… ….
建立调度池,添加客户
}
}