银行业务系统

article/2025/4/21 10:46:42

第一  需求分析

一、需求:

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

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

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

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

VIP客户 :普通客户 :快速客户 =  1 :6 :3

4、客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速客户办理业务所需时间为最小值(提示:办理业务的过程可通过线程Sleep的方式模拟)。

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

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

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

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

二、需求分析:

1、图例解析:


2、面向对象的分析与设计:

1)有三种客户:VIP客户、普通客户、快速客户。需要异步随机产生各种类型的客户。

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

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

2)各类客户到对应的窗口办理业务,是窗口在叫号

①、窗口内部知道如何叫号,是通过号码机器获取的号,所以它内部有这个叫号的方法

②、各类客户并不知道怎么操作叫号的方法,只是被叫到

三、程序实现:

一):NmuberManager类的编写:产生号码的管理类

1、定义变量记录取票记录

2、定义窗口服务取票的动态数组

3、定义产生票的方法

4、定义窗口获取服务的票

5、因为考虑到线程安全的问题需要给客户取票和服务端取票加上同步

代码实现:

/** 号票管理*/
public class NumberManager {private int lastNumber = 0;// 客户来取的号private List<Integer> queueNumber = new ArrayList<Integer>();// 窗口服务取的号public synchronized Integer fetchServiceNumber() {// 窗口取得服务的号票// 这里定义为Integer是因为要是集合中没有数据remove方法就会返回null,转为int就会空指针异常Integer number = 0;if (queueNumber.size() > 0) {number = queueNumber.remove(0);}return number;}// synchronized线程同步锁,防止多线程的安全问题public synchronized Integer generateNewManger() {// 产生号票queueNumber.add(lastNumber);return lastNumber++;}
}


二)号票管理机器

1、号票管理机器有三个票务管理器,VIP、普通、快速

2、分别定义产生三个票务管理器

3、因为号票管理器值有一个,所以在这里采用单例设计

代码实现:

/** 号票管理机器,有三个票务管理器,VIP、普通、快速*/
public class NumberMachine {private NumberManager commonManager = new NumberManager();// 普通票务管理器private NumberManager expressManager = new NumberManager();// 快速票号管理器private NumberManager VIPManager = new NumberManager();// VIP票务管理器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;}
}

三)、定义三种类型的窗口

1、因为数据集中的数据是固定的所以在这里就可以采用枚举的方式定义

2、因为需要定义我们自己的打印格式,所以在这里需要覆盖tostring方法

代码实现:

//定义三种窗口
public enum CustomerType {COMMON, EXPRESS, VIP;@Overridepublic String toString() {switch (this) {case COMMON:return "普通";case EXPRESS:return "快速";case VIP:return name();}return null;}}

四)常量的定义:

作为一个习惯,在整个工程中最好要用到的常量都统一定义在一个类中,方便管理

常量类的定义:

/** 定义常量*/
public class Constants {public static final int MAX_SERVER_TIME = 10000;public static final int MIN_SERVER_TIME = 1000;public static final int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}

五)定义服务窗口:

1、这个类提高了设置窗口类型和窗口号的功能

2、定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法

3、定义三个方法分别对三种客户进行服务,为了观察运行效果,添加了一些细节信息

代码实现:

