您的位置:首页 > 编程语言 > Java开发

Java -- 银行业务调度系统案例总结

2012-09-16 09:58 323 查看
            ------- android培训 java培训 期待与您交流! ----------

案例分析 :
1. 要实现该系统功能,首先我们必须对银行的调度服务比较熟悉。窗口的服务是按照客户的号码依次进行的,而客户的号码是由银行的一个取号机器产生的。
由于该系统涉及三类客户(普通客户,快速客户,VIP客户),而且每类客户的号码编排都是完全独立的。所以系统中应该要有三个号码管理器,来各自负责
自己相应的客户的号码。而这三类号码管理器应该由取号机器统一管理,所以这个取号机器应该只有一个,要设计成单例模式。

2. 窗口的服务。每个类型的服务窗口都是根据相应的号码管理器产生的号码依次叫号进行服务的。

3. 号码管理器(NumberManager类),它的功能应该有:①存储产生的号码队列 ②获取新号码 ③获取当前要服务的号码

4. 取号机器(NumberMachine类),它的功能应该有:①首先它应该被设计成单例模式 ②它应该提供三个号码管理器(分别为普通,快速,VIP客户提供)

5. 服务窗口,它的功能应该有:①叫取相应服务窗口的号 ②对外提供相应的服务(普通服务、快速服务、VIP服务)

代码分析 :

