目的
此篇代码是对类和对象、抽象类、接口等知识相关训练,适合初学者使用和参考。
题目
要求创建一个图书管理系统。

- 程序的开始,要求输入姓名;
- 选择身份:1.管理员 2.普通用户
- 下面是菜单,不同的身份有着不同的菜单


包
我们创建四个包:用户包、操作包、书类型包、主函数包

书类型的包
书类型的包包含两个类:书、书架
Book

- 书的属性:书名、作者、价格、类型、是否被借出
- 书名的get 方法,用于后面使用书名查找书籍
- IsBorrowe的get\set方法用于后面的“借出书籍”“归还书籍”的操作
- toString()用于输出书籍的相关信息(是否被借出的返回格式需要我们的额外调整)
BookList

- 书架的属性:书的数组、书的数目
- 构造方法:初始化书的数组里面的内容,让其中有三本书,并使书的数目为3
- 书籍的set方法:用于后面的新增图书、删除图书(因为删除图书,我们是将最后一本书放到删除图书的位置,所以我们构造了两个重载的方法)
- getBook():用于后面的查找图书的操作,获取书架当中的书
- 书的数目的get()和ser()方法,用于后面的新增删除图书的操作,获取图书数目的方法
用户包
我们创建一个抽象类:User,
NormalUser和AdminUser这两个类继承User
User

- 如图所示,User类中包含name \ IOperations
- IOperations 是操作类的数组,里面需要放入各种操作类,以对应不同的对象不同的操作。
- 菜单方法,输出菜单,后面根据不同的对象写出不同的方法体(需要被重写)
- doWork()对书架进行操作一句菜单进行选择
NormalUser

- 构造方法:里面的操作数组是重点,依次按照顺序进行排列
- menu():普通用户的菜单,依照菜单的信息让用户进行选择
AdminUser

- 构造方法:重点是操作数组,根据需要进行组合
- menu():让用户根据菜单的信息进行选择
操作类型的包
操作类型的类:Add\Brrow\Del\Exit\Find\Return\Show
操作类型的接口:所有的操作用一个接口IOperation
IOperation

- 这是所有操作的接口,我们看他虽然很短,但是确实十分的重要,我们可以使用接口数组,在数组中放入不同的操作,这样我们就可以使用这一个接口数组完成不同的操作
Show

- 重写接口的方法,展示所有书籍的内容,其中调用了BookLIst类中的getBook()方法和Book类中的toString()方法来输出相关的信息
Add

- 这里我们要新增一个图书,我们要输入书名、作者、类型、价格,同时我们创建一个Book类的对象用于接受这些信息,我们调用BookList类中的setBook()方法,把图书放入数组中,同时放入的位置是BookList类中getUsedSize()方法获取的位置,即为数组新增图书要放的位置
Find

- 查找图书:我们遍历整个数组,我们通过Book类中的getName()方法来和输入的书名进行比较,相等,则打印信息。
Brrow 和 Return


- 我们通过书名查找图书,找到后,判断这本书是否被借阅的状态(调用Book类中getIsBrrowed()方法来判断书的状态),根据状态,判断它是否需要归还或借阅。
Exit

Del

- 我们输入要删除的图书名字,遍历整个数组,找到这本书,如果这本书在最后一个位置上,只要书的数目 -1即可;如果书不在最后的位置上,我们把最后位置上的出放在要删除的书的位置上即可。但两种方法都要书的数目 -1。注意BookList中setBook的一种方法体可能不能满足我们的使用,我们需要重载(刚刚已说)
main包

- 首先我们创建一个书架的对象
- 我们用User父类接收NormalUser或AdminUser对象(具体是那个对象,我们并不清楚,所有我们使用能够接受所有用户的类),login()静态方法被调用,用于我们选择身份,返回返回值为一个用户对象即可
- 如果我们选择的是普通用户,接下来user.menu()这个方法被重写,user具体是哪个类型的对象就调用哪个menu()。根据菜单返回的值,从父类继承先来的doWork()中,IOperations[]数组是子类的对象的操作数组,【】内是选择的数字(代表不同的操作),这样我们就完成了所有的过程。

代码链接
图书管理系统