A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

第一个类:号码枚举类
  1. import java.util.*;
  2. /**
  3. * 因为取号程序只有3个,所以设置为枚举对象
  4. *  
  5. * 取号程序应该有以下方法:
  6. * 1、产生号码的方法(客户拿号)
  7. * 2、获取号码的方法(窗口拿号)
  8. * 3、判断是否还有号码在排除
  9. *
  10. * @author Administrator
  11. *
  12. */
  13. public enum NumberManager {
  14.         VIP, COMMON, EXPRESS; // 三个取号程序
  15.         private List<Integer> numberList = new ArrayList<Integer>();// 用来保存生产的号码列表
  16.         private int number;
  17.         private static final int generateTime = 5;// 生成普通号码的时间的最大值

  18.         private NumberManager() {// 启动一个线程用来不停地生产号码
  19.                 new Thread(new Runnable() {
  20.                         public void run() {
  21.                                 generateNumber();
  22.                         }
  23.                 }).start();
  24.         }
  25. //------------------------1、产生号码的方法(客户拿号)---------------------------------------
  26.         public void generateNumber() {        
  27.                 for (int i = 1; i < 501; i++) {// 假设每天只有500张排队号码纸                                               
  28.                         if (name().equals("COMMON")) // 如果是普通用户则1秒产生一个
  29.                                 try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}               
  30.                         else if (name().equals("EXPRESS"))// 如果是快速用户则2~10秒产生一个
  31.                                 try {Thread.sleep((new Random().nextInt(generateTime) + 1)*1000*2);} catch (Exception e) {        e.printStackTrace();}
  32.                         else     // 如果是VIP用户则6~30秒产生一个
  33.                                 try {Thread.sleep((new Random().nextInt(generateTime) + 1)*1000*6);} catch (Exception e) {        e.printStackTrace();}                       
  34.                         synchronized (COMMON) {                       
  35.                                 numberList.add(++number);
  36.                                 System.out.println(this + "客户  " + number + "号----------->正在等服务");
  37.                         }
  38.                 }
  39.         }

  40. //------------------------2、获取号码的方法(窗口拿号)---------------------------------------       
  41.         public int getNumber() {
  42.                 return ((Integer) numberList.remove(0)).intValue();//拿到号码,并把号码从排除列表中移除
  43.         }
  44. //------------------------3、判断是否还有号码在排除-------------------------------------------
  45.         public boolean hasNumber() {
  46.                 return !numberList.isEmpty();
  47.         }
  48.                
  49. //------------------------重写toString方法---------------------------------------------------       
  50.         public String toString(){
  51.                 if(name().equals("COMMON"))
  52.                         return "普通";
  53.                 else if(name().equals("EXPRESS"))
  54.                         return "快速";
  55.                 else
  56.                         return "VIP";               
  57.         }
  58. }
复制代码
第一个类:业务窗口类
  1. import java.util.Random;
  2. import java.util.concurrent.*;

  3. /**
  4. * 办理业务窗口应该有的方法:
  5. *  1、判断自己是否在为客户办理业务
  6. *  2、判断4个普通窗口是否同时都在为客户办理业务
  7. *  3、去问号码管理器取号,并为对应号码的客户办理业务
  8. *  4、因为普通窗口有4个,它们处理的都是同样的数据(普通号码)所以,普通窗口取号的代码要进行同步处理
  9. *  5、因为6个窗口都有处理普通号码的功能,所以可以把处理普通号码的代码单独写成一个方法,以便复用
  10. * @author Administrator
  11. *
  12. */
  13. public enum ServiceWindows {

  14.         COMMON1, COMMON2, COMMON3, COMMON4, EXPRESS, VIP;//6个办理业务窗口
  15.         private boolean ServiceState;// 指示当前窗口是否在为客户办理业务的状态

  16.         private ServiceWindows() {        
  17.                 ExecutorService pool = Executors.newSingleThreadExecutor();               
  18.                 pool.execute(new Runnable(){  //启动一个线程,给拿到号的顾客办理业务       
  19.                         public void run(){
  20.                                 while(true){
  21.                                         getNumber();
  22.                         }}});
  23.         }
  24. //----------------------1、判断自己是否在为客户办理业务 --------------------------------
  25.         public boolean isServing(){
  26.                 return ServiceState;
  27.         }
  28. //----------------------2、判断4个普通窗口是否同时都在为客户办理业务-------------------------
  29.         public boolean isCommonsServing() {
  30.                 return COMMON1.isServing()&&COMMON2.isServing()&&COMMON3.isServing()&&COMMON4.isServing();
  31.         }
  32. //-------------------3、办理业务的动作--------------------------------------------------
  33.         public void serving(NumberManager numManager,int num,int randomTime){
  34.                 System.out.println(this+"窗口正在为"+numManager+"客户  "+num+"号  办理业务" );                                       
  35.                 long startTime = System.currentTimeMillis();
  36.                 try{Thread.sleep((new Random().nextInt(randomTime)+1)*1000);}catch(Exception e){e.printStackTrace();}
  37.                 long usedTime = (System.currentTimeMillis()-startTime)/1000;
  38.                 System.out.println(this+"窗口已为"+numManager+"客户  "+num+"号  办理完业务,用时"+usedTime+"秒");
  39.                 ServiceState = false;//服务状态为假
  40.         }
  41. //-------------------4、        为普通客户服务的方法        -------------------------------------------
  42.         public void serveForCommon(){
  43.                 int num = 0;
  44.                 NumberManager numManager = null;
  45.                 synchronized(NumberManager.COMMON){   
  46.                         numManager = NumberManager.COMMON;//获取普通号码管理器
  47.                         if(numManager.hasNumber()){        //--------------------------->必须同步的代码
  48.                                 num = numManager.getNumber();//向号码管理器取号------->必须同步的代码
  49.                                 ServiceState = true;//服务状态为正真
  50.                         }
  51.                 }
  52.                 if(ServiceState){
  53.                         serving(numManager, num, 10);//参数10指定服务时间为1~10秒
  54.                 }else {                                       
  55.                         System.out.println(this+"窗口空闲中");
  56.                         try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}//如果没人排除则休息1秒再去看有没有人排队
  57.                 }               
  58.         }
  59. //----------------------5、去问号码管理器取号,并为对应号码的客户办理业务-------------------
  60.         public void getNumber() {
  61.                 long startTime = 0;
  62.                 long usedTime = 0;         //如果窗口为4个普通窗口的任意一个,则他们取的号码都是普通号码
  63.                 if(name().equals("COMMON1")||name().equals("COMMON2")||name().equals("COMMON3")||name().equals("COMMON4")) {
  64.                                 serveForCommon();                       
  65.                 }else if(name().equals("EXPRESS")){ //如果窗口是快速窗口
  66.                                 NumberManager numManager = NumberManager.EXPRESS;        //获取快速号码管理器               
  67.                                 if(numManager.hasNumber()){       
  68.                                                 int num = numManager.getNumber();//取号
  69.                                                 serving(numManager, num, 1);//参数10指定服务时间为1秒
  70.                                 }else {                //如果没有快速客户
  71.                                                 if(isCommonsServing())//如果普通窗口都在忙,则帮忙处理普通客户
  72.                                                         serveForCommon();
  73.                                                 else {                                       
  74.                                                         System.out.println(this+"窗口空闲中");
  75.                                                         try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}//如果没人排除则休息1秒再去看有没有人排队
  76.                                                 }                                                       
  77.                                 }                       
  78.                 }else{   //如果窗口是VIP窗口
  79.                         NumberManager numManager = NumberManager.VIP;        //获取VIP号码管理器               
  80.                         if(numManager.hasNumber()){       
  81.                                         int num = numManager.getNumber();  //取号
  82.                                         serving(numManager, num, 10);//参数10指定服务时间为1~10秒
  83.                         }else {                //如果没有VIP客户                       
  84.                                 if(isCommonsServing())//如果普通窗口都在忙,则帮忙处理普通客户
  85.                                         serveForCommon();
  86.                                 else {                                       
  87.                                         System.out.println(this+"窗口空闲中");
  88.                                         try{Thread.sleep(1000);}catch(Exception e){e.printStackTrace();}//如果没人排除则休息1秒再去看有没有人排队
  89.                                 }
  90.                         }
  91.                 }
  92.         }
  93. //---------------------重写toString---------------------------------------------------------       
  94.         public String toString(){
  95.                 if(name().equals("VIP"))
  96.                         return "VIP";
  97.                 else if(name().equals("EXPRESS"))
  98.                         return "快速";
  99.                 else if(name().equals("COMMON1"))
  100.                         return "普通1号";               
  101.                 else if(name().equals("COMMON2"))
  102.                         return "普通2号";       
  103.                 else if(name().equals("COMMON3"))
  104.                         return "普通3号";
  105.                         return "普通4号";       
  106.         }

  107. }