(省略包名)

  1. 号码管理器

    public class NumManager
    {
       private int lastNumber = 1;
      

      // 模拟客户队列
       private List<Integer> queueNumber = new ArrayList<Integer>();

       public synchronized Integer creteNumber()
      {
         queueNumber.add(lastNumber);

         return lastNumber++;
      }

       public synchronized Integer getNumber()
      {
         Integer number = null;

         if(queueNumber.size() > 0)
           number = queueNumber.remove(0);

         return number;
      }
    }

  2. 取号机器

    public class NumMachine
    {

      // 由于该取号机器在系统中只有一个,所以设计成单例
       private NumMachine(){}

      private static NumMachine instance = new NumMachine();

       public static NumMachine getInstance()
      {
         return instance;
      }
      

      // 取号机器中要管理三个号码管理器
      private NumManager comManager = new NumManager();
      private NumManager expManager = new NumManager();
      private NumManager vipManager = new NumManager();

      public NumManager getComManager()
      {
        return comManager;
      }

      public NumManager getExpManager()
       {
        return expManager;
       }

       public NumManager getVipManager()
      {
         return vipManager;
      }
    }

  3. 服务窗口   

    public class ServiceWindow
    {
       private CustomerType type = CustomerType.COMMON;
       private int windowId = 1;

       public void setType(CustomerType type) {
         this.type = type;
      }

       public void setWindowId(int windowId) {
         this.windowId = windowId;
      }

       public void start()
      {
         // JDK1.5 新的建立线程的方法
         Executors.newSingleThreadExecutor().execute(new Runnable()
        {
           public void run()
          {
             while(true)
            {
               switch(type)
               {
                 case COMMON:
                   commonService();
                  break;

                 case EXPRESS:
                   expressService();
                   break;

                 case VIP:
                   vipService();
                   break;
              }
             }
           }
         });
      }
      

      // 普通客户服务
      private void commonService() {
        String windowName = "第"+windowId+"号 "+type+"窗口";
        System.out.println(windowName+"正在获取任务");
         Integer number = NumMachine.getInstance().getComManager().getNumber();
         if(number != null)
         {
           System.out.println(windowName+"为第"+number+"号普通客户服务");

           long beginTime = System.currentTimeMillis();

          // 模拟服务的时间
           int serviceRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
           long sericeTime = new Random().nextInt(serviceRand)+1+Constants.MIN_SERVICE_TIME;

           try {
           Thread.sleep(sericeTime);
           } catch (InterruptedException e) {
          e.printStackTrace();
           }

           long costTime = System.currentTimeMillis() - beginTime;

           System.out.println(windowName+"为第"+number+"个普通客户服务,耗时"+costTime/1000+"秒");
        }
         else
         {
           System.out.println(windowName+"没有取到号码,空闲一秒");
           try {
           Thread.sleep(1000);
          } catch (InterruptedException e) {
           e.printStackTrace();
         }
       }
    }
  

    // 快速客户服务
    private void expressService() {
       String windowName = "第"+windowId+"号 "+type+"窗口";
       Integer number = NumMachine.getInstance().getExpManager().getNumber();
      System.out.println(windowName+"正在获取任务");
       if(number != null)
      {
         System.out.println(windowName+"为第"+number+"个客户服务");

         long beginTime = System.currentTimeMillis();

         try {
         Thread.sleep(Constants.MIN_SERVICE_TIME);
         } catch (InterruptedException e) {
         e.printStackTrace();
          }

       long costTime = System.currentTimeMillis() - beginTime;

       System.out.println(windowName+"为第"+number+"个客户服务,耗时"+costTime/1000+"秒");
     }
    else
    {
      System.out.println(windowName+"没有取到号码,空闲一秒");
       commonService(); // 当快速窗口没有取到任务时就为普通窗口客户服务
       try {
       Thread.sleep(1000);
      } catch (InterruptedException e) {
       e.printStackTrace();
       }
     }
   }

  // VIP客户服务
  vate void vipService() {
     String windowName = "第"+windowId+"号 "+type+"窗口";
     Integer number = NumMachine.getInstance().getVipManager().getNumber();
     System.out.println(windowName+"正在获取任务");
    if(number != null)
    {
       System.out.println(windowName+"为第"+number+"个客户服务");

      long beginTime = System.currentTimeMillis();

      // 模拟服务的时间
       int serviceRand = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME;
       long sericeTime = new Random().nextInt(serviceRand)+1+Constants.MIN_SERVICE_TIME;

       try {
      Thread.sleep(sericeTime);
       } catch (InterruptedException e) {
       e.printStackTrace();
       }

       long costTime = System.currentTimeMillis() - beginTime;

       System.out.println(windowName+"为第"+number+"个客户服务,耗时"+costTime/1000+"秒");
     }
    else
     {
      System.out.println(windowName+"没有取到号码,空闲一秒");
       commonService(); // 当VIP窗口没有取到任务时就为普通窗口客户服务
       try {
       Thread.sleep(1000);
       } catch (InterruptedException e) {
       e.printStackTrace();
       }
     }
   }
  }

  4. 客户类型

  public enum CustomerType
  {
     COMMON,EXPRESS,VIP;

     public String toString()
    {
       String name = null;

      switch(this)
      {
         case COMMON: name = "普通";
        break;

        case EXPRESS: name = "快速";
         break;

         case VIP: name = name(); // 枚举中的自有方法,返回自己当前的名字
         break;
       }

       return name;
    }
  }

  5. 所需时间

  public class Constants
  {
     public static int MAX_SERVICE_TIME = 10000; // 最大耗时10秒
     public static int MIN_SERVICE_TIME = 1000; // 最小耗时1秒

     /*每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来
     * 平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以,
     * 1秒钟产生一个普通客户比较合理,*/
     public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;
  }

  6. 主类

  public class MainClass
  {
    public static void main(String[] args)
    {

       // 模拟普通窗口
       for(int i=1; i<5; i++)
      {
        ServiceWindow commWindow = new ServiceWindow();

         commWindow.setWindowId(i);

        commWindow.start();
      }

       // 模拟快速窗口
       ServiceWindow expressWindow = new ServiceWindow();
       expressWindow.setType(CustomerType.EXPRESS);
      expressWindow.start();

       // 模拟VIP窗口
        ServiceWindow vipWindow = new ServiceWindow();
       vipWindow.setType(CustomerType.VIP);
      vipWindow.start();

       // 模拟普通客户
      Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
        new Runnable()
        {
           public void run()
          {
             Integer number = NumMachine.getInstance().getComManager().creteNumber();
             System.out.println(number+"号普通客户正在等待服务");
           }
        },
         0,
        Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6,
         TimeUnit.SECONDS
      );

        // 模拟快速客户
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
         new Runnable()
        {
           public void run()
           {
             Integer number = NumMachine.getInstance().getExpManager().creteNumber();
             System.out.println(number+"号快速客户正在等待服务");
          }
         },
         0,
         Constants.COMMON_CUSTOMER_INTERVAL_TIME * 3,
         TimeUnit.SECONDS
        );
      

        // 模拟VIP客户
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
        new Runnable()
        {
          public void run()
           {
             Integer number = NumMachine.getInstance().getVipManager().creteNumber();
             System.out.println(number+"号VIP客户正在等待服务");
          }
         },
         0,
         Constants.COMMON_CUSTOMER_INTERVAL_TIME,
        TimeUnit.SECONDS
       );
       }
    }

            ------- android培训 java培训 期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: