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

news2024/12/24 21:08:16
图片出处: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.coloradmin.cn/o/1382025.html

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

相关文章

OceanBase架构概览

了解一个系统或软件&#xff0c;比较好的一种方式是了解其架构&#xff0c;下图是官网上的架构图&#xff0c;基于V 4.2.1版本 OceanBase 使用通用服务器硬件&#xff0c;依赖本地存储&#xff0c;分布式部署在多个服务器上&#xff0c;每个服务器都是对等的&#xff0c;数据库…

YOLOv8改进 | 注意力篇 | 实现级联群体注意力机制CGAttention (全网首发)

一、本文介绍 本文给大家带来的改进机制是实现级联群体注意力机制CascadedGroupAttention,其主要思想为增强输入到注意力头的特征的多样性。与以前的自注意力不同,它为每个头提供不同的输入分割,并跨头级联输出特征。这种方法不仅减少了多头注意力中的计算冗余,而且通过增…

【国内访问github不稳定】可以尝试fastgithub解决这个问题

1、下载 https://github.com/dotnetcore/FastGithub https://github.com/dotnetcore/FastGithub/releases 官网下载即可&#xff0c;比如&#xff0c;我用的是这个&#xff1a;fastgithub_osx-x64.zip&#xff08;点这里下载&#xff09; 2、安装 如下图双击启动即可 3、…

【SSM框架】SpringMVC

SpringMVC简介 SpringMVC概述 SpringMvC是一种基于Java实现MVC模型的轻量级web框架 SpringMVC技术与Servlet技术功能等同&#xff0c;用于表现层功能开发 SpringMVC入门 1、导入坐标 <dependency><groupId>javax.servlet</groupId><artifactId>ja…

Docker安装Odoo17

Docker安装Odoo 前言所需环境安装步骤登录Odoo 配置数据库 前言 Odoo是一个开源的ERP框架&#xff0c;它提供了一套完整的、可定制的、模块化的企业管理软件解决方案。以下是Odoo的主要特点&#xff1a; 模块化设计&#xff1a;Odoo的各个功能都以模块的形式提供&#xff0c;包…

三端负电源电压调节器79LXX,具有一系列固定电压输出,适用于小于100mA电源供给的场合

79LXX系列三端负电源电压调节器是单片双极型线性集成电路&#xff0c;采用TO92、SOT89-3的封装形式封装&#xff0c;有一系列固定的电压输出&#xff0c;适用于小于100mA电源供给的场合。 主要特点&#xff1a; 最大输出电流为100mA 固定输出电压分别为-5V、-6V、-8V、-9V、-10…

Windows无法登录管理路由器故障排查

问题描述 家里的路由器使用拨号上网&#xff0c;路由器DHCP分发IP的范围是192.168.1.0/24。默认使用192.168.1.1管理路由器。然后拨号上网成功后&#xff0c;修改了私网IP的分发范围&#xff1a;192.168.5.1-192.168.5.10。为了防止有人蹭网&#xff0c;只分配的10个IP地址。修…

html5基础入门

html5基础语法与标签 前言前端开发零基础入门介绍前端开发行业介绍&#xff1a;大前端时代&#xff1a;前端开发主要技术介绍学习方法IDE简介vscode快捷键&#xff1a; 总结 HTML语法与基础标签互联网基本原理HTTP协议&#xff08;请求、响应&#xff09;什么是前端、后端&…

MongoDB认证考试小题库

Free MongoDB C100DBA Exam Actual Questions 关于MongoDB C100 DBA 考试真题知识点零散整理 分片架构 应用程序 --> mongos --> 多个mongod对于应用来说&#xff0c;连接分片集群跟连接一台单机mongod服务器一样分片好处&#xff0c; 增加可用RAM、增加可用磁盘空间、…

C++ 实现游戏(例如MC)键位显示

效果&#xff1a; 是不是有那味儿了&#xff1f; 显示AWSD&#xff0c;空格&#xff0c;Shift和左右键的按键情况以及左右键的CPS。 彩虹色轮廓&#xff0c;黑白填充。具有任务栏图标&#xff0c;可以随时关闭字体是Minecraft AE Pixel&#xff0c;如果你没有装&#xff08;大…

网络安全技术新手入门:利用永恒之蓝获取靶机控制权限

目录 前言 一、搜索永恒之蓝可用模块 二、使用攻击模块 三、配置攻击模块 四、攻击 五、总结 前言 相关法律声明&#xff1a;《中华人民共和国网络安全法》第二十七条 任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动&…

网络安全技术新手入门:在docker上安装dvwa靶场

前言 准备工作&#xff1a;1.已经安装好kali linux 步骤总览&#xff1a;1.安装好docker 2.拖取镜像&#xff0c;安装dvwa 一、安装docker 输入命令&#xff1a;sudo su 输入命令&#xff1a;curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key …

MATLAB - 机器人关节空间运动模型

系列文章目录 前言 关节空间运动模型描述了在闭环关节空间位置控制下机械手的运动&#xff0c;在关节空间运动模型&#xff08;jointSpaceMotionModel&#xff09;对象和关节空间运动模型块中使用。 机器人机械手是典型的位置控制设备。要进行关节空间控制&#xff0c;需要指…

C# 图解教程 第5版 —— 第24章 预处理指令

文章目录 24.1 什么是预处理指令24.2 基本规则24.3 符号指令&#xff08;#define、#undef &#xff09;24.4 条件编译&#xff08;#if、#else、#elif、#endif&#xff09;24.5 条件编译结构24.6 诊断指令&#xff08;#warning、#error&#xff09;24.7 行号指令&#xff08;#li…

order by之后的injection(sqllabs第四十六关)

order by相关注入知识 这一关的sql语句是利用的order by 根据输入的id不同数据排序不一样可以确定就是order by order by后面无法使用ubion注入&#xff08;靠找不到&#xff09; 可以利用后面的参数进行攻击 1&#xff09;数字 没作用考虑布尔类型 rand和select ***都可以 …

瑞幸黑金鹿王者霸屏尊享权益的技术实现方式探讨

上周六&#xff0c;公司加班举办技术专场招聘活动&#xff0c;在忙碌的下午茶歇时间&#xff0c;我尊敬的伟大的韩百万老师提议带着我去瑞幸装了个 BI&#xff0c;扫码领取咖啡的那一个瞬间&#xff0c;瑞幸店内的电视大屏上赫然显示了&#xff1a;韩百万。回来的路上我虚心请教…

gem5学习(14):将gem5扩展到ARM——Extending gem5 for ARM

目录 一、Downloading ARM Binaries 二、Building gem5 to run ARM Binaries 三、Modifying simple.py to run ARM Binaries 四、Running gem5 五、ARM Full System Simulation An aside on FS simulations 这个是gem5-learning中Getting Started的最后一篇文章&#xff…

OpenCV-24双边滤波

一、概念 双边滤波对于图像的边缘信息能够更好的保存。其原理为一个与空间距离相关的高斯函数与一个灰度距离相关的高斯函数相乘。 空间距离&#xff1a;指的是当前点与中心点的欧式距离。空间域的高斯函数及其数学形式为&#xff1a; 其中&#xff08;xi&#xff0c;yi&…

【Linux】Linux 系统编程——cd 命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 “cd 命令&#xff0c;即 ‘change directory’ 的缩写&#xff0c;主要用于 Unix、Linux 和 macOS 等操作系统中&#xff0c;用于改变当前工作目录。该命令支持绝对路径和相对路径两种形式。若未指定…

关于运维·关于数据库面试题

目录 一、数据库类型 二、数据库引擎 三、mysql数据库类型 四、mysql的约束添加 五、主从复制原理 六、主从方式有几种 七、mysql主从数据不一致的原因 八、mysql的优化 九、什么是事务的特征 十、数据库读写分离的好处 十一、怎样优化sql语句 十二、mysql的同步方…