复制代码
第三个类:测试类
  1. public class MainClass {       
  2.         public static void main(String[] args) {
  3.                 NumberManager num = NumberManager.COMMON;
  4.                 ServiceWindows window = ServiceWindows.COMMON1;
  5.         }
  6. }
复制代码

4 个回复

倒序浏览
本帖最后由 戴振良 于 2012-5-3 10:59 编辑

做交通灯项目的时候我是看了一遍视频就做出来了,那道题看了视频后觉得好简单,张老师说灯有12盏,用枚举,我自己做的时候我就在想,路也是就固定的12条呀,老师为什么不用枚举呢,于是我用了,嘿,果然更方便了,代码更少了,我做成功了。(代码见我的博客:戴振良的博客 :http://blog.csdn.net/dai_zhenliang/)而后是银行项目系统,这个也是听了一遍,听的希里糊涂的,跟不上老师的思路,而且里面用到了好多个类,有6个类,那时候看完做这个项目做不出来,边做边看源代码也弄出了多问题后才做出来。

    在黑马宣布第9期招满人那一天,我刚刚走完所有的流程,下午3点20接受完电话考核。那时我就一直带着手机,可是没有接到通知结果的电话,下午6点多,吃晚饭了,以为结果通知可能会过几天才来的,于是没带手机,让床上就去吃晚饭了,偏偏那时不在手机电话就来了,没接到,搞的刚刚好遇上5。1节,只有心急着等待3天了。
    话说入学考试,我的入学试题都是高新技术部分的,不是很难,我都做出来了,电话考核也大部分是高新技术部分的问题,也都不是很难,而其中有一道题叫我说说我做项目时的思路是怎样的,我不知道怎么回答,我只说先分析项目需求,然后按项目要求去做……后来就不知道怎么说了,我就说,“反正我能做的出来”。答案我自己都不满意,电话结束后我就思考了,我做项目的思路是什么,我也不太懂,于是我就去分析银行系统项目的思路了:
    其实需求,.doc文档说的也很清楚了,我把我理解过的再写一下:
    1、先看项目需求,分析需求
    2、有两个类:窗口类、取号机器类   (为什么我不要人这个类,因为号码产生一个,我就当来了一个人)
    3、取号类:我时刻记着张老师说的谁拥有数据,谁就对外提供操作这些数据的方法,于是:            
           * 取号程序应该有以下方法:
           * 1、产生号码的方法(客户拿号)
           * 2、获取号码的方法(窗口拿号)
           * 3、判断是否还有号码在排除
    4、窗口类
           * 办理业务窗口应该有的方法:
           *  1、判断自己是否在为客户办理业务
           *  2、去问号码管理器取号,并为对应号码的客户办理业务
    5、跟根上面两个类与业务需求动手敲代码
其中比较重要的一点是,6个窗口都可以处理普通号码,所以处理普通号码的代码一定得同步安全。
我就是按着上面的分析去写那两个类的,没再看过视频,也没看老师的源代码,埋头写啊写,3个多小时我就完成了,这时突然一看,嘿,只有两个类!(除了测试类),我测试了好几次感觉没有什么错,像张老师说的一样,我也很有种“7K到手了”的感觉!
以上5点就是我的思路了,我不知道这样的思路是不是正确的,请老师们指点,请黑马论坛里的大哥大姐们指点!

最后严重声明:我标题说代码比张老师的少,这是错误的,我这只是为了吸引点人气(手断手断),我的代码跟张老师的是没法比的,张老师的代码是很严谨的,思路也不会乱、很清楚,而且我的代码很多是受了张老师的代码影响的,我埋头忽忽的敲出来的,肯定有很多不对的地方,我之所以写出来,是为了想让大家给我指指点点,或者把代码copy一下,帮我测试测试看是不是达到了项目的需求,我在此谢过大家了!! {:soso__11583929490347734097_3:}
回复 使用道具 举报
再占个藤椅,由于字数超过了规定,所以分两断来发了
回复 使用道具 举报
连琛琛 发表于 2012-5-7 08:41
有这种想法非常不错,向你学习!

是我要向你学习才对!
回复 使用道具 举报
哥们,第九期,你来了没有呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马