---------------------- android培训、java培训、期待与您交流! ----------------------
这个项目我起先是想到将人设计为一个类,怎么想也想不通,后来看了老师的视频之后,对面向对象有了深的一层的理解。再次要结合现实生活,生活中我们去银行办理业务都需要先进行排号。因此号码成了识别每个顾客的唯一标识。号码这里包括两个:第一是顾客进入银行排的号,第二是窗口服务号码。这两个必须建立联系因此定一个号码管理机器的类
号码管理类:一个很好的list集合应用例子
1 public class NumberManager {
2 private int lastNumber = 0;
3 private List queueNumbers = new ArrayList();
4 //编号
5 public synchronized Integer generateNewNumber(){
6 queueNumbers.add(++lastNumber);
7 return lastNumber;
8 }
9 //服务窗口取号的方法!
10 public synchronized Integer fetchNumber(){
11 if(queueNumbers.size()>0){
12 return (Integer)queueNumbers.remove(0);
13 }else{
14 return null;
15 }
16 }
17 }
通过号码机器将号码分为三类
1 public class NumberMachine {
2
3 private NumberMachine(){}
4 private static NumberMachine instance = new NumberMachine();
5 public static NumberMachine getInstance(){
6 return instance;
7 }
8
9 private NumberManager commonManager = new NumberManager();
10 private NumberManager expressManager = new NumberManager();
11 private NumberManager vipManager = new NumberManager();
12 public NumberManager getCommonManager() {
13 return commonManager;
14 }
15 public NumberManager getExpressManager() {
16 return expressManager;
17 }
18 public NumberManager getVipManager() {
19 return vipManager;
20 }
21
22 }
定义服务窗口的类
1 public class ServiceWindow {
2 //顾客类型 因为这里顾客类型只有三种 因此设置为泛型
3 private CustomerType type = CustomerType.COMMON;
4 //服务窗口编号
5 private int number = 1;
6 //获取顾客类型的方法
7 public CustomerType getType() {
8 return type;
9 }
10 //设置顾客类型的方法
11 public void setType(CustomerType type) {
12 this.type = type;
13 }
14 //设置服务窗口的方法
15 public void setNumber(int number){
16 this.number = number;
17 }
18 //窗口工作的方法
19 public void start(){
20 Executors.newSingleThreadExecutor().execute(
21 new Runnable(){
22 public void run(){
23 while(true){
24 switch(type){
25 case COMMON:
26 commonService();
27 break;
28 case EXPRESS:
29 expressService();
30 break;
31 case VIP:
32 vipService();
33 break;
34 }
35 }
36 }
37 }
38 );
39 }
40
41 private void commonService(){
42 String windowName = "第" + number + "号" + type + "窗口";
43 System.out.println(windowName + "开始获取普通任务!");
44 //通过取号获得服务号码
45 Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();
46 if(serviceNumber != null ){
47 System.out.println(windowName + "开始为第" + serviceNumber + "号普通客户服务");
48 int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
49 //设置服务时间 服务时间为最大值和最小值之间的随机值
50 int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;
51 try {
52 Thread.sleep(serviceTime);
53 } catch (InterruptedException e) {
54 e.printStackTrace();
55 }
56 System.out.println(windowName + "完成为第" + serviceNumber + "号普通客户服务,总共耗时" + serviceTime/1000 + "秒");
57 }else{
58 //如果没有任务休息一秒
59 System.out.println(windowName + "没有取到普通任务,正在空闲一秒");
60 try {
61 Thread.sleep(1000);
62 } catch (InterruptedException e) {
63 e.printStackTrace();
64 }
65 }
66 }
67
68 private void expressService(){
69 Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();
70 String windowName = "第" + number + "号" + type + "窗口";
71 System.out.println(windowName + "开始获取快速任务!");
72 if(serviceNumber !=null){
73 System.out.println(windowName + "开始为第" + serviceNumber + "号快速客户服务");
74 int serviceTime = Constants.MIN_SERVICE_TIME;
75 try {
76 Thread.sleep(serviceTime);
77 } catch (InterruptedException e) {
78 e.printStackTrace();
79 }
80 System.out.println(windowName + "完成为第" + serviceNumber + "号快速客户服务,总共耗时" + serviceTime/1000 + "秒");
81 }else{
82 //如果没有任务为普通用户服务
83 System.out.println(windowName + "没有取到快速任务!");
84 commonService();
85 }
86 }
87
88 private void vipService(){
89
90 Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();
91 String windowName = "第" + number + "号" + type + "窗口";
92 System.out.println(windowName + "开始获取VIP任务!");
93 if(serviceNumber !=null){
94 System.out.println(windowName + "开始为第" + serviceNumber + "号VIP客户服务");
95 int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
96 int serviceTime = new Random().nextInt(maxRandom)+1 + Constants.MIN_SERVICE_TIME;
97 try {
98 Thread.sleep(serviceTime);
99 } catch (InterruptedException e) {
100 e.printStackTrace();
101 }
102 System.out.println(windowName + "完成为第" + serviceNumber + "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒");
103 }else{
104 System.out.println(windowName + "没有取到VIP任务!");
105 commonService();
106 }
107 }
108 }
以上只是核心代码,其他代码没有罗列出来。
这个面试题应用到了集合,多线程,面向对象,枚举等知识。比较全面。更需要牢固的Java基础,因此,在后期学习Android的过程一定要及时的回顾Java基础知识。才能在Android学习中游刃有余。
---------------------- android培训、java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima
来源:https://www.cnblogs.com/malinkang1989/archive/2012/06/25/2562691.html