黑马程序员-银行管理系统

来源:互联网 发布:高通网络解锁工具下载 编辑:程序博客网 时间:2024/05/20 16:09

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------

需求:

分析:

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

  首先,一个客户其实就是一个号码,所以应该有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。

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

2、各类型客户在其对应窗口按顺序依次办理业务,准确地说,应该是窗口依次叫号,

各窗口怎么知道该叫哪个号了?它一定是问相应的号码管理器,即服务窗口每次找号码管理器获取当前要被服务的号码。

 

首先我们要创建几个类NumberManager类、NumberMachine类,ServiceWindow类,MainClass类,我们要理清这几个类之间的关系。

 

NumberManager类:(操作数据,),提供产生号码,和获取号码的方法。

NumberMachine类:(机器),内部维护三个对NumberManager对象的引用(分别是commonManagerexpressManagerVIPManager)。

ServiceWindow类:产生一个线程,该线程根据自己的窗口类型不断的从对应的NumberManagercommonManageexpressManageVIPManager)中取出数据进行服务。

MainClass类:1、产生六个窗口,并分别调用其start方法让窗口开始服务。

             2、产生三个线程,分别调用自己对应的NumberManager不断产生数据。

 

此外:我们最后再定义两个类,Contants类,,CustomType

 

Contants类:存放一些静态变量,列如题中所说的最大最小服务时间

CustomType类:(枚举) 存放客户类型

 

 

详细设计:

NumberManager类:

import java.util.ArrayList;import java.util.List;public class NumberManager {private int number;private List<Integer> list = new ArrayList<Integer>();public synchronized Integer createNumber() {number++;list.add(number);return number;}public synchronized Integer fetchNumber() {/* return list.remove(0); */// 不可以这样写,因为如果list中没有数据,而你又试图去移除第一个元素,// 就会抛出java.lang.IndexOutOfBoundsExceptionif (list.size() > 0) {return list.remove(0);}return null;}}

NumberMachine

public class NumberMachine {private static NumberMachine nm = new NumberMachine();private NumberMachine() {}public static NumberMachine getInstance() {return nm;}private NumberManager commonManager = new NumberManager();public NumberManager getCommonManager() {return commonManager;}public NumberManager getExpressManager() {return expressManager;}public NumberManager getVIPManager() {return VIPManager;}private NumberManager expressManager = new NumberManager();private NumberManager VIPManager = new NumberManager();}

ServiceWindow

import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ServiceWindow {private int windowId;public void setWindowId(int windowId) {this.windowId = windowId;}public void setType(CustomerType type) {this.type = type;}private CustomerType type;public void start() {ExecutorService es = Executors.newSingleThreadExecutor();es.execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {switch (type) {case commom:commonService();break;case express:expressService();break;case VIP:VIPService();break;}}}});}public void commonService() {// System.out.println(windowId+"号"+type+"窗口正在等待服务");NumberManager commonManager = NumberMachine.getInstance().getCommonManager();Integer commonNumber = commonManager.fetchNumber();if (commonNumber != null) {System.out.println(type + "" + windowId + "窗口为" + commonNumber+ "普通用户服务");long startTime = System.currentTimeMillis();int maxRandom = Contants.maxServiceTime - Contants.minServiceTime;int sleepTime = new Random().nextInt(maxRandom) + 1+ Contants.minServiceTime;try {Thread.sleep(sleepTime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}long endTime = System.currentTimeMillis();long serviceTime = (endTime - startTime) / 1000;System.out.println(type + "窗口为普通用户" + commonNumber + "号服务"+ serviceTime + "秒");} else {switch (type) {case commom:System.out.println("目前没有要服务的普通用户对象,普通窗口先休息一会吧!");break;case express:System.out.println("目前没有要服务的普通用户对象,快速窗口先休息一会吧!");break;case VIP:System.out.println("目前没有要服务的普通用户对象,VIP窗口先休息一会吧!");break;}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void expressService() {// System.out.println(windowId+"号"+type+"窗口正在等待服务");NumberManager expressManager = NumberMachine.getInstance().getExpressManager();Integer expressNumber = expressManager.fetchNumber();if (expressNumber != null) {System.out.println(type + "" + windowId + "窗口为" + expressNumber+ "快速用户服务");try {Thread.sleep(Contants.minServiceTime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}long serviceTime = Contants.minServiceTime / 1000;System.out.println(type + "窗口为快速用户" + expressNumber + "号服务"+ serviceTime + "秒");} else {System.out.println("目前没有快速用户需要服务,快速窗口正准备给普通用户服务");commonService();}}public void VIPService() {// System.out.println(windowId+"号"+type+"窗口正在等待服务");NumberManager VIPManager = NumberMachine.getInstance().getVIPManager();Integer VIPNumber = VIPManager.fetchNumber();if (VIPNumber != null) {System.out.println(type + "" + windowId + "窗口为" + VIPNumber+ "VIP用户服务");long startTime = System.currentTimeMillis();int maxRandom = Contants.maxServiceTime - Contants.minServiceTime;int sleepTime = new Random().nextInt(maxRandom) + 1+ Contants.minServiceTime;try {Thread.sleep(sleepTime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}long endTime = System.currentTimeMillis();long serviceTime = (endTime - startTime) / 1000;System.out.println(type + "窗口为VIP用户" + VIPNumber + "号服务"+ serviceTime + "秒");} else {System.out.println("目前没有VIP用户需要服务,VIP窗口正准备给普通用户服务");commonService();}}}

MainClass

import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class MainClass {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfor (int i = 1; i < 5; i++) {ServiceWindow commonWindow = new ServiceWindow();commonWindow.setWindowId(i);commonWindow.setType(CustomerType.commom);commonWindow.start();}ServiceWindow expressWindow = new ServiceWindow();expressWindow.setType(CustomerType.express);expressWindow.setWindowId(5);expressWindow.start();ServiceWindow VIPWindow = new ServiceWindow();VIPWindow.setType(CustomerType.VIP);VIPWindow.setWindowId(6);VIPWindow.start();Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubInteger serviceNumber = NumberMachine.getInstance().getCommonManager().createNumber();System.out.println("第" + serviceNumber + "号普通用户正在等待服务");}}, 1, Contants.VipComeTime * 6, TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubInteger serviceNumber = NumberMachine.getInstance().getExpressManager().createNumber();System.out.println("第" + serviceNumber + "号快速用户正在等待服务");}}, 1, Contants.VipComeTime * 3, TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubInteger serviceNumber = NumberMachine.getInstance().getVIPManager().createNumber();System.out.println("第" + serviceNumber + "号VIP用户正在等待服务");}}, 1, Contants.VipComeTime, TimeUnit.SECONDS);}}

Contants

public class Contants {public static int minServiceTime = 1000;public static int maxServiceTime = 9000;public static int VipComeTime = 1;}

CustomType

public enum CustomerType {commom, express, VIP}


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------

0 0
原创粉丝点击