Java面向对象编程面试题:银行业务调度系统

面向对象银行管理系统JAVA代码 上 阅读详情

模拟实现银行业务调度系统逻辑,具体需求如下:

银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIp窗口。

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

异步随机生成各种类型的客户,生成各类型用户的概率比例为:

 VIp客户 :普通客户 :快速客户 = 1 :6 :3。

客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIp客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值

(提示:办理业务的过程可通过线程Sleep的方式模拟)

各类型客户在其对应窗口按顺序依次办理业务。

当VIp(6号)窗口和快速业务(5号)窗口没有客户等待办理业务的时候,这两个窗口可以处理普通客户的业务,而一旦有对应的客户等待办理业务的时候,则优先处理对应客户的业务。

随机生成客户时间间隔以及业务办理时间最大值和最小值自定,可以设置。

不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


1、面向对象分析与设计

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

首先,经常在银行办理业务的人更有利于理解本系统,我们知道每一个客户其实就是由银行的一个取号机器产生号码的方式来表示的。所以,要有一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。

由于有三类客户,每类客户的号码编排都是完全独立的,所以,本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码。

这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。

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

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


2、根据以上分析,类图设计如下:



3、类详细编码

import java.util.ArrayList;  
import java.util.List;  
/** 
 *NumberManager类 
 *定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。 
 *定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。 
 */  
public class NumberManager {  
    private int lastNumber = 0;  
    private List queueNumbers = new ArrayList();  
      
    public synchronized Integer generateNewNumber(){  
        queueNumbers.add(++lastNumber);  
        return lastNumber;  
    }  
      
    public synchronized Integer fetchNumber(){  
        if(queueNumbers.size()>0){  
            return (Integer)queueNumbers.remove(0);  
        }else{  
            return null;  
        }  
    }  
}  

/** 
 *NumberMachine类 
 *  定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。 
 *  将NumberMachine类设计成单例。 
 */  
public class NumberMachine {	
	private NumberManager commonManager = new NumberManager();
	private NumberManager expressManager = new NumberManager();
	private NumberManager vipManager = new NumberManager();	
	private static NumberMachine instance = new NumberMachine();
	private NumberMachine(){}
	public static NumberMachine getInstance(){
		return instance;
	}		
	public NumberManager getCommonManager() {
		return commonManager;
	}
	public NumberManager getExpressManager() {
		return expressManager;
	}
	public NumberManager getVipManager() {
		return vipManager;
	}	
}
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;

/**
 * MainClass类 用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
 * 接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。
 */
public class MainClass {
	private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");

	public static void main(String[] args) {
		// 产生4个普通窗口
		for (int i = 1; i < 5; i++) {
			ServiceWindow window = new ServiceWindow();
			window.setNumber(i);
			window.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 serviceNumber = NumberMachine.getInstance()
						.getCommonManager().generateNewNumber();
				/* 采用logger方式,无法看到直观的运行效果因为logger.log方法
				 * 内部并不是直接把内容打印出出来,而是交给内部的一个线程去处理 */
				// logger.info("第" + serviceNumber + "号普通客户正在等待服务!");
				System.out.println("第" + serviceNumber + "号普通客户正在等待服务!");
			}
		}, 
		0, 
		Constants.COMMON_CUSTOMER_INTERVAL_TIME, 
		TimeUnit.SECONDS
		);
		
		// 快速客户拿号
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
			public void run() {
				Integer serviceNumber = NumberMachine.getInstance()
						.getExpressManager().generateNewNumber();
				System.out.println("第" + serviceNumber + "号快速客户正在等待服务!");
			}
		}, 
		0, 
		Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2, 
		TimeUnit.SECONDS
		);
		
		// VIP客户拿号
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
			public void run() {
				Integer serviceNumber = NumberMachine.getInstance()
						.getVipManager().generateNewNumber();
				System.out.println("第" + serviceNumber + "号VIP客户正在等待服务!");
			}
		}, 
		0, 
		Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, 
		TimeUnit.SECONDS
		);
	}
}


/**CustomerType枚举类 
  *  系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。 
  *  重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。 
  */  
public enum CustomerType {  
    COMMON,EXPRESS,VIP;  
    public String toString(){  
        String name = null;  
        switch(this){  
        case COMMON:  
            name = "普通";  
            break;  
        case EXPRESS:  
            name = "快速";  
            break;  
        case VIP:  
            name = name();  
            break;  
        }  
        return name;  
    }  
}  

import java.util.Random;  
import java.util.concurrent.Executors;  
import java.util.logging.Logger;    
/** 
 * ServiceWindow类 
 *    定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。  
 *    定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。 
 * 没有把VIP窗口和快速窗口做成子类,是因为实际业务中的普通窗口可以随时被设置为VIP窗口和快速窗口。 
 */  
public class ServiceWindow {  
    private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");  
    private CustomerType type = CustomerType.COMMON;  
    private int number = 1;  
  
    public CustomerType getType() {  
        return type;  
    }  
  
    public void setType(CustomerType type) {  
        this.type = type;  
    }  
      
    public void setNumber(int number){  
        this.number = number;  
    }  
      
    public void start(){  
        Executors.newSingleThreadExecutor().execute(  
                new Runnable(){  
                    public void run(){  
                        //下面这种写法的运行效率低,最好是把while放在case下面  
                        while(true){  
                            switch(type){  
                                case COMMON:  
                                    commonService();  
                                    break;  
                                case EXPRESS:  
                                    expressService();  
                                    break;  
                                case VIP:  
                                    vipService();  
                                    break;  
                            }  
                        }  
                    }  
                }  
        );  
    }  
      
    private void commonService(){  
        String windowName = "第" + number + "号" + type + "窗口";         
        System.out.println(windowName + "开始获取普通任务!");  
        Integer serviceNumber = NumberMachine.getInstance().getCommonManager().fetchNumber();         
        if(serviceNumber != null ){  
            System.out.println(windowName + "开始为第" 
				+ serviceNumber + "号普通客户服务");          
            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) {  
                e.printStackTrace();  
            }     
            System.out.println(windowName + "完成为第" + serviceNumber 
			+ "号普通客户服务,总共耗时" + serviceTime/1000 + "秒");        
        }else{  
            System.out.println(windowName + "没有取到普通任务,正在空闲一秒");       
            try {  
                Thread.sleep(1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }                 
        }  
    }  
      
    private void expressService(){  
        Integer serviceNumber = NumberMachine.getInstance().getExpressManager().fetchNumber();  
        String windowName = "第" + number + "号" + type + "窗口";     
        System.out.println(windowName + "开始获取快速任务!");         
        if(serviceNumber !=null){  
            System.out.println(windowName + "开始为第" 
			+ serviceNumber + "号快速客户服务");              
            int serviceTime = Constants.MIN_SERVICE_TIME;  
            try {  
                Thread.sleep(serviceTime);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }         
            System.out.println(windowName + "完成为第" + serviceNumber 
			+ "号快速客户服务,总共耗时" + serviceTime/1000 + "秒");        
        }else{  
            System.out.println(windowName + "没有取到快速任务!");                 
            commonService();  
        }  
    }  
      
    private void vipService(){  
  
        Integer serviceNumber = NumberMachine.getInstance().getVipManager().fetchNumber();  
        String windowName = "第" + number + "号" + type + "窗口";     
        System.out.println(windowName + "开始获取VIP任务!");            
        if(serviceNumber !=null){  
            System.out.println(windowName + "开始为第" 
				+ serviceNumber + "号VIP客户服务");             
            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) {  
                e.printStackTrace();  
            }         
            System.out.println(windowName + "完成为第" + serviceNumber 
		+ "号VIP客户服务,总共耗时" + serviceTime/1000 + "秒");       
        }else{  
            System.out.println(windowName + "没有取到VIP任务!");                
            commonService();  
        }     
    }  
}   


public class Constants {  
    public static int MAX_SERVICE_TIME = 10000; //10秒!  
    public static int MIN_SERVICE_TIME = 1000; //1秒!  
      
    /*每个普通窗口服务一个客户的平均时间为5秒,一共有4个这样的窗口,也就是说银行的所有普通窗口合起来 
     * 平均1.25秒内可以服务完一个普通客户,再加上快速窗口和VIP窗口也可以服务普通客户,所以, 
     * 1秒钟产生一个普通客户比较合理,*/     
    public static int COMMON_CUSTOMER_INTERVAL_TIME = 1;      
}



java开发面向对象(银行小项目) 银行项目: 要求: 1:新建一个DataBase类来模拟数据库; 2: 用相应类型的数组来模拟数据库的表,存储数据; 3:银行系统有登录、注册、存钱、取钱等功能; 4:要有删除、修改用户信息等功能; 目的: 1:熟悉使用数组模拟数据库进行增、删、改、查的操作; 2:熟悉类的写法及自定义类作为另一个类的属性的写法; 3:熟悉方法的调用,及避免属性空指针操作; 4:熟悉项目流程控制操作;为阶段考核的预演; 有两个角色,用户和管理员 用户有存钱,取钱,修改密码的功能,管理员有开户,删除账户,查询账户的功能。纯java代码,没有数据库,针对于初学者,希望大家多提提意见 立即下载

相关推荐

信用卡管理系统

c/s架构的信用卡管理系统。crud功能.包括数据库。

面向对象银行管理系统JAVA代码

基于Java的银行管理系统

huangyixian2的博客 4522

