在如今数字化的时代,图书管理系统成为了图书馆、学校和其他组织中不可或缺的一部分。图书管理系统可以帮助管理员轻松地记录和管理图书的借阅、归还等操作,同时也方便读者查询图书信息。本篇博客将介绍如何使用Java语言实现一个简单的图书管理系统。我们将采用面向对象的思想,通过建立各个类和运用接口来实现不同的操作功能。
我们要实现图书管理系统自然少不了书,所以我们需要创建一个Book类来储存书的信息,例如:书名,作者,价格,类型等等。
public class Book {
//书的信息是固定的,不需要被改动
//所以我们这里用private修饰,让它只能在Book类里被访问
//体现Java的封装特性
private String name;
private String author;
private int price;
private String type;
//书会被读者借出,所以我们可以用一个布尔类型来表示书是否被借出了,
//这里我们默认false是未被借出
private boolean isBorrowed;
//省略构造方法
//重写toString方法,注意isBorrowed的输出需要做一下改动
@Override
public String toString() {
return "Book{" +
" 书名:'" + name + '\'' +
", 作者:'" + author + '\'' +
", 价格:" + price +
", 类型:'" + type + '\'' +
", 状态:'" + (isBorrowed ? "已被借出'" : "未被借出' " )+
'}';
}
//由于我们的成员变量是用private修饰的
//所以我们需要给出set和get方法来获取成员变量
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//......
}
我们有了书,自然需要一个书架把这些书整理放起来,所以我们可以实现一个BookList 类用来存放我们的书。
public class BookList {
//定义一个常量,表示书架的最大容量
public final static int MaxSize = 10;
//定义一个Book类型的数组用来储存我们的书
private Book book[] = new Book[MaxSize];
private int bookSize; //记录当前书架上书的数量
//我们可以在构造方法中给一些初始数据
public BookList() {
book[0] = new Book("西游记", "吴承恩", 25, "小说");
book[1] = new Book("红楼梦", "曹雪芹", 30, "小说");
book[2] = new Book("水浒传", "施耐庵", 25, "小说");
this.bookSize = 3;
}
//同样的我们也需要set/get方法来访问成员变量
//不过要注意book的set/get方法的实现
//为了方便操作我们设置成:返回/设置 指定位置的数据。实现在下方
public int getBookSize() {
return bookSize;
}
public void setBookSize(int bookSize) {
this.bookSize = bookSize;
}
public Book getBook(int pos) {
return book[pos];
}
public void setBook(int pos, Book book) {
this.book[pos] = book;
}
}
我们发现 Book 和 BookList 都是用来存放的,所以我们可以创建一个book包,把它们放在一起,使项目的组织结构更加清晰和有序。
书和书架都有了,接下来我们自然需要实现一些类用来做一些操作。例如,普通用户可以借书,还书,找书,还可以展示图书;管理员用户还可以增加书,删除书等等。我们发现如此多的操作,我们需要调用的时候就要去写调用的代码是不是十分的繁琐,所以我们可以定义一个接口 Operation 然后让这些不同的类去实现这个接口,就可以根据接口类型引用对象,实现对不同实现类的统一调用。
import book.BookList;
public interface Operation {
//由于我们所有的操作实际上都是对我们的书架进行操作
//所以我们需要把BookList作为参数传入work方法
//同时别忘记导入BookList所在的包
void work(BookList bookList);
}
import book.BookList;
//这里以展示图书的类为例子
public class ShowOperation implements Operation {
//由于我们实现了Operation接口所以我们需要重写work方法,
//这里的work方法我们就可以用来实现对应的操作
@Override
public void work(BookList bookList) {
System.out.println("展示图书");
//具体的实现在后面给出,我们先把整体的框架搭好
}
}
同理,我们让其他的操作的类也实现Operation接口。同样的,为了我们的代码组织更为清晰,我们创建一个operation包来存放这些操作相关的代码
用来操作的类有了,那么谁来调用这些操作呢,自然是用户来调用,所以我们可以创建一个User类来储存用户的信息以及调用操作的方法,但是我们上面提到了,普通用户以及管理员用户,他们能实现的操作是不同的,又该怎么办呢? 普通用户是用户,管理员用户也是用户,所以我们可以再创建两个类,NormalUser(普通用户),AdminUser(管理员用户),然后用这两个类继承User类,重写User类中调用操作的方法就可以解决这个问题。
import book.BookList;
import operation.Operation;
//既然User只需要被继承那么我们可以把User设计为抽象类
public abstract class User {
protected String name;//用户的姓名
public Operation[] op; //可以调用的操作有多种,所以我们可以用数组存储对应的类
public User(String name) {
this.name = name;
}
public abstract int menu(); //设计一个菜单界面(返回值为Int的原因后面会讲)
//用来调用具体操作的方法
//根据传入的操作代号,来调用op中对应类中的work方法
public void doOperation(int choice, BookList bookList) {
this.op[choice].work(bookList);
}
}
import java.util.Scanner;
import operation.*;
public class NormalUser extends User {
//宅构造方法中初始化User类中的数组op,存入对应的操作的类
//位置与下面菜单中的操作代数对应
public NormalUser(String name) {
super(name);
super.op = new Operation[] {
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
new ShowOperation()
};
}
//重写父类中的menu
@Override
public int menu() {
System.out.println("*****************");
System.out.println("1. 查找图书");
System.out.println("2. 借阅图书");
System.out.println("3. 归还图书");
System.out.println("4. 显示图书");
System.out.println("0. 退出系统");
System.out.println("*****************");
//提示用户输入,然后返回对应操作的代数
System.out.println("请选择你的操作");
Scanner scanner = new Scanner(System.in);
return scanner.nextInt();
}
}
import operation.*;
import java.util.Scanner;
//与上面Normal类的实现类似,只是传给op的类以及菜单界面不同
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
super.op = new Operation[] {
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation()
};
}
@Override
public int menu() {
System.out.println("*****************");
System.out.println("1. 查找图书");
System.out.println("2. 添加图书");
System.out.println("3. 删除图书");
System.out.println("4. 显示图书");
System.out.println("0. 退出系统");
System.out.println("*****************");
System.out.println("请选择你的操作");
Scanner scanner = new Scanner(System.in);
return scanner.nextInt();
}
}
同样的,我们也创建一个包 user 把这三个类放进去
我们所有的框架基本已经写好了,现在只需要写一个程序入口来把这些代码运行起来。
我们写一个Main类
import book.BookList;
import user.*;
import operation.*;
import java.util.Scanner;
public class Main {
//要使用这个系统,首先要有用户
//但是用户分为,普通用户和管理员用户
//所有我们写一个登录方法来区分用户的类别
public static User login() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = scanner.nextLine();
System.out.println("请输入你的身份 :0(用户) or 1(管理员)");
int identity = scanner.nextInt();
if(identity == 1) {
System.out.println("管理员");
return new AdminUser(name);
} else {
System.out.println("用户");
return new NormalUser(name);
}
}
public static void main(String[] args) {
//用一个User变量来接收login返回的用户
User user = login();
//有了用户我们还需要创建一个书架
BookList bookList = new BookList();
//我希望选择了一个操作之后,还能进行其他操作,所以这里用一个循环
while(true) {
//这里打印了菜单界面的同时接收到了menu返回的操作代数
int choice = user.menu();
//然后调用User中的doOperation方法来调用相关操作
user.doOperation(choice, bookList);
}
}
}
现在这个代码基本上就算写完了,只需要把操作类具体实现就可以了。后面我们还可以在此基础上升级为静态库版本,网页版本。
public class AddOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("添加图书");
if(bookList.getBookSize() == BookList.MaxSize) {
System.out.println("书架已满,添加失败");
return;
}
Scanner scanner = new Scanner(System.in);
System.out.println("请输入书名:");
String name = scanner.nextLine();
System.out.println("请输入作者:");
String author = scanner.nextLine();
System.out.println("请输入类型:");
String type = scanner.nextLine();
System.out.println("请输入价格:");
int price = scanner.nextInt();
Book newBook = new Book(name, author, price, type);
bookList.setBook(bookList.getBookSize(), newBook);
bookList.setBookSize(bookList.getBookSize() + 1);
System.out.println("添加成功");
}
}
public class DelOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
System.out.println("请输入要删除的图书名称:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int size = bookList.getBookSize();
for(int i = 0; i < size; i++) {
if(bookList.getBook(i).getName().equals(name)) {
for(; i < size-1; i++) {
bookList.setBook(i, bookList.getBook(i+1));
}
bookList.setBook(i, null);
bookList.setBookSize(bookList.getBookSize() - 1);
System.out.println("删除成功");
return;
}
}
System.out.println("没有图书:" + "'" + name + "'");
}
}
public class BorrowOperation implements Operation {
@Override
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
System.out.println("借阅图书");
System.out.println("请输入你要借的图书名称:");
String name = scanner.nextLine();
int size = bookList.getBookSize();
for(int i = 0; i < size; i++) {
if(bookList.getBook(i).getName().equals(name)) {
if(bookList.getBook(i).isBorrowed() == false) {
bookList.getBook(i).setBorrowed(true);
System.out.println("借阅成功");
return;
} else {
System.out.println("该书已被借出");
return;
}
}
}
System.out.println("没有图书:" + "'" + name + "'");
}
}
public class ReturnOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
System.out.println("请输入你要归还的图书名称:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int size = bookList.getBookSize();
for(int i = 0; i < size; i++) {
if(bookList.getBook(i).getName().equals(name)) {
if(bookList.getBook(i).isBorrowed()) {
bookList.getBook(i).setBorrowed(false);
System.out.println("归还成功");
return;
} else {
System.out.println("该书未被借出");
return;
}
}
}
System.out.println("没有图书:" + "'" + name + "'");
}
}
public class FindOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
System.out.println("请输入要查找的图书名称:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int size = bookList.getBookSize();
for(int i = 0; i < size; i++) {
if(bookList.getBook(i).getName().equals(name)) {
System.out.println("找到内容如下:");
System.out.println(bookList.getBook(i));
return;
}
}
System.out.println("没有图书:" + "'" + name + "'");
}
}
public class ShowOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("展示图书");
int size = bookList.getBookSize();
for(int i = 0; i < size; i++) {
System.out.println(bookList.getBook(i));
}
}
}
public class ExitOperation implements Operation {
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(0);
}
}