/*** 没有把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();}	}
}

六)定义测试主类:

1、用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。

2、再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的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);}}




http://chatgpt.dhexx.cn/article/qtfKcDPH.shtml

相关文章

基于C++实现银行业务系统

1. 分析 1.1 背景分析 银行业务系统的设计师银行不可缺少的部分之一。既是银行为顾客提供优良服务的承载着&#xff0c;又是银行能高效处理业务的秘诀&#xff0c;所以一个良好的银行业务系统应能按照每个窗口的业务员的处理能力相应调整业务处理的顺序。 随着银行业主数量和…

创意人像海报故障艺术海报教程故障艺术海报怎么做

制作之前我们可以参考一下真实的电视故障效果&#xff0c;然后通过PS功能来实现。首先要分析一下图片合适不合适&#xff0c;图片太小会不会看不出来效果等各种问题。类似这种效果最好上半身人像为好&#xff0c;这样做出来的效果会更加的明显。文章来源&#xff1a;http://www…

海报设计PSD模板——抖音Glitch故障艺术风格

作为新的艺术形式&#xff0c;它其实来源于我们生活中一个十分恼人的情景——数据和数字设备的故障。 矢量ai几何抽象故障风banner 矢量ai几何抽象故障风banner 画面出现异常、失真、变形、破碎等混乱情况&#xff0c;导致我们观看的欲望也没有了……但艺术家们却从这些偶然产…

Spring Cloud 极简入门

专栏亮点 优势 内容通俗易懂&#xff0c;更适合初学者。重实操性&#xff0c;专栏包含一个完整的项目实战&#xff0c;通过开发项目掌握技术的实际应用。案例理论结合&#xff0c;专栏以实际案例为主&#xff0c;更有利于上手应用。 专栏特色 从零讲起&#xff0c;轻松入门…

汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实

作者 | 陈彩娴 深度强化学习的故事&#xff0c;可以追溯到2015年&#xff1a; 当时&#xff0c;位于英国伦敦的一家小公司 DeepMind 在《Nature》上发表了一篇文章“Human-level control through deep reinforcement learning”&#xff0c;提出了一种新算法叫 Deep Q-Networ…

Hey AI,请写一首披头士风格的歌给我

编译 | 张震; Nurhachu Null; 王宇欣 作者 | Ben Dickson 来源 | pcmag 五月末&#xff0c;在东伦敦 Stepney 区的 St. Dunstan 教堂聚集了一小群人&#xff0c;他们一起欣赏了两个小时的爱尔兰传统音乐。不过&#xff0c;与以往的音乐会不同的是&#xff0c;部分音乐的作曲…

Oracle 18c体系架构图创作之路 - 设计者说(精品海报大放送)

编辑说明&#xff1a;在刚刚落幕的第八届数据技术嘉年华大会现场&#xff0c;我们正式发布了『Oracle 18c体系架构图』&#xff0c;应广大网友的呼吁&#xff0c;特别向不能到场的朋友放送。 &#xff08;回顾嘉年华&#xff1a;云数据库时代&#xff1a;企业数据架构的云化智能…

自学 Photoshop 2022 Mac版-笔记1

最近开始系统学习 photoshop。 非设计专业&#xff0c;工作跟设计部门接触过&#xff0c;最近想自己也能上手操作一些修图做图的操作&#xff0c;想看看学习多久能达到熟练的水平。 我用的是 PS 2022 Mac 版。 用输出倒逼自己输入&#xff0c;写笔记是个好方法啊&#xff01…

PS动作一键设计数字科技未来海报效果

动作支持CS4以版本软件,动作还是到陌鱼社区下载“人工智能故障风科技海报效果PS动作合集”有3个效果&#xff0c;下面我们来演示一个&#xff0c;其它使用方法相同。 01、打开软件&#xff0c;载入画笔、图案、动作,关闭软件。 02、把软件切换成英文,回顾一下之前教程“怎么把P…

我竟然在CSDN玩游戏??,教你利用github page在CSDN主页放置小游戏

好耶&#xff01;又多了一种摸鱼新方式 大家在网页端看我的主页或者博客时&#xff0c;会发现左侧多了一个小游戏hiahiahia&#xff1a; 这主要是通过github page创建了小游戏页面&#xff0c;并且通过iframe嵌入到html里实现的&#xff0c;大佬看到这应该已经会了&#xff0c;…

磨金石教育设计干货分享|20个海报设计小技巧,果断打包带走

我们做海报设计的时候&#xff0c;经常会在图文排版上花上很长的时间来构思&#xff0c;要让主题突出、要画面有活力、视觉冲击力要强、要给观者留下深刻的印象......那么今天小编就来分享20种海报设计的思路&#xff0c;让你在设计中思路清晰&#xff0c;努力不白费。 文字分…

用代码生成Glitch Art风格的抖音字体

最近看到不少文章教大家用 photoshop 实现抖音的 logo 跟字体&#xff0c;我也非常喜欢这种风格的字体&#xff0c;于是趁着晚上的时间&#xff0c;动手用代码实现了下此类风格的字体特效&#xff0c;顺便开发了个小工具&#xff0c;地址见文末。本文主要是从 艺术手法 和 JS …

mfc对话框ok没效果_利用PS制作逼真双重曝光效果案例演示,合成紫色城市建筑风格海报图片...

PS合成得好&#xff0c;那场景海报图制作就轻松了&#xff0c;我们通常在欣赏案例作品是发现不少大气的城市建筑风格的海报图片&#xff0c;是怎么样制作合成的呢&#xff0c;今天我们来分享PS制作逼真双重曝光效果的海报教程。摄影时&#xff0c;利用多重曝光&#xff0c;可以…

设计干货模板|孟菲斯风格促销海报让作品艺术加分!

对于孟菲斯&#xff0c;或许你不知道这专业词是什么意思。当你看到下面的图&#xff0c;是不是感觉有点似曾相识。 复古又新潮的设计&#xff01; 为什么叫“孟菲斯”&#xff1f;据说&#xff0c;设计师Ettore Sottsass与一群年轻设计师在家里的公寓聚会&#xff0c;当时播放…

怎么做抖音故障艺术风格人物照片效果

今天我们就用陌鱼社区“80年代复古故障抖音海报效果PS动作”,简单快速制作出复古故障艺术风格人物照片海报效果,只要按这个步骤来就可以制作出如图效果,下面是这个动作制作的一些效果&#xff1a; 01、载入笔刷、图案、动作具体方法可参考下图,全部载入之后关闭软件。 02、把软…

如何用ps做故障艺术风格效果

今天这个教程主要是用PS动作来做的&#xff0c;能给我们在工作上面带来很大的方便&#xff0c;特别是突然做故障艺术风格海报的人来说&#xff0c;这个还是非常有用滴&#xff0c;至于动作怎么找&#xff0c;可以搜“赛博故障风格海报艺术效果PS动作”。 01、还是老样子&#x…

AE教程丨1分钟学会制作信号故障风特效

信号故障风近几年还是很流行的&#xff0c;如何让自己的设计里也能有一些信号故障风的风格呢&#xff1f;今天的教程就来帮助大家学习AE制作故障风视频。 AE制作信号故障风视频效果教程 1.在绘图工具内制作相应的文字海报并导入到AE&#xff1b; 2.新建纯色图层做抖动效果&…

JAVA线上故障排查全套路

线上故障主要会包括cpu、磁盘、内存以及网络问题&#xff0c;而大多数故障可能会包含不止一个层面的问题&#xff0c;所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的&#xff0c;基本上出问题就是df、free、top 三连&#x…

Ps|故障风格效果

欢迎点击「算法与编程之美」↑关注我们&#xff01; 本文首发于微信公众号&#xff1a;"算法与编程之美"&#xff0c;欢迎关注&#xff0c;及时了解更多此系列文章。 欢迎加入团队圈子&#xff01;与作者面对面&#xff01;直接点击&#xff01; 抖音作为当代人消遣时…

故障效果,制作抖音效果的幻影海报

故障效果&#xff0c;制作抖音效果的幻影海报 感兴趣的小伙伴可以关注我哦&#xff0c;有什么不懂可以加群问&#xff1a;741090028 本篇教程通过PS制作抖音效果风格的海报&#xff0c;抖音风格又叫故障效果和幻影效果&#xff0c;前者叫的多&#xff0c;此类风格之前就很流行…