---------------------- android培训、java培训、期待与您交流! ----------------------
生活实情: 不同的客户去银行取号机取号办理业务,银行有相应的服务窗口进行叫号服务。
用面向对象分析:
不同的客户且客户类型固定为普通客户、快速客户、vip客户,因此需要一个客户类(CustomerType)并将它设计为枚举。号码的生成需要一个号码管理器,它不仅为看客户提供号码还为窗口提供叫号,因此需要一个号码管理类(NumberManager),它应该有建号和提供叫号的2个方法,且操作的是同一个数据,用synchronized将2个方法互斥号码有了需要一个提供号码的机器(NumberMachine),不同的客户都来拿号,因此它要建相应客户类型的号码管理类,且只能有一台提供号码,因此该类构造私有化,采用单例模式。这时还需要窗口服务(ServiceWindow),它为不同的客户提供相应的服务因此它根据客户类型来创建窗口并提供相应的服务commonService()、expressService()、vipService()。最后 一个主控制类(MainClass)它控制客户的创建,还有窗口服务的开始,这样一个银行系统所需要的java类就都有了。
总结: 面向对象开发,对象有什么属性就提供属性相应的方法,人在黑板画圆,是谁画的圆?圆的建立需要2个属性圆心和半径,这2个属性是圆 自己的属性,因此是圆画了自己(圆类提供画圆方法)。
以下是MainClass类
package com.itcast.bank; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MainClass { public static void main(String[] args) { //创建4个普通窗口 for(int i=1;i<5;i++){ ServiceWindow commonWindow = new ServiceWindow(); commonWindow.setWindowId(i); commonWindow.start(); } //创建1个快速窗口 ServiceWindow expressWindow = new ServiceWindow(); expressWindow.setType(CustomerType.EXPRESS); expressWindow.start(); //创建1个vip窗口 ServiceWindow vipWindow = new ServiceWindow(); vipWindow.setType(CustomerType.VIP); vipWindow.start(); //普通客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer number = NumberMachine.getInstance().getCommonManager().generateNewNumber(); System.out.println("第"+number+"号普通客户正在等待服务!"); } }, 0, Constants.CUSTOMER_INTERVIEW_TIME, TimeUnit.SECONDS ); //快速客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer number = NumberMachine.getInstance().getExpressManager().generateNewNumber(); System.out.println("第"+number+"号快速客户正在等待服务!"); } }, 0, Constants.CUSTOMER_INTERVIEW_TIME*2, TimeUnit.SECONDS ); //vip客户 Executors.newScheduledThreadPool(1).scheduleAtFixedRate( new Runnable(){ public void run(){ Integer number = NumberMachine.getInstance().getVipManager().generateNewNumber(); System.out.println("第"+number+"号vip客户正在等待服务!"); } }, 0, Constants.CUSTOMER_INTERVIEW_TIME*6, TimeUnit.SECONDS ); } }
package com.itcast.bank; public enum CustomerType { COMMON,EXPRESS,VIP; public String toString(){//重写toString方法,为了软编码打印相应的内容 switch (this) { case COMMON: return "普通"; case EXPRESS: return "快速"; case VIP: return name(); } return null; } }
package com.itcast.bank; public class NumberMachine { private NumberManager commonManager = new NumberManager(); private NumberManager expressManager = new NumberManager(); private NumberManager vipManager = new NumberManager(); private static NumberMachine instance= new NumberMachine();//专为单例模式,提供的静态成员变量 public NumberManager getCommonManager() { return commonManager; } public NumberManager getExpressManager() { return expressManager; } public NumberManager getVipManager() { return vipManager; } private NumberMachine(){};//构造方法私有化,单例模式 public static NumberMachine getInstance(){//创建静态方法,为外部提供实例(单例模式) return instance; } }
package com.itcast.bank; import java.util.ArrayList; import java.util.List; public class NumberManager { private int lastNumber = 1;//服务号码从1开始 private List <Integer> queueNumber = new ArrayList <Integer>();//面向接口编程,用List定义更灵活 public synchronized Integer generateNewNumber(){//创建服务号码(线程涉及同一个成员变量,使用synchronized 互斥) queueNumber.add(lastNumber); return lastNumber++; } public synchronized Integer fetchServiceNumber(){//为窗口提供服务号码(线程涉及同一个成员变量,使用synchronized 互斥) Integer number = null; if(queueNumber.size()>0){ number =(Integer) queueNumber.remove(0); } return number; } }
package com.itcast.bank; import java.util.Random; import java.util.concurrent.Executors; public class ServiceWindow { private CustomerType type = CustomerType.COMMON; private int windowId = 1; /** * <p>type のセッターメソッドです.</p> * * @param type type に設定する. */ public void setType(CustomerType type) { this.type = type; } /** * <p>windowId のセッターメソッドです.</p> * * @param windowId windowId に設定する. */ 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; } } } }); } //为普通用户服务方法 private void commonService() { String windowName = "第"+windowId+"号"+type+"窗口"; System.out.println(windowName+"正在获取普通任务"); Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber(); if(number != null){ System.out.println(windowName + "开始为第" + number + "号普通客户服务"); int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; int serviceTime = new Random().nextInt(maxRandom) + 1 + Constants.MIN_SERVICE_TIME; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(windowName+"完成为第"+number+"个"+type+"客户服务,耗时:"+serviceTime/1000+"秒"); }else { System.out.println(windowName+"没有取得任务,正空闲一秒"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } //为快速客户服务方法 private void expressService() { String windowName = "第"+windowId+"号"+type+"窗口"; Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber(); System.out.println(windowName+"正在获取快速任务"); if(number != null){ System.out.println(windowName + "开始为第" + number + "号快速客户服务"); // int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; // long serviceTime = new Random().nextInt(maxRandom) + 1 + Constants.MIN_SERVICE_TIME; try { Thread.sleep(Constants.MIN_SERVICE_TIME); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(windowName+"完成为第"+number+"个"+type+"客户服务,耗时:"+Constants.MIN_SERVICE_TIME/1000+"秒"); }else { System.out.println(windowName+"没有取得快速任务"); commonService(); } } //为VIP客户服务方法 private void vipService() { String windowName = "第"+windowId+"号"+type+"窗口"; Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber(); System.out.println(windowName+"正在获取VIP任务"); if(number != null){ System.out.println(windowName + "开始为第" + number + "号VIP客户服务"); int maxRandom = Constants.MAX_SERVICE_TIME - Constants.MIN_SERVICE_TIME; long serviceTime = new Random().nextInt(maxRandom) + 1 + Constants.MIN_SERVICE_TIME; try { Thread.sleep(serviceTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(windowName+"完成为第"+number+"个"+type+"客户服务,耗时:"+serviceTime/1000+"秒"); }else { System.out.println(windowName+"没有取得VIP任务"); commonService(); } } }
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima