【JavaSE语法】图书管理系统实现详解

图片出处:The world's biggest drone photo and video sharing platform | SkyPixel.com 

 导言

        在学完JavaSE语法后,我们就可以去尝试写一个简单的图书管理系统来进一步提升我们面对对象编程的思想。在该系统中会涉及到数组,接口,封装,继承,多态等等语法知识,希望能够帮助到大家!


目录

 导言

1,需求分析

(1)找对象

(2)功能设计

2,创建对象

(1)使用包对类进行管理

(2)对象的创建

(1)aboutTheBook包

(2)operations包

(3)aboutUsers包 

3,代码框架搭建

(1)login方法

(2)main方法 ==> 代码总逻辑

(3)框架测试

4,具体功能实现 

(1)Show类

(2)Add类 

(3)Delete类

(4)Borrow类 和 Return类

(5)Find类

(6)Modify类

(7)Top类 

(8)Exit类


1,需求分析

(1)找对象

        在开始编写代码之前,我们需要先找到该系统可能涉及的对象,如下:

书 

书架 

管理员

普通用户

(2)功能设计

        我将根据使用者访问权限的不同,计划分为两个使用者类,如下:

管理员:

  • 上架图书
  • 下架图书
  • 查找图书
  • 显示所有图书
  • 修改图书状态
  • 退出系统

普通用户:

  • 借阅图书
  • 归还图书
  • 查找图书
  • 图书借阅排行榜
  • 退出系统

        可以看出,上述所有功能都是依赖于书架进行操作的,但是由于需要区分使用权限,故将所有功能统一放在一个包中,再在用户类中以转移表的方式进行调用,此操作在后续会进行详细讲解。

2,创建对象

        当找到对象后,就可以开始创建对象,我们可以先将所想到的属性详尽地描述,后续再查漏补缺。同时,在创建对象时需要注意类的封装性。

(1)使用包对类进行管理

        在创建对象之前,先按照对象的类型创建三个包:

aboutTheBook --关于书的包,存放书架,书等类

aboutUsers      --关于用户的包,存放管理员,普通用户等类

operations        --关于操作方法的包 

(2)对象的创建

(1)aboutTheBook包

<1>Book类

        对于Book类而言,可根据具体需求对其添加属性,并且由于它是本系统中最基础的操作单位,故要对其进行封装。

<2>BookShelf

        BookShelf类主要用来存放书,并对书进行管理。此处我使用的是数组结构,如下:

(2)operations包

<1>IOperation类

        在operation包中存放的是所有和图书管理有关的操作方法类,故我创建了接口IOperation,并让每个类都实现该接口。由此便可使用 IOperation类型数组对所有的方法进行组织。

      目前IOPeration接口代码如下:

        (因为所有的操作都是围绕书架进行的,故work的参数列表中应当传递BookShelf)

        

<2>操作方法类

        操作方法在后文中会详细地讲到,目前只是代码框架的搭建,以Add类为例,目前每个类的实现如下:

(3)aboutUsers 

<1>User类

  在aboutTheBook包中,我定义了三个类,分别是抽象类User,普通类AdminUser,普通类NormalUser,其中AdminUser类和NormalUser类均继承于User类。

  那么为什么需要定义一个抽象类呢?如下:

   上图是目前User类的全部代码,可以看到在该类中声明了两个抽象方法,分别是:

public abstract int menu();  -->打印菜单,并且返回所输入的值
public abstract void doOperation(int choose, BookShelf bookShelf); -->转移表操作

        AdminUser类 和 NormalUser类 继承 User类,并且重写 User类 的抽象方法,那后续就可以直接使用父类类型去实例化子类对象,再调用重写方法,此时就会发生动态绑定,直接调用所引用的子类的重写方法,从而实现多态性。

        届时,我们只需要根据用户选择的登录方法返回相应的实例化对象交给User类型接收,直接使用User类型变量去调用方法即可。

<2>AdminUser类 与 NormalUser类

AdminUser类:

NormalUser类: 

        通过上述代码可以看到,AdminUser类与NormalUser类只需对父类中的抽象方法进行实现即可,并无其它自有的属性。唯一的区别在于:由于操作权限的不同,导致菜单与转移表的内容不同。

  menu方法逻辑注解:

        (以NormalUser为例)

doOperation方法逻辑注解:

        (以NormalUser为例)

3,代码框架搭建

         在前文中,我们已经完成找对象与使用对象这两个步骤,接下来我们利用对象之间的交互来实现代码框架的代码,通过Main类中的main函数将所有类、方法、接口串联起来。

(1)login方法

        在运行程序之初,我们需要完成用户登录这一操作,故封装login方法,代码如下:

(2)main方法 ==> 代码总逻辑

        main方法代码如下:

        代码逻辑如下(假设login返回的是NormalUser的实例对象):

(每个函数具体的实现逻辑在上文均有详细讲解,图中黄线为主逻辑,红线为所调用的代码)

 (3)框架测试

        (实际测试了很多情况,上图为最基本的使用场景)      

        至此,代码框架均已搭建完毕,而操作方法的具体实现会在下文中进行详细讲解。

4,具体功能实现 

        对于一些接口的方法会在下面类中重复使用到,我仅对其第一次出现时进行解答,后续再出现将不再赘述

        (1)Show类

        为了能够更好地展示后续对图书的上架,下架等操作,故先实现Show类。

        Show的功能设定为展示所有图书,顾名思义就是将打印顺序表中的所有有效元素。分两个步骤:判空和打印。考虑到后续其它类的实现也会使用到判空,故我创建了ICheckIsEmpty接口用于判空。

        不过直接使用 System.out.println 打印对象其真实打印的是对象的地址,故我们还需要先在Book类中重写 toString 方法,如下:

       

        代码实现如下:

        控制台示例输出如下:

         (2)Add类 

        Add的功能设定为上架图书,即是增加元素。既然是增加元素,那么就需要考虑空间是否已经满了,若是满了则需要扩容后再添加元素。为此,我创建了ICheckCapacity接口用于检查内存。

        由于其需要在书架中添加书,所以需要先在BookShelf类中新增一个 设置pos位置数据 的对外方法,如下:

       

        Add类代码如下:

        控制台示例输出如下:

        (3)Delete类

        Delete类的功能设定为下架图书,实际就是在书架中删除该图书。在删除之前需要判断两个前置条件:     

        1:书架不能为空

        2:待删除的书不能不存在

        故我们除去判空接口之外,还需要创建一个查找接口,用于查找特定的元素,并返回其下标,具体实现如下:

        控制台示例输出如下:

         (4)Borrow类 和 Return类

        Borrow类的功能设定是借阅图书,而Return类的功能设定是归还图书。由于两者代码逻辑高度相似,故为了避免重复啰嗦,于是我将这两个类放在一起讲解。

        在图书馆里系统中,无论是借阅还是归还,只需修改其书籍借阅状态即可,在本系统中我还添加了书籍借阅次数,所以在每次借阅成功之后,借阅次数需要+1。

        代码实现如下:

Borrow类(借阅图书)

Return类(归还图书)           控制台输出示例如下:

(借阅)

 (归还)

        (5)Find类

        Find类的功能设定为查找图书,逻辑较为简单。

        代码实现如下:

               控制台输出示例如下:

         (6)Modify类

        Modify类的功能设定为修改指定下标元素的信息。

        代码实现如下:

        控制台输出示例如下:        

        (7)Top类 

        Top类的功能设定为图书借阅次数排行榜,但是由于作者还未学习数据库相关知识,暂时不能实现代码持久化,故借阅次数会随着程序的关闭而清除,请您见谅...

        代码实现如下:

         控制台输出示例如下:

        (8)Exit类

        在mian方法中,当我们输入零时,便会结束运行本次程序。在结束之前,还会运行Exit类中的work方法,目前我仅设置其功能为 输出提示。

        代码实现如下:


        本系统目前只是初具雏形,在以后,我会随着自己技术的提升不断对该系统进行优化,希望这一天能够尽快到来!

        感谢大家的观看,希望这篇文章能让您有所收获!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城项目|es的应用场景及常见问题

es是什么 es多被用于搜索聚合分析引擎 是分布式的可以高性能查询的引擎 es应用场景 为什么不用MYSQL而用es es将数据存在内存中且可以分布式的存储数据 商品上架 商品在es中的保存 1.在es中建立索引 spu sku spu sku保存在一起防止分布查询 为了防止对象数组扁平化&#xff…

Unity摇杆+键鼠控制位移、旋转

1、位移 首先我们找到两张图片&#xff0c;一个大圆一个小圆&#xff0c;像这样&#xff1a; 结构是这样的&#xff1a; 然后&#xff0c;新建一个场景&#xff0c;用胶囊去做玩家&#xff0c;摄像机在胶囊下&#xff0c;并且在场景中放两个cube作为参照物 像这样搭好后&#…

探索商超货架场景目标检测性能,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建商超货架场景下亨氏米粉食品种类检测识别系统

在前面的系列博文中&#xff0c;我们陆续应用实践开发了很多有趣的项目&#xff0c;但是在密集排布场景下如商超购物场所内货架上货物种类目标检测模型的开发我们则少有涉及&#xff0c;正值周末&#xff0c;本文的主要目的就是想要实践构建这一场景下的目标检测模型&#xff0…

FPGA之初探

FPGA的构成 基本逻辑单元CLB CLB是FPGA的基本逻辑单元&#xff0c; 一个 CLB 包括了 2 个 Slices&#xff0c;所以知道Slices的数量就可以知道FPGA的“大概”逻辑资源容量了。一个 Slice 等于 4 个6输入LUT8个触发器(flip-flop)算数运算逻辑&#xff0c;每个 Slice 的 4 个触发…

AI与编程学习

在C语言中&#xff0c;指针通常与字符数组或字符串打交道时会涉及到ASCII码的转换&#xff0c;而不是用于表现多位数的第一位。48这个值对应的是ASCII码表中数字字符0的编码。 如果你有一个表示多位数的字符数组&#xff0c;例如&#xff1a; c char number[] "1234&qu…

【DC快速上手教程--1 Setup the DC】

DC快速上手教程--1 Setup the DC 0 Intro1 DC Demo 本篇系列教程介绍总结DC Flow&#xff0c;为了不涉密&#xff0c;在这里以DC labs为Demo做一个入门的介绍&#xff1b;目标&#xff1a;用起来EDA 工具是最基础也是最简单的&#xff1b;重点是如何去分析报告&#xff0c;依据…

vue3实现动态侧边菜单栏的几种方式总结

基于自建json数据的动态侧边菜单栏 后端接口json数据 src/api/menuList.js const menuList [{url: ,name: 人员管理,icon: icon-renyuan,menuId: 1,children: [{url: /user,name: 用户管理,icon: icon-jurassic_user,menuId: 1001,children: []},{url: /role,name: 角色管…

探索短链接:让网络分享更便捷

短链接是一种将长网址缩短为简洁形式的编码&#xff0c;它在互联网领域具有广泛的应用。本文将从多个方面介绍短链接的原理、类型、优势及应用场景&#xff0c;帮助您深入了解这一重要的网络技术。 短链接 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.…

【LabVIEW FPGA 编程入门】使用FPGA IO进行编程

1.在项目中新建一个VI&#xff0c;命名为FPGA IO Test。 2. 可以直接将项目中的FPGA IO拖入程序框图中。 FPGA IO的类型&#xff1a; 数字线&#xff1a; 数字端口&#xff1a; 模拟IO&#xff1a; 其他&#xff1a; 3.如果新增加了FPGA资源&#xff0c;不是创建项目时扫描到的…

Linux centos stream9 parted

在Linux中&#xff0c;常用的磁盘管理工具包括 fdisk、parted、gdisk 等。它们可以用于创建、删除、调整分区、查看分区表等操作。 传统的MBR分区表(即主引导记录)大家都很熟悉&#xff0c;是过去我们使用windows时常见的。所支持的最大卷2T&#xff0c;且对分区有限制&#x…

漏洞复现-金和OA GetAttOut接口SQL注入漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

Linux配置JAR包为服务实现自启动

一、实现bash脚本 1.1 绘图工具 绘图需安装idea的插件plantUML-Integration 只需要上图一个就可以&#xff0c;别的也不需要装。 启动服务的逻辑如下 关闭服务的逻辑如下 1.2 逻辑实现 在/root路径下创建entrance文件&#xff0c;实现逻辑如下 #!/usr/bin/env bash # 2>…

数学建模.皮尔逊相关系数假设检验

一、步骤 查表找临界值 二、更好的方法 三、使用条件 作图可以使用spss 这个图对不对还不好说&#xff0c;因为还没进行正态分布的验证 四、正态分布验证 &#xff08;1&#xff09;JB检验 所以之前的数据的那个表是错的&#xff0c;因为不满足正态分布 &#xff08;2&#xff…

设置了uni.chooseLocation,小程序中打不开

设置了uni.chooseLocation&#xff0c;在小程序打不开&#xff0c;点击没反应&#xff0c;地图显现不出来&#xff1b; 解决方案&#xff1a; 1.Hbuilder——微信开发者工具路径没有配置 打开工具——>设置 2.微信小程序服务端口没有开 解决方法&#xff1a;打开微信开发…

[Linux 进程(三)] 进程优先级,进程间切换,main函数参数,环境变量

文章目录 1、进程优先级1.1 Linux下查看进程优先级1.2 Linux 进程优先级的修改PRI and NItop命令配合操作更改优先级 1.3 竞争 独立 并行 并发 2、进程间切换3、Linux2.6内核进程调度队列3.1 活跃进程3.2 过期进程 4 main函数参数 — 命令行参数4.1 利用main函数的参数实现一个…

强化学习应用(一):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

在CentOS上设置和管理静态HTTP网站的版本控制

在CentOS上设置和管理静态HTTP网站的版本控制是一项重要的任务&#xff0c;它可以帮助您跟踪和回滚对网站所做的更改&#xff0c;确保数据的一致性和完整性。以下是在CentOS上设置和管理静态HTTP网站的版本控制的步骤&#xff1a; 安装版本控制系统在CentOS上安装Git或其他版本…

dcat admin框架开发前台

前言 dcat admin框架是一款后台框架&#xff0c;我们需要使用laravel开发前台框架&#xff0c;dcat admin本身基于laravel&#xff0c;没必要在重新创建前台项目&#xff0c;这篇文章记录我的开发过程。 开发过程 1. 迁移数据库(非必要) 对于dcat admin来说本身存在一个后台…

GPT-4V的图片识别和分析能力原创

GPT-4V是OpenAI开发的大型语言模型&#xff0c;是GPT-4的升级版本。GPT-4V在以下几个方面进行了改进&#xff1a; 模型规模更大&#xff1a;GPT-4V的参数量达到了1.37T&#xff0c;是GPT-4的10倍。 训练数据更丰富&#xff1a;GPT-4V的训练数据包括了1.56T的文本和代码数据。 …

PyCharm连接服务器 - 2

文章目录 PyCharm连接服务器-21.如何连接服务器&#xff1f;2.如何在终端窗口打开SSH连接&#xff1f;3.Terminal终端出现中文乱码的解决办法&#xff1f;4.如何查看远程服务器的树目录结构&#xff1f;5.如何配置代码同步&#xff1f;6.如何为项目配置远程服务器中的python解释…