-------------- Android培训 java培训 期待与您交流! --------------
首先在这里老师分析的需求和逻辑就不再赘述了
在这个系统里主要用了3个类NumberManager NumberMachine ServiceWindow 和枚举类和常量
NumberManager 主要是生成服务号码和取服务号码两个方法,
在generateNumber方法里,首先把客户去的号码放进List集合里面,在这里要注意return lastNumber++和return ++lastNumber的区别
第一个是先返回,再把lastNumber加一 后者是先把lastNumber加一再返回.
在fetchServiceNumber里面需要判断集合里面是否有号码,如果没有就会放回null,所以需要判断集合是否有号码,并且把返回值变为Integer 这也是Integer和int之间区别之一,在javaEE里面更建议使用integer.
NumberMachine 类是一个号码机器在整个系统中始终只能有一个,所以适合使用单例模式:
因为一共有三种窗口,普通窗口.快速窗口和VIP窗口 但是他们的取号码的方式是一样的,故定义三个NumberManager类型的成员变量,同时提供getter方法,
在定义单例的时候要注意,首先把构造方法定义成private的,这样别人就不能直接通过new 关键字实例化了,其次,既然别人不能直接实例化,那么我们就必须对外提供一个方法获取该实例对象,所以需要把该方法定义成static的,返回值为该类型,并且要把NumberMachine numberMachine = new NumberMachine ()定义成private和static的,因为一个static的方法不能直接使用static的成员变量,
ServiceWindow 有一个核心方法start 就是不停的叫号, 因为这个类的代码较多,就不再复制了,也没有是什么意思.
通过switch来判断是普通窗口 快速窗口还是VIP窗口,为什么要用switch而不用if 条件语句呢?因为switch的语句效率要高 至于为什么我也找了资料:
其次就是三种窗口的服务的方法
普通窗口:
快速窗口:
VIP窗口:
在commonService 方法中要注意
不能把type硬编码(harded code)为普通窗口,因为如果vip窗口没有客户,转而为普通客户服务,那么type就是vip,那么在控制台就永远看不到vip窗口为普通用户服务的语句了,尽管vip窗口为普通用户服务了.但是输出的却不是!
在这里我又只能硬编码了 因为如果vip窗口没有客户,转而为普通客户服务,那么type就是vip,如果此处不硬编码的话就成了vip窗口为vip用户服务了.这也是不符合实际的.
在枚举类中要注意:
如果直接输出枚举类的实例,就会调用枚举类的toString()方法其实不止枚举类,其他的类也是一样的,要想输出中文而不是枚举的实例,就只好覆写toString方法.
最后还有常量类Constants 在看老师视频的时候发现常量定义有误,可能是老师有点累把,定义常量的时候应该是public static final int MAX_TIME= 10;
而老师没有加上final关键字,从老师的编码的方式和风格上,我们可以看出,如果种类是有限的可以考虑使用枚举,如果我们多次使用同一个字符串或者整形可以考虑使用常量的方式,而不是硬编码的方式使用字符串或整形int 这样有助于代码的维护了,因为该字符串或int整形要修改值,那么就要修改多处,维护很不方便.
最后一个就是测试类了
首先ServiceWindow类创建4个普通窗口 1个快速窗口 1个vip窗口 并且同时设置窗口的类型或窗口id,
然后定义三个定时器,分别用来给普通客户取号 快速客户取号 vip客户取号 如代码片段
又因为在一定时间内这三个窗口的人数比为//vip:common:express = 1:6:3
所以三个线程池执行任务的周期分别为
Constants.COMMON_CUSTOMER_INTERVAL_TIME
Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,
Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,
假设时间为6秒那么三个窗口的人数为vip:common:express =1:6:3所以比列刚好.
这样整个系统就成了一个整体了.