前言
本篇文章来带大家做一个简单的练习:图书管理系统。
1.展示
在开始之前,带大家看看完成后的效果:
可以看到,这里图书管理系统有管理员和用户,都可以对图书进行操作。下面来进行实现。
2.代码实现
在这个系统中,我创建了三个包:
book用于存放图书。
operation用于对各种操作的实现
user用于管理员和用户的实现。
2.1 book包
首先定义一个Book类,属性包含名称,作者,价格,类型,是否被借出。
public class Book {
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", " + (isBorrowed ? "已被借出" : "未被借出")+
'}';
}
private String name;
private String author;
private int price;
private String type;
public boolean isBorrowed;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
public boolean isBorrowed() {
return isBorrowed;
}
}
而这只是一本书,需要一个”书架“来存放多个书,于是创建一个BookList类,包含了一个Book数组,和存放数量。
public class BookList {
public static final int MAX_BOOKS = 10;
private Book[] books;
private int usedSize;
public BookList() {
this.books = new Book[MAX_BOOKS];
books[0] = new Book("三国演艺", "罗贯中", 19, "武侠");
books[1] = new Book("水浒传", "施耐庵", 29, "武侠");
books[2] = new Book("红楼梦", "曹雪芹", 39, "小说");
this.usedSize = 3;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public Book getBooks(int pos) {
return books[pos];
}
public void setBooks(int pos, Book book) {
books[pos] = book;
}
public boolean isExist(String name) {
for (int i = 0; i < usedSize; i++) {
if (name.equals(books[i].getName())) {
return true;
}
}
return false;
}
public boolean isFull() {
return usedSize == MAX_BOOKS;
}
public boolean isEmpty() {
return usedSize == 0;
}
}
还有三个方法,将在后面操作包中用到。
2.2 operation包
管理员和普通用户一共有七个操作,添加,删除,显示,退出,借阅,归还,查找,这些操作都是基于图书来进行的,于是可以定义一个接口IOperation,包含一个work类,这些操作只需重写work类就可以实现相关的操作。
public interface IOperation {
void work(BookList books);
}
剩下的七个类:
AddBook
public class AddBook implements IOperation {
@Override
public void work(BookList books) {
int size = books.getUsedSize();
System.out.println("新增图书");
if (books.isFull()) {
System.out.println("图书库已满,无法新增");
return;
}
Scanner scanner = new Scanner(System.in);
System.out.println("请输入图书名称:");
String name = scanner.next();
if (books.isExist(name)) {
System.out.println("图书已存在,无法新增");
return;
}
System.out.println("请输入图书作者:");
String author = scanner.next();
System.out.println("请输入图书价格:");
int price = scanner.nextInt();
System.out.println("请输入图书类型:");
String type = scanner.next();
Book book = new Book(name, author, price, type);
books.setBooks(size, book);
System.out.println("新增成功:");
books.setUsedSize(size + 1);
System.out.println(books.getBooks(size));
}
}
BorrowBook
public class BorrowBook implements IOperation {
@Override
public void work(BookList books) {
System.out.println("借阅书籍");
int size = books.getUsedSize();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要借阅的书籍名称");
String name = scanner.nextLine();
for (int i = 0; i < size; i++) {
if (name.equals(books.getBooks(i).getName())) {
if (books.getBooks(i).isBorrowed()) {
System.out.println("该书籍已被借出");
return;
}
books.getBooks(i).setBorrowed(true);
System.out.println("借阅成功");
return;
}
}
System.out.println("未找到该书籍");
}
}
DelBook
public class DelBook implements IOperation {
@Override
public void work(BookList books) {
System.out.println("删除图书");
if (books.isEmpty()) {
System.out.println("图书库为空,无法删除");
return;
}
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要删除的图书名称:");
String name = scanner.next();
int size = books.getUsedSize();
for (int i = 0; i < size; i++) {
if (name.equals(books.getBooks(i).getName())) {
if (books.getBooks(i).isBorrowed()) {
System.out.println("该图书已被借出,无法删除");
return;
}
for (int j = i; j < size - 1; j++) {
books.setBooks(j, books.getBooks(j + 1));
}
books.setBooks(size - 1, null);
System.out.println("删除成功");
books.setUsedSize(size - 1);
return;
}
}
System.out.println("未找到该图书");
}
}
ExitSystem
public class ExitSystem implements IOperation {
@Override
public void work(BookList books) {
System.out.println("退出系统");
System.exit(0);
}
}
FindBook
public class FindBook implements IOperation {
@Override
public void work(BookList books) {
System.out.println("查找书籍");
int size = books.getUsedSize();
System.out.println("请输入要查找的书籍名称:");
Scanner scanner = new Scanner(System.in);
String name = scanner.next();
for (int i = 0; i < size; i++) {
if (name.equals(books.getBooks(i).getName())) {
System.out.println("找到该书籍:");
System.out.println(books.getBooks(i));
return;
}
}
System.out.println("未找到该书籍");
}
}
ReturnBook
public class ReturnBook implements IOperation {
@Override
public void work(BookList books) {
System.out.println("归还书籍");
int size = books.getUsedSize();
System.out.println("请输入要归还的书籍名称");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (int i = 0; i < size; i++) {
if (name.equals(books.getBooks(i).getName())) {
if (!books.getBooks(i).isBorrowed()) {
System.out.println("该书籍未被借出");
return;
}
books.getBooks(i).setBorrowed(false);
System.out.println("归还成功");
return;
}
}
}
}
ShowBook
public class ShowBook implements IOperation {
@Override
public void work(BookList books) {
System.out.println("展示图书");
int size = books.getUsedSize();
for (int i = 0; i < size; i++) {
System.out.println(books.getBooks(i));
}
}
}
这些操作大家应该都很熟悉,就不做过多解释了。
2.3 user包
一共有两种人员,管理员和普通用户,我们可以定义一个抽象类User来让管理员类和普通用户类继承他。
先看User类
public abstract class User {
private String name;
public IOperation[] operations;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public abstract int menu();
}
这里有一个抽象方法menu(),两种人的菜单都不一样,可以对User类的menu()方法进行重写,注意,这里还写了一个未初始化的接口数组,用于存放各自的操作类。
NormalUser
public class NormalUser extends User {
public NormalUser(String name) {
super(name);
this.operations = new IOperation[]{
new ExitSystem(),
new FindBook(),
new BorrowBook(),
new ReturnBook()
};
}
@Override
public int menu() {
System.out.println("欢迎" + this.getName() + "来到图书系统");
System.out.println("*******普通用户菜单*******");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("************************");
System.out.println("请输入您的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice > 3 ? -1 : choice;
}
}
AdminUser
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
this.operations = new IOperation[]{
new ExitSystem(),
new FindBook(),
new AddBook(),
new DelBook(),
new ShowBook()
};
}
@Override
public int menu() {
System.out.println("欢迎" + this.getName() + "进入图书管理系统");
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);
int choice = scanner.nextInt();
return choice > 4 ? -1 : choice;
}
}
可以看到两个的代码十分相似。各自的接口数组都存放了相应的操作类。
2.4 Main类
最后就是用Main类把这些包都串起来。
public class Main {
public static User login() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String name = scanner.nextLine();
System.out.println("请输入您的身份:1-管理员 2-普通用户");
int choice = scanner.nextInt();
if (choice == 1) {
return new AdminUser(name);
} else {
return new NormalUser(name);
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = login();
while (true) {
int choice = user.menu();
if (choice < 0) {
System.out.println("您的输入有误,请重新输入");
continue;
}
user.operations[choice].work(bookList);
}
}
}
可以看到实现了一个login方法,根据选择,可以返回相应的身份,而后调用了相应的menu方法,返回一个数字下标,对印着接口数组种的各种类,让操作类得以实现。
user.operations[choice].work(bookList);
这一行应该是相对难以理解的,我们分开来看,首先第一个user,在界面开始时,如果你选择1,你就对应的是管理员,选择2,则对应的是普通用户,然后是.operations[choice],这里是调用接口方法的数组,比如你是管理员,若choice是1,则可以当作new FindBook(),
,于是可以当作user.new FindBook()
,而后就是调用这个类的work方法,传入一个bookList对象,来进行操作。
总结
到此图书管理系统就全部介绍完毕了,希望大家看完之后也能对Java类和对象有更深层次的理解,我也知道这个管理系统并不完备,还有许多bug,且只实现了主要的功能,这只是真正图书管理系统的一小部分而已,但是就是这一小部分也花费了我十分长的时间,有机会的话我会在后面继续完善这个系统。