目录
零. 概览
最终要实现的就是如上图所示的效果, 不同级别的用户 对应 着不同的操作, 把每一本书都存储在一个容器中, 最终对这个容器进行增删查改... 操作.
一. 抽象出图书管理系统所涉及的对象
1.1 Book
Book包 中 包含:
a. Book 对象, 这是每一本书
b. BookList 对象, 最终肯定要对图书进行操作, 那么我们就需要 一个 "容器" 把每一本书(Book)存储起来, 这时, 就抽象出 书架 把书存储起来.
Book 包:
1.2 User
User包 中 包含:
a. NormalUser 对象, 普通用户, 进行一些 借阅, 查找 ... 的操作 并不对 书架进行操作(即不进行书的增删改).
b. AdminUser 对象, 管理员用户, 进行 书的增删改 ... 的操作, 本质上对 书架进行操作.
c. User 对象(父类), 把NormalUser 和 AdminUser 的共同属性抽取出来, 存放到 父类当中, 子类只需要继承User就好, 实现了代码的复用.
User 包:
1.3 Operation
Operation包 中 包含:
a. AddOperation 增加图书
b. DelOperation 删除图书
c. ShowOpreation 展示图书
d. FindOperation 查找图书
e. ExitOperation 退出系统
f. BorrowOperation 借阅图书
g. ReturnOperation 归还图书
h. IOperation 操作接口(包含公有的方法, 实现多态)
Operation 包:
二. 实现 User 包中的对象
2.1 User父类
name: 抽取出 不同级别用户的共性.
menu: 打印出 菜单, 设置成 抽象方法, 没有具体的实现.
这里有个小问题, menu的返回值为什么要被设置成为 int , 这是因为 这个菜单中的 功能被用户进行了选择, 最终要返回 一个 序号, 并根据这个序号来调用不同的 操作方法.
2.2 NormalUser 对象
menu方法: 在NormalUser 子类中 重写了父类中的 menu 方法, 并对应着NormalUser对象 特有的功能.
2.3 AdminUser 对象
menu 方法: 在 AdminUser子类中重写了 menu方法, 并对应着 AdminUser 对象特有的功能.
2.4 小总结(1)
在不同的子类中 重写 的menu类各不相同, 这体现了 多态(不同的对象进行同种操作时 所产生的状态各不相同.)
三. 实现Book包中的对象
3.1 Book 对象
Book 对象: Book类中定义了一本书的基本属性, 以及 这些属性 的 get 和 set 方法.(因为他们被 private 修饰, 是私有的).
3.2 BookList 对象
books: 实现了 组合, 创建了 books 书架, 用来 存储每一本书.
usedSize: 使用了 多少 书架的空间.
构造方法: 在构造方法中初始化了 userSize成员属性, 并初始化了书架, 最开始设置了三本书.
get and set 方法: 注意 这里的 getBook 和 setBook 是得到 pos 位置的书, 和 在 usedSize 位置 新设置一本书, 本质上还是对 书架进行操作.
四. 实现 Operation 包中的对象
在Operation 包中实现的都是一些 操作方法, 我们的重心不在 这里, 关于具体实现, 大家可以 去我的 码云 上 查看, 链接如下:Homework_JAVASE: 这是JAVASE学习阶段的课后作业! - Gitee.com
https://gitee.com/nmbg11/bit_after_word_JAVASE/tree/master/j-20240523_JAVASE/src/Operation
4.1 IOperation 接口
![]()
注意接口中的方法默认被 public abstract 修饰, 是抽象方法, 在实现方法中必须被重写.
4.2 操作类
![]()
其他所有的操作类, 都是类似于 这样.
在 他们之中实现的都是各自的操作方法.
4.3 接口 和 抽象类的比较
这里 为什么 要将 IOperation设置成为接口, 而不把他设置成 抽象类 呢?
答: 在 这里 把 IOperation设置成为 接口 和 设置成 抽象类 都可以, 因为 这里的 实现类 都只需要 重写 一个 work 方法, 没有 涉及到 多实现.
一定要注意 接口和抽象类的区别, 接口 可以多实现, 而 在 java中抽象类(不只是抽象类, 所有的类) 不能够多继承.
五. 整合操作
接下来, 我们把 以上的多个对象 整合起来, 让他们 共同 实现图书管理系统.
5.1 明确 进行 操作的用户
根据 用户输入的 id 来返回 id 对应的对象. 最终使用 父类 user 来接受, 发生了 向上转型.
5.2 明确 对 bookList 进行的操作
不同 用户所能够进行的操作 不同.
根据 choice 来 调用指定的 work.
六. 总结
a. 文章主要 讨论的是 业务逻辑的实现, 不考虑一些 细节.
b. 首先 抽象出来 图书管理系统 中的对象.
c. 针对 各个对象, 实现他们各自的功能.
d. 最后 把 抽象出来的对象 进行 整合, 共同来实现图书管理系统.
图书管理系统的源码 在Gitee 中, 链接如下: