黑马程序员技术交流社区

标题: 我的银行业务系统,希望有大牛帮忙分析分析! [打印本页]

作者: osully    时间: 2014-3-29 17:29
标题: 我的银行业务系统,希望有大牛帮忙分析分析!
本帖最后由 osully 于 2014-4-2 13:58 编辑

如下,还请大牛帮看看......上次的交通灯也没个人帮忙看看....哎...

  1. package YinHangDemo;

  2. import java.util.LinkedList;

  3. public enum CustomerType {
  4.         //三种客户
  5.         VIP, General, Fast;
  6.                
  7.         private int lastNumber = 1;
  8.         
  9.         //增删Linked集合比较优秀啊
  10.         LinkedList<Integer> list = new LinkedList<Integer>();

  11.         //来一个人就产生一个号
  12.         public synchronized int produceNumber() {
  13.                 list.addLast(lastNumber++);
  14.                 return lastNumber;
  15.         }

  16.         //有人就服务
  17.         public synchronized Integer sellNumber() {
  18.                 if (list.size() != 0) {
  19.                         return list.removeFirst();
  20.                 }
  21.                 return null;
  22.         }
  23.         
  24.         public String toString(){
  25.                 switch(this){
  26.                 case VIP:
  27.                         return "VIP客户";
  28.                 case General:
  29.                         return "普通客户";
  30.                 case Fast :
  31.                         return "快速客户";                                
  32.                 }
  33.                 return null;
  34.         }
  35. }
复制代码
  1. package YinHangDemo;

  2. public class ServiceWindow implements Runnable {
  3.         //窗口号
  4.         private int windowNumber = 1;
  5.         //客户类型
  6.         private CustomerType type;

  7.         public ServiceWindow(CustomerType type,int windowNumber) {
  8.                 this.windowNumber = windowNumber;
  9.                 this.type = type;
  10.         }

  11.         public void run() {
  12.                 //记录窗口名称
  13.                 String windowName = type + "的" + windowNumber + "号窗口";
  14.                 //获取是否有人需要服务
  15.                 Integer num = type.sellNumber();
  16.                 //获取此类型服务需要的时间
  17.                 int time = TimeSet.getTime(type);
  18.                 while (true) {
  19.                         switch (type) {
  20.                         case VIP:
  21.                                 specialWindow(windowName,num,time);
  22.                                 break;
  23.                         case General:
  24.                                 GeneralWindow(windowName);
  25.                                 break;
  26.                         case Fast:
  27.                                 specialWindow(windowName,num,time);
  28.                                 break;
  29.                         }
  30.                 }
  31.         }

  32.         //因其他窗口调用普通窗口,所以只传入窗口名称
  33.         private void GeneralWindow(String windowName) {
  34.                 //是否有普通的需要服务
  35.                 Integer num = CustomerType.General.sellNumber();
  36.                 //获取普通类型需要服务的时间
  37.                 int time = TimeSet.getTime(CustomerType.General);
  38.                 if (num != null) {
  39.                         System.out.println(windowName + "正在为第" + num + "个普通客户服务");
  40.                         try {
  41.                                 Thread.sleep(time*1000);
  42.                         }
  43.                         catch (InterruptedException e) {
  44.                                 e.printStackTrace();
  45.                         }
  46.                         System.out.println(windowName + "已经完成第" + num + "个普通客户服务,一共花费了"
  47.                                         + time + "秒");
  48.                 }
  49.                 else {
  50.                         System.out.println(windowName + "没有客户需要服务");
  51.                         try {
  52.                                 Thread.sleep(1000);
  53.                         }
  54.                         catch (InterruptedException e) {
  55.                                 e.printStackTrace();
  56.                         }
  57.                 }
  58.         }

  59.         private void specialWindow(String windowName,Integer num,int time) {
  60.                 //如果有特殊人员就为特殊人员服务,没有就调用普通窗口
  61.                 if (num != null) {
  62.                         getService(windowName, num, time);
  63.                 }
  64.                 else {
  65.                         GeneralWindow(windowName);
  66.                 }
  67.         }

  68.         //提供服务
  69.         private void getService(String windowName, Integer num, int time) {
  70.                 System.out.println(windowName + "正在为第" + num + "个"+type+"客户服务");
  71.                 try {
  72.                         Thread.sleep(time*1000);
  73.                 }
  74.                 catch (InterruptedException e) {
  75.                         e.printStackTrace();
  76.                 }
  77.                 System.out.println(windowName + "已经完成第" + num + "个"+type+"客户服务,一共花费了"
  78.                                 + time + "秒");
  79.         }
  80. }
复制代码
  1. package YinHangDemo;

  2. import java.util.Random;

  3. public class TimeSet {
  4.         //服务需要的最大最小时间
  5.         private static int max;
  6.         private static int min;
  7.         
  8.         //客户出现的时间
  9.         private static int time;
  10.         
  11.         public static int getTime() {
  12.                 return time;
  13.         }

  14.         //设置客户出现的时间
  15.         public static void setTime(int time) {
  16.                 TimeSet.time = time;
  17.         }

  18.         public static int getMax() {
  19.                 return max;
  20.         }

  21.         //可以设置最大时间
  22.         public static void setMax(int max) {
  23.                 TimeSet.max = max;
  24.         }

  25.         public static int getMin() {
  26.                 return min;
  27.         }

  28.         //可以设置最小时间
  29.         public static void setMin(int min) {
  30.                 TimeSet.min = min;
  31.         }

  32.         //某个类型客户服务需要的时间
  33.         public static int getTime(CustomerType type) {
  34.                 switch(type){
  35.                 case VIP:
  36.                         return max;
  37.                 case General:
  38.                         int num = new Random().nextInt(max)+min;
  39.                         return num;
  40.                 case Fast:
  41.                         return min;
  42.                 }        
  43.                 return 0;
  44.         }               
  45. }
复制代码
  1. package YinHangDemo;

  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.TimeUnit;

  4. public class MainClass {
  5.         public static void main(String[] args) {
  6.                
  7.                 //设定业务办理时间最大值和最小值
  8.                 TimeSet.setMax(10);
  9.                 TimeSet.setMin(1);
  10.                
  11.                 //设定客户的时间基数
  12.                 TimeSet.setTime(1);

  13.                 //产生VIP客户
  14.                 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
  15.                         public void run() {
  16.                                 CustomerType.VIP.produceNumber();
  17.                         }
  18.                 }, 1, TimeSet.getTime()*6, TimeUnit.SECONDS);
  19.                
  20.                 //产生普通客户
  21.                 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
  22.                         public void run() {
  23.                                 CustomerType.General.produceNumber();
  24.                         }
  25.                 }, 1, TimeSet.getTime()*1, TimeUnit.SECONDS);
  26.                
  27.                 //产生快速客户
  28.                 Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
  29.                         public void run() {
  30.                                 CustomerType.Fast.produceNumber();
  31.                         }
  32.                 }, 1, TimeSet.getTime()*2, TimeUnit.SECONDS);

  33.                
  34.                 //产生4个普通窗口
  35.                 for (int i = 1; i <= 4; i++) {
  36.                         ServiceWindow general = new ServiceWindow(CustomerType.General, i);
  37.                         new Thread(general).start();
  38.                 }

  39.                 //一个VIP窗口
  40.                 ServiceWindow VIP = new ServiceWindow(CustomerType.VIP, 1);
  41.                 new Thread(VIP).start();

  42.                 //一个快速窗口
  43.                 ServiceWindow Fast = new ServiceWindow(CustomerType.Fast, 1);
  44.                 new Thread(Fast).start();
  45.         }
  46. }
复制代码





作者: ノtrack    时间: 2014-3-31 13:00
你真低调...
作者: 凌慕枫    时间: 2014-3-31 13:12
我是过来看大神的……
作者: 黄晓鑫    时间: 2014-3-31 13:36
我就掌握了这张图,代码行云流水,怎么敲都敲的出来。
作者: ノtrack    时间: 2014-3-31 15:10
黄晓鑫 发表于 2014-3-31 13:36
我就掌握了这张图,代码行云流水,怎么敲都敲的出来。

这个不错, 图解思路. 撸的必然一路顺畅,,
作者: jkenny    时间: 2014-4-1 10:00
将produceNumber、sellNumber设计在枚举里面很棒。

问下这里这段代码:
  1.         public void run() {
  2.                 //记录窗口名称
  3.                 String windowName = type + "的" + windowNumber + "号窗口";
  4.                 //获取是否有人需要服务
  5.                 Integer num = type.sellNumber();  //你在这里获取号码,集合里就删除了这个号码
  6.                 //获取此类型服务需要的时间
  7.                 int time = TimeSet.getTime(type);
  8.                 while (true) {   //循环的是这里面的代码块?如果是VIP客户的话它就没有在调用
  9. sellNumber 获取号码了啊?
  10.                         switch (type) {
  11.                         case VIP:
  12.                                 specialWindow(windowName,num,time);   
复制代码

作者: osully    时间: 2014-4-1 10:11
jkenny 发表于 2014-4-1 10:00
将produceNumber、sellNumber设计在枚举里面很棒。

问下这里这段代码:

总算是有兄弟愿意看了!!!感谢,确实被你发现了问题!!!!交个朋友吧 !!!
作者: jkenny    时间: 2014-4-1 10:12
晕,回复里有代码字数限制吗?写了那么多回复出来就变成这点了。。。。

        public void run() {
                //记录窗口名称
                String windowName = type + "的" + windowNumber + "号窗口";
                //获取是否有人需要服务
                Integer num = type.sellNumber();
//在这里获取号码,集合里就删除了这个号码
                //获取此类型服务需要的时间
                int time = TimeSet.getTime(type);
                while (true) {
//循环的是这里面的代码块?如果是VIP客户的话它就没有在调用sellNumber 获取号码了啊?
                        switch (type) {
                        case VIP:
                                specialWindow(windowName,num,time);
     //如果是VIP客户就将上面获取到的号码,拿去处理,处理了之后又回这里继续调用那不就一直在处理同一个客户了吗?
                                break;
                        case General:
                                GeneralWindow(windowName);
//如果是普通客户,那么并没有把上面获取到的号码传递给 GeneralWindow方法,但在 GeneralWindow方法里又在重新 Integer num = CustomerType.General.sellNumber();,那么上面没传入的这个客户不就丢了吗?
                                break;
                        case Fast:
                                specialWindow(windowName,num,time);
                                break;
                        }
                }
        }
作者: osully    时间: 2014-4-1 10:16
jkenny 发表于 2014-4-1 10:12
晕,回复里有代码字数限制吗?写了那么多回复出来就变成这点了。。。。

        public void run() {

优化了如下:
放到specialWindow 方法里面去了

当时只顾着往上抽取,这里确定错了

  1. package YinHangDemo;

  2. public class ServiceWindow implements Runnable {
  3.         //窗口号
  4.         private int windowNumber = 1;
  5.         //客户类型
  6.         private CustomerType type;

  7.         public ServiceWindow(CustomerType type,int windowNumber) {
  8.                 this.windowNumber = windowNumber;
  9.                 this.type = type;
  10.         }

  11.         public void run() {
  12.                 while (true) {
  13.                         //记录窗口名称
  14.                         String windowName = type + "的" + windowNumber + "号窗口";
  15.                         switch (type) {
  16.                         case VIP:
  17.                                 specialWindow(windowName);
  18.                                 break;
  19.                         case General:
  20.                                 GeneralWindow(windowName);
  21.                                 break;
  22.                         case Fast:
  23.                                 specialWindow(windowName);
  24.                                 break;
  25.                         }
  26.                 }
  27.         }

  28.         //因其他窗口调用普通窗口,所以只传入窗口名称
  29.         private void GeneralWindow(String windowName) {
  30.                 //是否有普通的需要服务
  31.                 Integer num = CustomerType.General.sellNumber();
  32.                 //获取普通类型需要服务的时间
  33.                 int time = TimeSet.getTime(CustomerType.General);
  34.                 if (num != null) {
  35.                         System.out.println(windowName + "正在为第" + num + "个普通客户服务");
  36.                         try {
  37.                                 Thread.sleep(time*1000);
  38.                         }
  39.                         catch (InterruptedException e) {
  40.                                 e.printStackTrace();
  41.                         }
  42.                         System.out.println(windowName + "已经完成第" + num + "个普通客户服务,一共花费了"
  43.                                         + time + "秒");
  44.                 }
  45.                 else {
  46.                         System.out.println(windowName + "没有客户需要服务");
  47.                         try {
  48.                                 Thread.sleep(1000);
  49.                         }
  50.                         catch (InterruptedException e) {
  51.                                 e.printStackTrace();
  52.                         }
  53.                 }
  54.         }

  55.         private void specialWindow(String windowName) {
  56.                 //获取是否有人需要服务
  57.                 Integer num = type.sellNumber();
  58.                 //获取此类型服务需要的时间
  59.                 int time = TimeSet.getTime(type);
  60.                 //如果有特殊人员就为特殊人员服务,没有就调用普通窗口
  61.                 if (num != null) {
  62.                         getService(windowName, num, time);
  63.                 }
  64.                 else {
  65.                         GeneralWindow(windowName);
  66.                 }
  67.         }

  68.         //提供服务
  69.         private void getService(String windowName, Integer num, int time) {
  70.                 System.out.println(windowName + "正在为第" + num + "个"+type+"客户服务");
  71.                 try {
  72.                         Thread.sleep(time*1000);
  73.                 }
  74.                 catch (InterruptedException e) {
  75.                         e.printStackTrace();
  76.                 }
  77.                 System.out.println(windowName + "已经完成第" + num + "个"+type+"客户服务,一共花费了"
  78.                                 + time + "秒");
  79.         }
  80. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2