【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方法,目前我仅设置其功能为 输出提示。

        代码实现如下:


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

案例118:基于微信小程序的电影院订票选座系统设计及实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

安卓手机变iOS!

Launcher iOS 16 - 安卓手机秒变iOS Launcher iOS 16 是一款iOS启动器&#xff0c;可以将安卓手机桌面变成iOS样子&#xff0c;还有iOS的开机动画和景深效果&#xff01; 下载链接&#xff1a;【Launcher iOS 16】 ​

python flask学生管理系统

预览 前端 jquery css html bootstrap: 4.x 后端 python: 3.6.x flask: 2.0.x 数据库 mysql: 5.7 学生管理模块 登录、退出查看个人信息、修改个人信息成绩查询查看已选课程选课、取消选课搜索课程课程列表分页功能 教师模块 登录、退出查看个人信息、修改个人信息录入…

为什么选择Go语言编写网络应用程序

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 作为一名后端开发者&#xff0c;你一定对选择合适的编程语言来编写网络应用程序非常重视。在众多的编程语言中&#xff0c;Go语言…

Vue keep-alive的使用和原理解析

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

持续集成-Jenkins显示HTML报告

1 需要安装startup-trigger-plugin和Groovy插件。 2 在Job配置页面&#xff0c;构建触发器&#xff0c;勾选Build when job nodes start&#xff1b; 3 在Job配置页面&#xff0c;增加构建步骤Execute system Groovy script&#xff0c;在Groovy Command中输入上面命令&…

图神经网络|图注意网络Graph Attention Network

图注意网络Graph Attention Network Leaky ReLU 有利于压低负数对结局的影响。 图注意网络Graph Attention Network的流程 输入向量 h i h_i hi​乘上权重矩阵W得到对应的向量 h i ∗ h_i^* hi∗​,并将 h i ∗ h_i^* hi∗​计算出对应的 a i a_i ai​,从而得到最终对结果向量…

AcWing 103. 电影(map、pair连用or离散化)

题目 方法一&#xff08;mappair&#xff09; 其实上面这么长巴拉巴拉就是在说 首先&#xff0c;每个科学家会的语言都不同。但是呢每部电影的字幕和语言是不一样的&#xff08;字幕和语言一定不相同&#xff09; 要求找到一部电影使得在场能听懂的科学家最多&#xff08;如果存…

neo4j 图数据库 py2neo 操作 示例代码

文章目录 摘要前置NodeMatcher & RelationshipMatcher创建节点查询获取节点节点有则查询&#xff0c;无则创建创建关系查询关系关系有则查询&#xff0c;无则创建 Cypher语句创建节点 摘要 利用py2neo包&#xff0c;实现把excel表里面的数据&#xff0c;插入到neo4j 图数据…

5288 SDH/PDH数字传输分析仪

5288 SDH/PDH数字传输分析仪 数字通信测量仪器 5288 SDH/PDH数字传输分析仪为高性能手持式数字传输分析仪&#xff0c;符合ITU-T SDH/PDH技术规范和我国光同步传输网技术体制的规定,支持2.048、34.368、139.264Mb/s及155.520Mb/s传输速率的测试。可进行SDH/PDH传输设备和网络的…

软件测试|如何使用Python显示指定年份日历

前言 如何在Python中打印日历&#xff1f;Python中提供了一个内置模块Calendar来打印展示日历&#xff0c;并且还提供了许多基于日历的操作&#xff0c;本文将向大家介绍如何使用Python来打印显示日历&#xff0c;并且对日历进行相应操作。 如何在Python中使用calendar Cale…

Java--RSA非对称加密的实现(使用java.security.KeyPair)

文章目录 前言实现步骤测试结果 前言 非对称加密是指使用不同的两个密钥进行加密和解密的一种加密算法&#xff0c;调用方用使用服务方提供的公钥进行加密&#xff0c;服务方使用自己的私钥进行解密。RSA算法是目前使用最广泛的公钥密码算法。Java提供了KeyPairGenerator类要生…

Open3D 反算点云缩放系数(21)

Open3D 反算点云缩放系数(21) 一、算法介绍二、算法实现1.方法12.方法2(通用)一、算法介绍 上一章按照指定的系数,对点云进行了等比例缩放,这里输入缩放后的两块点云,反算二者之间的缩放系数。 二、算法实现 已知使用的俩点云是1/2的缩放关系,用于验证计算结果是否…

SpringMVC(六)RESTful

1.RESTful简介 REST:Representational State Transfer,表现层资源状态转移 (1)资源 资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源组成。每个资源是服务器上一个可命名的抽象概念。因为资源是一个抽象的概念,所以它不仅仅能代表服务器文件系统中的一个文件…

解决Unexpected record signature 0X9maven 资源过滤

解决Unexpected record signature: 0X9|maven 资源过滤 记录问题&#xff1a;我们有个需求是根据excel模版导出一个excel表。我们的项目是SpringBoot&#xff0c;所以理所当然的把这个模版文件放到了&#xff0c;resources文件夹中。但是在导出文件的时候却遇到了invalid code …

黑马本地生活(列表页面,详情页面)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、列表页面功…

iPhone“查找”最多可添加32个物品!

对于那些丢三落四的果粉来说&#xff0c;苹果的“查找”功能是一大福音。不管是丢失了iPhone、iPad、Mac、AirPods还是AirTag&#xff0c;都可以通过“查找”功能在地图上追踪设备的位置&#xff0c;甚至是远程锁定或抹掉设备的数据。 那么&#xff0c;iPhone的查找一次能支持添…

关于 ant-design-vue resetFields 失效

关于 ant-design-vue resetFields 失效 背景&#xff1a; 遇到这样的问题使用ant-design-vue useForm来制作表单的时候&#xff0c;resetFields()失效 场景&#xff1a; 编辑 -赋值 新增-初始值&#xff08;问题点&#xff1a;新增的时候他就不初始化&#xff09; 方案&…

机器人技能学习-构建自己的数据集并进行训练

概要 若想训练自己的场景&#xff0c;数据集的重要性不做过多赘述&#xff0c;下面就基于 robomimic 和 robosuite 构建自己的数据集进行讲解&#xff0c;同时&#xff0c;也会附上 train 和 run 的流程&#xff0c;这样&#xff0c;就形成了闭环。 自建数据集 采集数据 采…

RabbitMQ学习笔记

介绍 名词解释 Broker&#xff1a;接受和分发消息的应用&#xff0c;例如RabbitMQ Server Virtual host:出于多租户和安全因素设计的&#xff0c;把AMQP的基本组件划分到一个虚拟的分组中&#xff0c;类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ serv…