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

来源:互联网 发布:绿岸网络 编辑:程序博客网 时间:2024/06/04 19:25

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

需求分析:
1.银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口
2.有三种对应类型的客户:普通客户、快速客户(办理如缴水电费、电话费之类的业务)、VIP客户
3.异步随机生成各种类型的客户,生成类型的客户的比例为:VIP客户:普通客户:快速客户 = 1:6:3
4.客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需的 时间为最小值
5.各类型的客户在其对应窗口按顺序依次办理业务
6.当VIP窗口(6号)和快速窗口(5号)没有客户等待办理业务是,可以处理普通客户的业务,而一旦有对应的客户等待办理业务时,则优先处理对应客户的业务
7.随机生成客户时间间隔以及业务办理时间最大值和最小值自定义
8.不实现GUI,只考虑系统逻辑实现,通过Log方式展现程序运行结果

面向对象的分析和设计

有三种对应类型的客户:普通客户、快速客户(办理如缴水电费、电话费之类的业务)、VIP客户

客户来银行,先要按照业务需求去取号,因此要有个号码管理器,根据业务类型的不同有三个不同类型号码管理器,分别为普通客户号码管理器,快速客户号码管理器,VIP客户号码管理器。

银行有个取号机器,这个取号机器有三个选项,管理三个号码管理器。由于只有一个机器,因此应该设计为单例。

服务窗口依次叫号,各个窗口找号码管理器取号码,然后为这个号码的客户服务。

画图:

具体代码:

号码管理器类NumberManager:

package com.itheima;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 genarateNewNumber(){queueNumber.add(lastNumber);return lastNumber++;}public synchronized Integer fetchServiceNumber(){if(queueNumber.size()>0)return queueNumber.remove(0);elsereturn null;}}
号码机器:NumberMachine 单例模式

package com.itheima;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;}}

服务窗口类:ServiceWindow

package com.itheima;import java.awt.BorderLayout;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;public class ServiceWindow extends JFrame{/** *  */private static final long serialVersionUID = 1L;private JTextArea taMsg=new JTextArea("窗口记录:\n");private CustomerType type=CustomerType.COMMON;private JScrollPane scroll=new JScrollPane(taMsg);private int windowId=1;public void setType(CustomerType type) {this.type = type;}public void setWindowId(int windowId) {this.windowId = windowId;}public void start(){taMsg.setLineWrap(true);this.getContentPane().add(scroll);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setSize(400,300);this.setVisible(true);this.setTitle("服务窗口");     ExecutorService pool=Executors.newSingleThreadExecutor();pool.execute(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){switch(type){case COMMON:commonService();break;case EXPRESS:expressService();break;case VIP:vipService();break;}}}});}private void commonService() {String windowName="第"+windowId+"号"+type+"窗口";taMsg.append(windowName+"正在获取任务:\n");Integer number=NumberMachine.getInstance().getCommonManager().fetchServiceNumber();if(number==null){taMsg.append("没有取到服务任务,休息一秒钟!\n");try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{taMsg.append(windowName+"开始为第"+number+"个"+"普通"+"客户服务\n");long beginTime=System.currentTimeMillis();long serviceTime=(new Random().nextInt(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME))+1+Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}long costTime=System.currentTimeMillis()-beginTime;taMsg.append(windowName+"为第"+number+"个"+"普通"+"客户完成服务,耗时"+costTime/1000+"秒钟\n");System.out.println("第"+number+"个"+"普通"+"客户完成服务,离开!");}}private void expressService() {String windowName="第"+windowId+"号"+type+"窗口";taMsg.append(windowName+"正在获取任务:\n");Integer number=NumberMachine.getInstance().getExpressManager().fetchServiceNumber();if(number==null){taMsg.append("没有取到服务任务!\n");commonService();try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{taMsg.append(windowName+"开始为第"+number+"个"+type+"客户服务\n");long beginTime=System.currentTimeMillis();long serviceTime=Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}long costTime=System.currentTimeMillis()-beginTime;taMsg.append(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒钟\n");System.out.println("第"+number+"个"+type+"客户完成服务,离开!");}}private void vipService() {String windowName="第"+windowId+"号"+type+"窗口";taMsg.append(windowName+"正在获取任务:\n");Integer number=NumberMachine.getInstance().getVipManager().fetchServiceNumber();if(number==null){taMsg.append("没有取到服务任务\n");commonService();try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{taMsg.append(windowName+"开始为第"+number+"个"+type+"客户服务\n");long beginTime=System.currentTimeMillis();long serviceTime=(new Random().nextInt(Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME))+1+Constants.MIN_SERVICE_TIME;try {Thread.sleep(serviceTime);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}long costTime=System.currentTimeMillis()-beginTime;taMsg.append(windowName+"为第"+number+"个"+type+"客户完成服务,耗时"+costTime/1000+"秒钟\n");System.out.println("第"+number+"个"+type+"客户完成服务,离开!");}}}
主类:MainClass

package com.itheima;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class MainClass {public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=1;i<5;i++){ServiceWindow commonWindow=new ServiceWindow();commonWindow.setType(CustomerType.COMMON);commonWindow.setWindowId(i);commonWindow.start();commonWindow.setLocation((i-1)*300, 0);}ServiceWindow expressWindow=new ServiceWindow();expressWindow.setType(CustomerType.EXPRESS);expressWindow.setWindowId(5);expressWindow.start();expressWindow.setLocation(300, 300);ServiceWindow vipWindow=new ServiceWindow();vipWindow.setType(CustomerType.VIP);vipWindow.setWindowId(6);vipWindow.start();vipWindow.setLocation(600, 300);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubInteger number=NumberMachine.getInstance().getCommonManager().genarateNewNumber();System.out.println(number+"号普通客户等待服务!");}},0,Constants.COMMON_CUSTOMER_INTERVAL_TIME,TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubInteger number=NumberMachine.getInstance().getExpressManager().genarateNewNumber();System.out.println(number+"号快速客户等待服务!");}},0,Constants.COMMON_CUSTOMER_INTERVAL_TIME*2,TimeUnit.SECONDS);Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubInteger number=NumberMachine.getInstance().getVipManager().genarateNewNumber();System.out.println(number+"号VIP客户等待服务!");}},0,Constants.COMMON_CUSTOMER_INTERVAL_TIME*6,TimeUnit.SECONDS);}}

客户类型枚举类:CustomerType

package com.itheima;public enum CustomerType {COMMON,EXPRESS,VIP;public String toString(){switch(this){case COMMON:return "普通";case EXPRESS:return "快速";case VIP:return "VIP";}return null;}}

常量类:Constants

package com.itheima;public enum CustomerType {COMMON,EXPRESS,VIP;public String toString(){switch(this){case COMMON:return "普通";case EXPRESS:return "快速";case VIP:return "VIP";}return null;}}
PS:

看完视频自己编了下代码,发现显示内容都放在命令行上感觉很混乱,就把窗口服务类做成一个简单的图形界面方便观察。

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net



0 0