从我开始学习java到如今,也已经有了一个月的时间,那么为了验证一个月里我们学习到的知识是否有真的学习透彻,今天我将试着使用之前学到的几乎所有知识,来试着做一个"图书管理系统"的小小练习,此篇文章也比较适合java的初学者进行阅读和复习哦~
📚 既然想要实现一个" 图书管理系统 ",我们首先就需要思考一下:我们日常生活中的" 图书管理系统 ",应该具备哪些功能呢?
① 用户角度
⭐ 就像图书馆一样,我们的" 图书管理系统 "中也应该要摆放很多的书籍(展示图书);
⭐ 来往的顾客应该能查看各种书籍,并且借书,还书;
⭐ 那么既然要借书,还书,我们就需要做到查找想要找的书;
⭐ 我们还需要做到对书籍个数,以及是否有库存进行判断;
⭐ 在当下书籍种类繁多的情况下,我们最好根据书籍热度,来展现图书热门榜为读者提供建议;
⭐ 那么图书热度榜,自然就是需要读者来点赞决定,需要实现读者图书点赞和统计个数功能;
② 管理员角度
⭐ 首先,管理员和普通用户有着本质的区别,管理员登录是需要密码(以及验证码)的;
⭐ 为了便于图书管理,我们应该将图书统计到一起并且一次性展示出来;
⭐ 而管理员管理图书,也需要时常下架图书和上架图书;
⭐ 同时,为了方便管理,管理员也要能查找图书;
⭐ 为了防止有时图书导入信息错误,需要做到修改图书信息;
⭐ 时下图书种类众多,难免有重名出现,因此我们需要为图书加上书号,通过书号分辨;
③ 总结思路图
📚 我们想要实现的效果:
📌 思路图:
📕 user 包
这个思路很简单,就是 User,底下分支一个"管理员"和"普通用户"就好了~
📕 operation 包
为了方便操作,以及增加代码的可读性和可维护性,我们可以将(用户)和(管理员)的方法分别放入两个对应的数组,数组下标代表的就是对应的方法。
而为了将各种方法都产生关联,并能够通过此关联来将其变成数组,我们就需要:
⭐ 创建各种方法的方法类
⭐ 创建接口,使所有方法类实现该接口
⭐ 在方法类中分别实现该方法,最后放在对应的方法数组中
📕 book 包
此类也是很简单的定义,既然要管理图书,肯定要定义Book类以及相关信息:
"书名","书号","数量","作者","类型“"等等......
然后我们还需要一个用于存放图书的"书架",BookList:
"书架容量","已有图书数量"等等......
① Book类
📚 Book类所拥有的属性:"书名","书号","数量","作者","类型","热度"。
那么我们就写出它们,并且写出对应的get和set方法,以及空参构造,无参构造,还有重写toString~
② BookList类
📚 既然是"书架类",那么就需要存储图书:
📕 我们可以使用ArrayList<Book>创建一个集合"books";
📕 可以创建一个书店的最大图书容量(不可变);
📕 我们可以在调用构造方法时,初始化一些书籍;
然后实现get set 构造方法~
③ User类
User 是"普通用户"和"管理员"的父类,但虽然是父类,有些方法却不能在User中清晰的定义,比如"当我们想使用 普通用户 或 管理员 时,两者的使用方法与菜单并不相同"
并且,在我们的设计思想中,"管理员"是需要登陆的,而"普通用户"是不需要登陆的,两者之间有着本质的差别~
所以我们的User类需要是一个抽象类,并且决定使用哪个身份的方法DoUser()需要是抽象方法;
④ NormalUser(用户)类
对于NormalUser类,是User的子类,所以我们需要在其中实现DoUser()方法,而用户类的使用方法很简单,我们只需要在选择用户类后,new一个用户类对象,并调出其菜单就可以了:
而其中DoUser()就是我们需要的实现选择方法的主体代码,之后我们会通过:
⭐ 使用一个User类变量user接收创建出的(管理员/普通用户);
⭐ 循环调用user.DoUser(),依次进行每次的菜单打印以及选项选择;
怎么样~是不是很巧妙呢(作者是萌新..所以作者觉得还挺巧妙的..)
⑤ AdminUser(管理)类
到了管理员类,就并没有那么普通用户那么简单了,因为在我们的计划当中,管理员是需要进行登录操作的。
📚 那么我们来理清一下登录操作的注意点:
⭐ 一次程序运行当中,只需要登录一次。
⭐ 验证码的格式为(4个随机大小写的英文字母和1个随机位置出现的数字)。
接下来就让我们一步步的去将管理员类写出来吧~
📕 首先,密码不一定只有一个,所以我们可以使用 ArrayList<Integer> list 创建一个整型变量的集合,可以先设置一个初始密码,如果忘记了初始密码,我们可以通过"创建密码"来 add 一个集合成员,作为新的密码:
📕 接下来我们需要做的就是将" 登录 "功能也创建出来,这需要我们" 输入正确的密码 "并且" 输入正确的验证码 ":
⭐ 验证码:通过Random()的方法,使字母大小写,数字出现位置,字母的Ascii值都变成一个范围内的随机数,由此生成符合要求的五位数验证码:
⭐ 登录:传入 " 密码集合 list ",判断输入的密码是否在list中,然后再随机生成一个验证码,通过用户输入字符串查看是否与验证码相同,如果相同则提示登陆成功,并且使用菜单方法:
📕 然后我们要注意,一次程序运行当中,只需要登录一次,就需要我们定义一个"被static 修饰的 int 类变量计数器",在第一次登陆成功时,使计数器++,防止后续有可能出现的"再次使用菜单时可能会重新登陆..."等失误操作:
最后就是我们的菜单啦,这个和刚刚的普通用户没什么区别,大家看一看格式就好:
由我们最开始的代码思路设计可以看出,在代码运行之初,我们需要依次输入"名字","选择身份",然后通过(直接/间接)的方式进入对应身份菜单,通过对应身份user.DoUser() 得到操作的方法下标,然后进行操作...
📚 我们进行一个思路梳理:
⭐ 输入名字(1次)
⭐ 输入身份(1次)
⭐ 打印菜单与选择(n次)
这样看就有思路了吧~这就是思路梳理的重要性~
📕 登陆方法 login():
需要注意的是,在login()方法中,我们没法确定,返回值到底使NormalUser还是AdminUser,所以我们使用之前所学到的"向上转型"~使用父类User去接收子类,使子类发生自动的向上转型~
📕 主函数main:
我们通过 int choice 接收每一次做出的选择,然后就可以通过这个选择,对图书管理系统中的
bookList进行各种各样的操作啦,至此,普通用户和管理员,以及主函数的基本架构已经基本大
功告成,接下来我们只需要一步步的将我们想要实现的方法代码写出来,并通过接口进行分装数
组,最后加入到主函数基本框架中就ok啦~
(感觉只是迈出了一步啊喂...)
初步工作 : 创建方法类数组
首先,我们需要按照最开始的思路导图来创建一个接口IOPeration,用于使各种方法类产生关联,从而达到创建方法数组的目的。
📌 需要注意的是:
⭐ 因为每个方法类里也只会填入一个方法,所以此接口中只需要一个方法就足够;
⭐ 因为需要对书架中的书进行操作,所以我们需要在接口中的方法设定一个(BookList)参数;
我们定义好了接口之后,就需要将所有的方法类都实现这个接口,并且重写方法:
以此类推......
而后我们就可以实现:通过IOPeration[]数组的形式,为"管理员"创建一个存放对应功能的数组,同样也为"普通用户"创建一个存放对应功能的数组;在其中存放实现了IOPeration接口中的work方法的方法,存入IOPeration[]数组中的方法就会自动发生向上转型,从而实现了"多态"的效果;
📌 注意:我们需要在父类User中补充一个定义IOPeration[] ioPerations的方法数组,便于后续"管理员"和"普通用户"进行方法数组实现的操作;
然后我们回到(管理员)中,在构造方法中同时为管理员加上"方法数组":
同时回到(普通用户)中,在构造方法中同时为普通用户加上"方法数组":
然后我们再回到main中:续写我们之前马上完成的主函数框架:
我们知道,之前的主函数基本框架中,我们写到:
接下来我们就使用 choice 来调用 user 中的 ioPerations[] 数组中的 [choice] 下标对应的方法:
这段思路或许有些绕,我们将这些信息总理起来统计成图片,便于大家理解:
① ShowBook(展示图书)
展示图书还是比较简单的一步,只需要注意这一点:
⭐ 展示图书需要根据书号的先后进行排序;
那么Book类是一个我们自己定义的类,想要让它能够使用Arrays.sort方法,就需要我们对compareTo进行重写,或者自己写几个排序的方法~这也就用到了我们上一篇"抽象类和接口"中所讲到的知识了。
📚 注:(因为我们后面还需要做一个"热度排行榜",所以我们需要有两种排序方式,因此我们不采用通过Comparable接口重写"compareTo"的方法,而是自己创建两个"::sort排序方法"~)
然后通过该排序方法,对Book[]进行排序后输出:
我们测试一下:
看来我们排序成功了~
② Leave(离开图书店)
这个就是最简单的方法了,我们只需要一个exit(0)表示程序正常结束就ok啦~
ok呀,没有问题~
③ FindBook(查找图书)
这需要(用户/管理员)输入图书的名字,然后再通过查找图书方法,打印出要找出的书;
📌 注意点:
⭐ 有时会出现相同名字的图书,相同名字的书也要列出,并通过书号排序。
⭐ 如生活中的搜索一致,并非完全输入才能显示图书,如:
如果输入"斗破苍穹",会显示出"斗破苍穹缘起","斗破苍穹三上云岚宗","斗破苍穹年番"...等;
⭐ Books[]中不能有多余数据出现,因为"id"是"String类"而非"int类",默认为"null"而非"0",无法使用compareTo重写方法进行排序!
(如果不去除多余数据,当进行排序时会报错)
④ BorrowBook(借阅图书)
对于借阅图书,也并不需要过多繁琐的工作,需要注意的有以下几点:
⭐ 由于可能拥有"同名书籍",故不通过书名借阅,而是通过书号借阅;
⭐ 每次借阅需要判断余量,如果此书已无余量则借书失败;
⭐ 对于已借过的书籍需要在其名字后加上一个"已借";
(书籍有限,同一个用户只能对同一本书借阅一本);
我们可以看到,借阅书籍成功的进行了标记,并且余量也成功的减少了~
⑤ ReturnBook(归还图书)
想要归还图书,就要先有借阅图书的记录,所以归还图书是要基于借阅图书的前提下的;
归还图书有以下注意事项:
⭐ 通过输入书号查找对应书籍,如果没有(已借)标记,则归还失败;
⭐ 如果拥有(已借)标记,则归还图书,并删除标记,余量+1;
⑥ SupportBook(支持图书)
支持图书,顾名思义,就像我们在网上给博客"点赞!收藏!!关注!!!"一样~
我们需要做的是对"目标图书"进行投票,使其热度up up up~
支持图书的注意事项:
⭐ 其实没啥注意事项...只要能找到图书就能够进行支持
⑦ Rankings(热度排行榜)
实现热度排行榜就需要我们定义一个compareTo方法,使得Arrays.sort()方法会让Book[]数组中的书,热度从高到低排序打印。
通过热度进行比较的compareTohot()方法重写:
方法实现:
至此~普通用户的功能就全部完成了
⑧ AddBook(上架图书)
上架图书需要我们输入"书名","书号","上架数量","作者","类型","初始热度";
上架图书需要注意的是:
⭐ "书号"必须是数字,所以我们需要对"书号"进行判断,如果不是数字则上架失败;
⭐ 判断是否已有该"书号",如果已有,则上架失败;
⭐ 还记得我们最开始定义了一个被 static final 保护的图书容量嘛?
我们的书店总图书数量不能超过这个图书容量,所以如果(原有书数量 + 上架书数量 > MAX_SIZE)
则上架失败;
⑨ DeleteBook(删除图书)
这个没什么好说的啦~通过id查找图书并删除就好了~
⑩ ReviseBook(修改图书信息)
同样的,先用id找到图书,然后输入新的各种信息
需要注意的是:
⭐ 只能修改书号,书名,热度以外的其他数据;
⭐ 记得判断图书数量,不能超过图书容量;
📖 管理员:
📖 普通用户:
📖 BookMain:
📖 book package:
Book.java:
BookList.java:
📖 operation package:
上架图书:
借阅图书:
删除图书:
查找图书:
离开图书店:
热度排行榜:
归还图书:
修改图书:
展示图书:
支持图书:
📖 user package:
用户(User):
管理员(AdminUser):
普通用户(NormalUser):
到此这篇工具类图书名称(工具类图书名称怎么取)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/44118.html