简易图书管理系统实现
通过对简易图书管理系统的实现,对前面面向对象的知识做一简单总结。
(面向对象的相关几篇文章:Java类和对象,Java中String类,面向对象:继承、组合、多态、抽象类、接口,面向对象:Java异常)
本文使用IDEA
+JDK1.8
版本来实现一个简单的命令行图书管理系统。
不同于面向过程的设计思路,面向过程在于分析解决某一问题的具体思路,然后使用函数一步一步的按照所想思路完成。而面向对象则是将问题事物分解为一个个的对象,然后依据这些对象在解决问题中所起的作用来具体实现其功能。在Java中,一切皆对象。
1基本要求
既然一切皆对象,那我们首要的任务则是分析本问题具体包含了哪些对象。
首先,图书管要有书本(Book
),书单(BookList
),在一般的图书馆中,又分为管理员(Admin
)和一般用户(NormalUser
),管理员可能又会根据不同的职位级别不一样,这里为了简化,认为只有一种管理员。
管理员拥有向图书馆增加书本(AddOperation
)、删除书本(DelOperation
)、查看所有的书籍信息(DisplayOperation
)、检索某本书的信息(FindOperation
)。(假定管理员都不借书、还书)。
普通用户拥有检索某本书的信息(FindOperation
)、借书(BorrowOperation
)、还书(ReturnOperation
)功能。
无论是管理员还是用户,使用完毕后可以退出系统(ExitOperation
)。
此外假设没有重复的书名,程序中关于增删查的操作都围绕书名。
由上可以看出,该问题的相关对象基本清晰。下面将逐一实现这些对象的类。
1.1创建类
为保证最大程度的封装性,将类中的属性尽量用private
和protected
修饰。
1.1.1Book
类
通常一本书包含如下信息:书名、作者、价格、书籍类型、出版信息(出版社、出版年月)、条形码等等,此处为了简便,取书名、作者、价格、类型即可。对于图书馆,一本书还应该有是否在馆的信息(默认一本书没有被借出,即在馆)。
public class Book {
private String name;
private String author;
private double price;
private String type;
private boolean isBorrowed = false;
public Book(String name, String author, double price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
}
1.1.2BookList
类
BookList
为书单,即可以表示多本书的信息,所以使用Book
数组来存放多本书的信息,此外,还应该包括最大容量capacity
(一般认为最大容量不可修改),实际存放的书本数size
(不超过最大容量)。
public class BookList {
//最大容量,常量,所以用final
private final int capacity = 5;
private Book[] books = new Book[capacity];
//当前书单中书本的个数
private int size = 0;
public BookList() {
//图书馆刚开始就有3本书,价钱是随便打的
books[size++] = new Book("野草","鲁迅",12.5,"诗集");
books[size++] = new Book("呐喊","鲁迅",13,"小说集");
books[size++] = new Book("坟","鲁迅",12.5,"杂文集");
}
}
1.1.3操作类
管理员的增加书本是向BookList
增加的:
public class AddOperation{
public void operation(BookList booklist){
//增加书籍的相关操作
}
}
删除书本是从BookList
删除的:
public class DelOperation{
public void operation(BookList booklist){
//删除书籍的相关操作
}
}
查看书的信息也是从BookList
显示的:
public class DisplayOperation{
public void operation(BookList booklist){
//查看书籍的相关操作
}
}
其他的操作类似,可以看出,这些操作类没有属性,并且拥有相同的方法,因此我们可以把这一共性提取出来,作为一个接口,再由这些类来重写具体的操作。为了便于后边代码的简化与书写,尽管退出程序并不跟BoookList
有关,也来实现该接口。
1.1.3.1接口
该接口定义如下:
public interface IOperation {
void operation(BookList bookList);
}
1.1.3.2操作类
1.1.3.2.1AddOperation
类
public class AddOperation implements IOperation{
@Override
public void operation(BookList bookList) {
//增加书籍相关操作
}
}
1.1.3.2.2DelOperation
类
public class DelOperation implements IOperation{
@Override
public void operation(BookList bookList) {
//删除书籍相关操作
}
}
1.1.3.2.3DisplayOperation
类
public class DelOperation implements IOperation{
@Override
public void operation(BookList bookList) {
//显示书籍相关操作
}
}
1.1.3.2.4FindOperation
类
public class FindOperation implements IOperation{
@Override
public void operation(BookList bookList) {
//查找书籍相关操作
}
}
1.1.3.2.5BorrowOperation
类
public class BorrowOperation implements IOperation{
@Override
public void operation(BookList bookList) {
//借阅书籍相关操作
}
}
1.1.3.2.6ReturnOperation
类
public class ReturnOperation implements IOperation{
@Override
public void operation(BookList bookList) {
//归还书籍相关操作
}
}
1.1.3.2.7ExitOperation
类
public class ExitOperation implements IOperation{
@Override
public void operation(BookList bookList) {
//退出系统
}
}
1.1.4用户类
无论是管理员还是普通用户,都拥有名字、相关的操作、根据相关的操作打印出来的菜单。名字和相关操作为属性,打印菜单为方法,因此,可以将其提取出来,作为父类,让管理员和普通用户都继承自这个类,当有新的级别用户时,也有上边的属性和方法,所以也继承自该类。
- 在这里不希望此父类能够直接创建对象,因此将该父类作为抽象类。
- 对于不同类型的用户,打印的菜单也不同&#x