黑马程序员-java-银行业务调度系统

---------------------- android培训、 java培训、期待与您交流! ----------------------
 该项目模拟银行业务调度系统,听过张老师的分析后,有了思路,就好理解了。
银行分为普通窗口,快速窗口,VIP窗口,业务窗口办理业务是根据号码机器里面的
号来办的,所以有没有人来办业务,业务窗口服务看号码机器里面有没有号来判断。

号码机器里面又包含了3个产生号码的箱子,普通箱产生普通服务号,
快速箱产生快速服务号,VIP箱产生VIP服务号。
所以项目中就出现了3个类:
NumberManager类,用来产生号码:提供generateNewManager()和fetchServiceNumber()方法
分别用来在箱子里产生号码和取号码。

NumberMachine类,用来管理3个号码箱子,因为只有3个号码箱子为3个类型的窗口服务,
所以NumberMachine类要采用单例的模式实现,并且提供取3种箱子的方法。
public class NumberMachine
{
 private  static NumberMachine instance = new NumberMachine();
 private NumberManager commonManager = new NumberManager();
 private NumberManager expressManager = new NumberManager();
 private NumberManager vipManager = new NumberManager();
    public NumberManager getCommonManager()
 {
  return commonManager;
 }
    public NumberManager getExpressManager()
 {
  return expressManager;
 }
    public NumberManager getVipManager()
 {
  return vipManager;
 }
 private NumberMachine()
 {
  
 }
 public static NumberMachine getInstance()
 {
  return instance;
 }
}

ServiceWindow服务窗口类,因为只有3种类型的窗口,所以要写个CustomerType枚举类,
用来表示3种服务窗口的类型:
public enum CustomerType
{
  COMMON,EXPRESS,VIP;
  public String toString()
  {
   switch(this)
   {
   case COMMON: return "普通";
   case EXPRESS: return "快速";
   case VIP: return name();
   }
   return null;
  }
}

服务窗口类里面有setType和setWindowId两个方法用来设置本窗口的类型和窗口号。
用start方法启动线程池来启动窗口服务,根据服务类型的不同做相应的处理,
普通服务窗口从普通箱子里取号码,快速窗口从快速箱子里取号码,VIP窗口从VIP箱子里取号码。
快速窗口和VIP窗口完成自己的服务后,看普通箱子里有没有业务了,有还完成普通箱子里的业务。
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()
 {
  Executors.newSingleThreadExecutor().execute(new Runnable()
  {

   public void run()
   {
    while (true)
    {
     switch (type)
     {
     case COMMON:
      commonService();
      break;
     case EXPRESS:
      expressService();
      break;
     case VIP:
      vipService();
      break;
     default:
      break;
          }
    }
   }
  }); 
}
看类图:


主程序产生6个服务窗口和3个线程,模拟3个号码箱产生普通,快速,VIP三种类型的服务号码。
public static void main(String[] args)
 {
  for(int i=1; i<5; i++)
  {
   ServiceWindow commonwindow = new ServiceWindow();
   commonwindow.setWindowId(i);
   commonwindow.start();
  }
        ServiceWindow expresswindow = new ServiceWindow();
  expresswindow.setType(CustomerType.EXPRESS);
  expresswindow.start();
  
  ServiceWindow vipwindow = new ServiceWindow();
  vipwindow.setType(CustomerType.VIP);
  vipwindow.start();
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    new Runnable()
    {
     public void run()
     {
    Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager();
    System.out.println(number+"号-普通客户等待服务");
     }},
    0,
    1,
    TimeUnit.SECONDS);
  
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    new Runnable()
    {
     public void run()
     {
      Integer number = NumberMachine.getInstance().getExpressManager().generateNewManager();
      System.out.println(number+"号-快速客户等待服务");
     }},
    0,
    2,
    TimeUnit.SECONDS);
  Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
    new Runnable()
    {
     public void run()
     {
      Integer number = NumberMachine.getInstance().getVipManager().generateNewManager();
      System.out.println(number+"号-VIP客户等待服务");
     }},
    0,
    6,
    TimeUnit.SECONDS);
  }

运行程序:银行开始营业拉0-0
1号-普通客户等待服务
1号-快速客户等待服务
1号-VIP客户等待服务
第2号普通窗口正在获取任务
第2号普通窗口为第1个普通客户服务
第1号普通窗口正在获取任务
第1号普通窗口没有取到任务,休息1秒钟
第3号普通窗口正在获取任务
第3号普通窗口没有取到任务,休息1秒钟
第1号VIP窗口正在获取任务
第1号VIP窗口为第1个VIP客户服务
第4号普通窗口正在获取任务
第1号快速窗口正在获取任务
第4号普通窗口没有取到任务,休息1秒钟
第1号快速窗口为第1个快速客户服务
………………………………………………………………
………………………………………………………………

---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima

你可能感兴趣的:(黑马程序员-java-银行业务调度系统)