C++面向对象编程案例(银行管理系统)

一个面向对象编程的C++控制台案例程序,VC6调试通过

黑马程序员:7K面试题之银行业务调度系统

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

as343542581的专栏 412

Java+SQL信用卡管理系统源代码

Java+SQL信用卡管理系统源代码,MSSQL数据库,比较复杂,新手调试可能会遇到问题,附有Java源代码,仅供学习参考。

工业质检实战:用海康VisionMaster的BLOB分析搞定PCB焊点缺陷检测

本文详细介绍了如何利用海康VisionMaster平台的BLOB分析技术,构建一套针对PCB焊点缺陷的自动化视觉检测方案。文章从核心原理出发,重点阐述了如何通过动态阈值分割和模板匹配定位,克服工业现场光照不均、位置偏移等挑战,实现虚焊、漏焊等缺陷的精准、稳定检测,并提供了实战调优与系统集成的关键思路。

weixin_29091105的博客 562

银行业务调度系统

今天学习了张孝祥老师的7K面试题之一的银行业务调度系统,收获颇丰,首先是对基础知识的一种整合,其次是对面向对象的编程方式的理解,最后是在实际的项目开发中,究竟是个什么样的流程,也稍有了解。 需求: Ø银行内有6个业务窗口,1-4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 Ø有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费...

程序小猿——Shawn 379

【NAS for PVE _04】安装TrueNAS

前篇说到如何调试 Proxmox VE 8.2 为安装虚拟机做准备,本篇主要讲述如何在 Proxmox VE 上安装 TrueNAS 系统,并开启NFS供其他系统挂载使用官网下载好TrueNAS系统镜像。

村口王师傅。 6144

黑马程序员——面试题——2.银行业务调度系统

银行业务调度系统         --------------------------------------------------------------------------------------------------------------------------------------面试经验漫谈:   android建立随便自己编点玩具项目或小功能都可以,千万不要照

yechangxingsky的专栏 587

2024最新超详细无痛安装PyTorch,包括下载地址、环境配置与各种避坑指南

PyTorch更新很快,2024最新下载安装经验贴,包括anaconda+CUDA+cuDNN+PyTorch四部分的下载和安装。文章详细介绍了下载地址、环境配置、虚拟环境建立的问题,还温馨提示了各种闭坑指南。有需要的友友快过来康康!

qq_43596278的博客 11万+

【机器视觉】Halcon 最新版本安装教程(HALCON 24.11.1.1 Progress-Steady)

注:如果使用评估版本,下载前先了解最新评估授权密钥所支持的版本。。近几年不同版本安装过程类似,均可参考本教程。

OpenSeek的博客 3万+

银行业务系统

------- android培训、java培训、期待与您交流! ---------- 一、需求: 模拟实现银行业务调度系统逻辑,具体需求如下: 1、银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 2、有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 3、异步随机生成各种类型的客户,生成各类型用户

宁静致远 814

集成学习之GBDT

GBDT

joejoeqian的博客 1257

面试题--银行业务调度

模拟实现银行业务调度系统逻辑,具体需求如下: Ø 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 Ø 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 Ø 异步随机生成各种类型的客户,生成各类型用户的概率比例为:         VIP客户 :普通客户 :快速客户  =  1 :6 :3。 Ø 客

perry_zhao的博客 951

第二节:Vben Admin 登录逻辑梳理和对接后端准备

第一节,我们已经配置了前端环境,运行起来了我们的Vben Admin的项目。本节内容,我们先熟悉下项目的目录和文件,然后开始准备对接后端程序路由在 src/router页面在 sr/views本节前端登录逻辑梳理完成了,后端只要在/api/login 接口编写返回逻辑,前后段就可以打通了,具体详情我们下一节介绍。

cuiwin的专栏 5084

YOLO26涨点改进 | 独家创新,注意力改进篇 | AAAI 2025 | YOLO26引入 DRM 防御优化模块,进行特征优化/特征增强,助力目标检测、图像分类、图像分割有效涨点

本文提出了一种基于DRM防御优化模块改进的YOLO26网络模型,显著提升了目标检测的鲁棒性和特征提取能力。DRM模块通过优化特征提取过程、增强抗噪声能力和补充细节信息,有效提高了模型在复杂场景下的检测精度和定位准确度。该模块可集成于UNet等主干网络,采用Transformer结构实现特征精炼,在对抗攻击环境下仍能保持稳定的融合效果。实验表明,改进后的模型在红外与可见光图像融合任务中表现出色,同时提升了下游任务性能。文章详细介绍了DRM模块的结构、作用机制及实现代码,并提供了两种YOLO26改进方案.

Ai缝合怪、助力小伙伴高效发论文 145

经典面试项目—银行业务调度系统

上一篇文章中介绍了交通灯管理系统,对我们学习面向对象编程的理解意义非凡,继这个面试者完成这个项目被软通动力聘用之后,又有一位面试者应聘软通动力,同样的还是交给这位面试者一个项目拿回家去做,提交审核通过之后即可完成面试。这个项目是模拟银行叫号业务的系统,我们平时去银行的时候可以发现,不管办理什么样的柜台业务,大厅经理都会从取票机上面取出一张号码票给我们,然后只要等待广播叫道各自拿到的号码到相应的柜台上办理业务即可,这个程序就是模拟这样一个过程,当我们使用面向对象编程时仔细分析潜在的对象,这种思考方式符合人类的

奇点临近 1827

开源数字人、虚拟直播部署教程

对,你无看错,是欧美的。在直播带货案例里,我们把模型导入到ue4,我们给模型在ue4里预设了四个动作(站着、站着说话、坐着、坐着说话),三个表情(平静、开发、愤怒),三个镜头(全局、近矩说话、看显示器播放商品展示)。我们只需要把目标主播的直播给录制下来,提取样本数据,然后训练一个从粉丝的不同刺激的组合,到主播的不同响应方式的多元逻辑回归的数学模型参数即可。

南七小僧的学海无涯 4562

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

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------        紧接着交通灯系统之后,又是一道面试题,是关于银行业务调度系统的,跟随着老师的思路,一共有六个窗口,四个窗口为普通窗口,一个快速窗口,还有一个VIp窗口,每个窗口所执行的任务接待的对象的先后顺序不同,看了张老师编译的程序,内心无比的佩服与羡慕,真得好完美,每种情

606

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

黑马程序员-银行管理面试题总结

------- android培训、java培训、期待与您交流! ----------  面向对象的分析与设计: 下面是张孝祥老师的经典例子,可以让我们更深入的理解,面向对象的分析和设计。 一个重要的经验就是谁拥有数据,谁就提供操作数据的方法。 1,两块石头磨成一把刀,石刀可以砍树,砍成木材,木材做成椅子。 stone  石头不能自己把自己变成石刀。 s

u011340968的专栏 788

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

黑马程序员-------(面试题)银行业务调度系统

-------------java培训、android培训、java博客、java学习型技术博客、期待与您交流! -------------- 银行业务调度系统的项目需求 面向对象的分析与设计 有三种对应类型的客户:VIP客户,普通客户,快速客户 ,异步随机生成各种类型的客户,各类型客户在其对应窗口按顺序依次办理业务 。 首先,经常在银行办理业务的人更有利于理解本系统,

abc18的专栏 655

黑马程序员_面试题_交通灯与银行业务

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 这一部分的笔记主要是对思路的整理,我觉得最好的理解是写代码,而代码呀什么的都帖出来就显得不太合适了,而且我自己也想用自己的方式完成一遍,这里也就只是总结了一下在做这两个题的过程中出现的一些新知识和比较有用的小技巧.另外就是一个思路的问题.交通灯管理系统: 小技巧:画图,如...

weixin_30752699的博客 167

黑马程序员_java学习日记_面试题_银行业务调度系统

--------------------- android培训、java培训、java学习型技术博客、期待与您交流! ---------------------- 面向对象的问题分析: 分析一个问题,首先要在脑海中构造出这么个场景,然后从面相对象的角度出发,分析这个场景中有多少个对象,这些对象哪些可以抽象成类,这个类又有什么属性,什么方法,最后要从人的角度出发去修改这段代码更加符合日常...

IT菜鸟的成长记录 244

黑马程序员_7k面试题之银行业务调度系统

---------------------- ASP.Net+Android+IOS开发、href="http://edu.youkuaiyun.com"target="blank">.Net培训、期待与您交流! ---------------------- 1、项目需求: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户

u012573336的专栏 710

黑马程序员--银行以及交通系统项目个人理解

----------------------------------------7K面试题之交通灯管理系统---------------------------------------- 项目需求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:     (1)异步随机生成按照各个路线行驶的车辆。     (2)信号灯忽略黄灯,只考虑红灯和绿灯。     (3)应考虑左转车辆

u013485029的专栏 874

目录列表

目录列表       第一部分  java基础  第一章:黑马程序员_01 基础小结 第二章:黑马程序员_02 面想对象三特性 第三章:黑马程序员_03 抽象类和接口 第四章:黑马程序员_04 super,this,static关键字 第五章:黑马程序员_05 java异常处理总结 第六章:黑马程序员_06 多线程 第七章:黑马程序员_0

u011426081的专栏 725
上一篇: Java面向对象编程面试题:交通灯管理系统
下一篇: Java API中英文档、Android API中文文档资料下载
梦中的梦
博客等级 码龄18年 16粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值