项目分析:
项目中用到的对象:号码、取号机、窗口、顾客的类型。因为项目的侧重点不在“顾客”,所以顾客不作为一个单独的对象,而是和号码对象结合在了一起,号码对象可以产生新号码,则产生的新号码就相当于来了一位顾客。
分析每个对象因该有的属性和方法:
1、号码
号码对象因该有两个方法,首先它因该有产生一个新号码的方法,表示来了一位顾客,其次它因该有一个向窗口提供号码的方法。当然它也必须有自己的属性来记录产生的新号码,以及因该给窗口提供的号码。
2、取号机
首先一个银行因该只有一个取号机,说以取号机对象因该做成一个单例模式。因为顾客分三种,则取号机因该向外提供三种不同的号码对象。所以取号机不产生号码,它只是提供三种不同的号码对象,号码对象可以产生新号码。
3、窗口
窗口也分三中,则它因该有一个属性决定此窗口是何种类型的,因为同一中类型的窗口可能会存在多个,则每个窗口都要有自己的ID以区分彼此。窗口还要提供一个为顾客服务的方法,并且会根据不同的顾客提供不同的服务。
4、顾客类型
因为顾客类型只有三种,所以顾客类型因该设计成一个枚举类型。然后让其他类调用。
以下是项目的代码实现:
1、号码类
- package com.hbsi.interview.bank;
- import java.util.ArrayList;
- import java.util.List;
- public class NumberManager {
- private int lastNumber = 1;
- private List<Integer> queueNumber = new ArrayList<Integer>();
- //产生一个新的号码
- public synchronized Integer generateNewNumber(){
- queueNumber.add(lastNumber);
- return lastNumber++;
- }
- //向窗口提供一个号码
- public synchronized Integer fetchServiceNumber(){
- if(queueNumber.size()!=0){
- return queueNumber.remove(0);
- }else{
- return null;
- }
- }
- }
2、取号机
- package com.hbsi.interview.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;
- }
- }
3、窗口
- package com.hbsi.interview.bank;
- import java.util.Random;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ServicesWindow {
- //用来标记窗口的类型
- CustomerType type = CustomerType.COMMON;
- //标记窗口的ID
- 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(){
- @Override
- public void run(){
- while(true){
- switch(type){
- case COMMON:
- commonService();
- break;
- case EXPRESS:
- expressService();
- break;
- case VIP:
- vipService();
- break;
- }
- }
- }
- });
- }
- //为普通客户服务的方法
- public 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 time = 0;
- try {
- int x = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
- time = new Random().nextInt(x+1)+Constants.MIN_SERVICE_TIME;
- Thread.sleep(time);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(windowName+"处理完了普通用户"+number+",用了"+time/1000+"秒");
- }else{
- System.out.println(windowName+"没有获取到普通用户的任务,休息一秒再取吧!");
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- //为快速客户服务的方法
- public void expressService(){
- String windowName = "第"+windowId+"号"+type+"窗口";
- System.out.println(windowName+"正在获取快速用户任务。");
- Integer number = NumberMachine.getInstance().getExpressManager().fetchServiceNumber();
- if(number!=null){
- System.out.println(windowName+"正在处理快速用户"+number+"的任务。");
- long time =0;
- try {
- time = Constants.MIN_SERVICE_TIME;
- Thread.sleep(time);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(windowName+"处理完了快速用户"+number+",用了"+time/1000+"秒");
- }else{
- System.out.println(windowName+"没有获取到快速任务,开始取普通任务");
- commonService();
- }
- }
- //为VIP客户服务的方法
- public void vipService(){
- String windowName = "第"+windowId+"号"+type+"窗口";
- System.out.println(windowName+"正在获取VIP用户任务。");
- Integer number = NumberMachine.getInstance().getVipManager().fetchServiceNumber();
- if(number!=null){
- System.out.println(windowName+"正在处理VIP用户"+number+"的任务。");
- long time =0;
- try {
- int x = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
- time = new Random().nextInt(x+1)+Constants.MIN_SERVICE_TIME;
- Thread.sleep(time);//new Random().nextInt(10)
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(windowName+"处理完了VIP用户"+number+"的任务,用了"+time/1000+"秒");
- }else{
- System.out.println(windowName+"没有获取到VIP用户的任务,开始取普通任务");
- commonService();
- }
- }
- }