银行管理系统

银行管理系统:


需求:分别有6个窗口,1~4号为普通客户窗口,5号为快速窗口,6号为VIP窗口,当VIP窗口没有任务是就为普通客户服务,如果有VIP客户来了就为VIP客户服务

分析与设计:

有三种对应类型的客户VIP客户、普通客户、快速客户、异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务。

1、  每一个客户就是有银行的一个取号机产生号码的方式来表示的,所以有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户

2、  由于有三种类型客户,每种类型客户的号码编排都是完全独立的,所以本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码,这三个号码管理器统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以它要被设计成单列,

各类型客户在其对应窗口按顺序依次办理业务,也就是窗口依次叫号

服务窗口每次找号码管理器获取当前要被服务的号码

号码产生器类:

package com.isftstome.interview.bank;

import java.util.ArrayList;
import java.util.List;

/**
 * 号码产生器
 * @author Administrator
 *因为两个线程要同时操作一个数据所以加上了synchronized
 */
public class NumberManager {
	//上一次返回的代码
	private int lastNumber=1;
	//排队的号码
	private List<Integer> queneNumber = new ArrayList<Integer>();
	//客户生产号方法
	public synchronized Integer generateNewManager(){
		queneNumber.add(lastNumber);
		return lastNumber++;
	}
	//窗口取号的方法
	public synchronized Integer fetchServiceNumber(){
		Integer number= null;
		if (queneNumber.size()>0) {
			number = queneNumber.remove(0);
		}
		return number;
		
	}

}
号码管理器类:
package com.isftstome.interview.bank;
/**
 * 号码管理器
 * @author Administrator
 *
 */
public class NumberMachine {
	//vip管理器
	private NumberManager VipManeger = new NumberManager();
	//快速客户管理器
	private NumberManager expressManager = new NumberManager();
	//普通客户管理器
	private NumberManager commonManeger = new NumberManager();
	
	
	public NumberManager getVipManeger() {
		return VipManeger;
	}
	public NumberManager getExpressManager() {
		return expressManager;
	}
	public NumberManager getCommonManeger() {
		return commonManeger;
	}
	
	//单列
	private NumberMachine(){}
	private static NumberMachine instance = new NumberMachine();
	public static NumberMachine getInstance(){
		return instance;
	}
}
窗口类型:

package com.isftstome.interview.bank;
/**
 * 窗口类型
 * @author Administrator
 *
 */
public enum CustomerType {
	COMMON,EXPRESS,VIP;
	
	public String toString() {
		switch (this) {
		case COMMON:
			return "普通";
		case EXPRESS:
			return "快速";
		case VIP:
			return "VIP";

		default:
			break;
		}
		return null;
		
	};
}
服务窗口类:
package com.isftstome.interview.bank;

import java.util.Random;
import java.util.concurrent.Executors;

/**
 * 服务窗口
 * 
 * @author Administrator
 * 
 */
public class ServiceWindow {
	// 定义变量是哪个窗口
	private CustomerType type = CustomerType.COMMON;
	//窗口号码,默认1号窗口
	private int windowId = 1;
	
	public void setType(CustomerType type) {
		this.type = type;
	}
	public void setWindowId(int windowId) {
		this.windowId = windowId;
	}
	// 叫号方法
	public void start() {
		Executors.newScheduledThreadPool(1).execute(new Runnable() {

			@Override
			public void run() {
				while (true) {

					switch (type) {
					case COMMON:
						comonService();
						break;
					case EXPRESS:
						excuteService();
						break;
					case VIP:
						VIPService();
						break;
					default:
						break;
					}
				}

			}

		});
	}

	private void comonService() {
		String windowName = "第"+windowId+"号"+type+"窗口";
		System.out.println(windowName+"正在取任务");
		Integer number = NumberMachine.getInstance()
				.getCommonManeger().generateNewManager();
		if (number!=null) {
			//服务该号
			System.out.println(windowName+"正在为第"+number+"个"+type+"客户服务");
			long startTime = System.currentTimeMillis();
			long endTime = System.currentTimeMillis();
			int maxServiceTime = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			long serviceTime=new Random().nextInt(maxServiceTime)+1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long castTime = endTime-startTime;
			System.out.println(windowName+"为第"+number+"个"+type+"客户服务,耗时"+castTime);
			
		} else {
			System.out.println(windowName+"没有取到服务,休息1秒钟");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	private void excuteService() {
		String windowName = "第"+windowId+"号"+type+"窗口";
		System.out.println(windowName+"正在取任务");
		Integer number = NumberMachine.getInstance()
				.getExpressManager().generateNewManager();
		if (number!=null) {
			//服务该号
			System.out.println(windowName+"正在为第"+number+"个"+type+"客户服务");
			long startTime = System.currentTimeMillis();
			long endTime = System.currentTimeMillis();
			try {
				Thread.sleep(Constants.MIN_SERVICE_TIME);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long castTime = endTime-startTime;
			System.out.println(windowName+"为第"+number+"个"+type+"客户服务,耗时"+castTime);
			
		} else {
			comonService();
		}
	}
	
	
	private void VIPService() {
		String windowName = "第"+windowId+"号"+type+"窗口";
		System.out.println(windowName+"正在取任务");
		Integer number = NumberMachine.getInstance()
				.getVipManeger().generateNewManager();
		if (number!=null) {
			//服务该号
			System.out.println(windowName+"正在为第"+number+"个"+type+"客户服务");
			long startTime = System.currentTimeMillis();
			long endTime = System.currentTimeMillis();
			int maxServiceTime = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			long serviceTime=new Random().nextInt(maxServiceTime)+1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serviceTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			long castTime = endTime-startTime;
			System.out.println(windowName+"为第"+number+"个"+type+"客户服务,耗时"+castTime);
			
		} else {
			comonService();
		}
	}
	

}
服务时间类:
package com.isftstome.interview.bank;
/**
 * 服务时间类
 * @author Administrator
 *
 */
public class Constants {
	//最大时间
	public static int MAX_SERVICE_TIME=10000;
	//最小时间
	public static int MIN_SERVICE_TIME=10000;
	//客户各多少时间来
	public static int conmonTime = 1;
}





---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值