page contents

java代码实现银行管理系统

本文实例为大家分享了java银行管理系统的具体代码,供大家参考。 一、系统要求 1、银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 2、有三种对应类型...

本文实例为大家分享了java银行管理系统的具体代码,供大家参考。

一、系统要求

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

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

3、异步随机生成各种类型的客户,生成各类型用户的概率比例为:
VIP客户 :普通客户 :快速客户  =  1 :6 :3。

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

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

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

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

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


二、系统简析

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

(1)、自己知道每个客户其实就是由银行的一个取号机器产生号码的方式来通知用户办理相关业务的。所以,定义一个号码管理器对象,让这个对象不断地产生号码,就等于随机生成了客户。
(2)、因为有三类客户,每类客户的号码编排都是完全独立的,所以,我想到本系统一共要产生三个号码管理器对象,各自管理一类用户的排队号码。这三个号码管理器对象统一由一个号码机器进行管理,这个号码机器在整个系统中始终只能有一个,所以,它要被设计成单例。

2、各类型客户在对应窗口按顺序依次办理业务 ,也可以说是各个窗口依次叫号。

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


三、系统分析

1、NumberManager类分析:

(1)、定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
(2)、定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。

2、NumberMachine类分析:

(1)、定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象。
(2)、将NumberMachine类设计成单例。 

3、CustomerType枚举类分析:

(1)、系统中有三种类型的客户,所以用定义一个枚举类,其中定义三个成员分别表示三种类型的客户。
(2)、重写toString方法,返回类型的中文名称。这是在后面编码时重构出来的,刚开始不用考虑。

4、ServiceWindow类分析:

(1)、定义一个start方法,内部启动一个线程,根据服务窗口的类别分别循环调用三个不同的方法。 
(2)、定义三个方法分别对三种客户进行服务,为了观察运行效果,应详细打印出其中的细节信息。

5、MainClass类分析:

(1)、用for循环创建出4个普通窗口,再创建出1个快速窗口和一个VIP窗口。
(2)、接着再创建三个定时器,分别定时去创建新的普通客户号码、新的快速客户号码、新的VIP客户号码。

6、Constants类分析:

定义三个常量:MAX_SERVICE_TIME、MIN_SERVICE_TIME、COMMON_CUSTOMER_INTERVAL_TIME

7、程序图解:


四、系统详解

1、NumberManager.java文件的创建:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class NumberManager {
  4. private int lastNumber = 0;
  5. private List queueNumbers = new ArrayList();// 定义ArrayList集合
  6. /*
  7. * 1、定义一个用于存储上一个客户号码的成员变量和用于存储所有等待服务的客户号码的队列集合。
  8. */
  9. public synchronized Integer generateNewNumber() {// 上锁
  10. queueNumbers.add(++lastNumber); // 添加到集合中
  11. return lastNumber;// 返回最后一个数值
  12. }
  13. /*
  14. * 2、定义一个产生新号码的方法和获取马上要为之服务的号码的方法,这两个方法被不同的线程操作了相同的数据,所以,要进行同步。
  15. */
  16. public synchronized Integer fetchNumber() {
  17. if (queueNumbers.size() > 0) {// 如果集合queueNumbers中有元素
  18. return (Integer) queueNumbers.remove(0);// 返回移除了第一个元素Integer类型
  19. } else {
  20. return null;// 返回空
  21. }
  22. }
  23. }

2、NumberMachine.java文件的创建:

  1. public class NumberMachine {// 单例设计模式
  2. private NumberMachine() {
  3. }// 私有化方法
  4. private static NumberMachine instance = new NumberMachine();
  5. public static NumberMachine getInstance() {
  6. return instance;// 例子instance
  7. }
  8. /*
  9. * 定义三个成员变量分别指向三个NumberManager对象,分别表示普通、快速和VIP客户的号码管理器,定义三个对应的方法来返回这三个NumberManager对象
  10. * 。
  11. */
  12. private NumberManager commonManager = new NumberManager();
  13. private NumberManager expressManager = new NumberManager();
  14. private NumberManager vipManager = new NumberManager();
  15. public NumberManager getCommonManager() {
  16. return commonManager;// 和下面的一样,返回一下
  17. }
  18. public NumberManager getExpressManager() {
  19. return expressManager;
  20. }
  21. public NumberManager getVipManager() {
  22. return vipManager;
  23. }
  24. }

3、CustomerType.java文件的创建:

  1. public enum CustomerType {// 枚举类CustomerType
  2. COMMON, EXPRESS, VIP;
  3. public String toString() {
  4. String name = null;
  5. switch (this) {
  6. case COMMON:
  7. name = "普通";//如果出现COMMON字样,就是name就是普通用户
  8. break;
  9. case EXPRESS:
  10. name = "快速";//如果出现EXPRESS,就是快速用户
  11. break;
  12. case VIP:
  13. name = name();//如果出现vip,就是贵宾了
  14. break;
  15. }
  16. return name;
  17. }
  18. }


4、ServiceWindow.java文件的创建:

  1. import java.util.Random;
  2. import java.util.concurrent.Executors;
  3. import java.util.logging.Logger;
  4. /**
  5. * 没有把VIP窗口和快速窗口做成子类,是因为实际业务中的普通窗口可以随时被设置为VIP窗口和快速窗口。
  6. * */
  7. public class ServiceWindow {
  8. private static Logger logger = Logger.getLogger("cn.itcast.bankqueue");//一个系统日志的创建
  9. private CustomerType type = CustomerType.COMMON;//用户类型调用“枚举类CustomerType”默认值是“普通用户”
  10. private int number = 1;
  11. public CustomerType getType() {
  12. return type;
  13. }
  14. public void setType(CustomerType type) {//set有参数
  15. this.type = type;
  16. }
  17. public void setNumber(int number){
  18. this.number = number;
  19. }
  20. public void start(){//start方法用来
  21. Executors.newSingleThreadExecutor().execute(
  22. new Runnable(){
  23. public void run(){//复写run方法
  24. //下面这种写法的运行效率低,最好是把while放在case下面
  25. while(true){
  26. switch(type){
  27. case COMMON://普通用户
  28. commonService();//执行普通用户方法
  29. break;
  30. case EXPRESS://快速用户
  31. expressService();//执行快速用户方法
  32. break;
  33. case VIP://vip用户
  34. vipService();//执行vip用户方法
  35. break;
  36. }
  37. }
  38. }
  39. }
  40. );
  41. }
  42. private void commonService(){//普通用户方法
  43. String windowName = "第" +
    • 发表于 2020-01-02 11:58
    • 阅读 ( 678 )
    • 分类:Java开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章