目录
一、前言
二、内容需求
三、类的设计
(一)图书类
1.Book 类
2.BookList 类
(二)操作类
1.添加图书AddOperation类
2.借阅图书BorrowOperation类
3.删除图书DelOperation类
4.显示图书ShowOperation类
5.退出系统ExitOperation类
6.查找图书FindOperation类
7.归还图书ReturnOperation类
8.IOperation接口
(三)用户类
1.User 类
2.AdminUser类
3.NormalUser类
(四)Main函数入口
四、运行演示
(一)管理员
(二)普通用户
编辑 五、总结
一、前言
Hello!大家晚上好呀~,我们前面分享了许多关于JavaSE的一些语法知识,今天我们就通过运用前面所学的知识来写一个图书管理系统,让我们对这些知识点掌握得更加熟练。
二、内容需求
1 、简单的登录
2 、管理端
- 查找图书
- 新增图书
- 删除图书
- 显示图书
- 退出系统
3 、用户端
- 查找图书
- 借阅图书
- 归还图书
- 退出系统
三、类的设计
我们创建一个book包,然后在book包里面放一个Book类和一个BookList类;接着创建一个operation包,这里面放的是我们的各种操作方法;然后是我们的user包,里面分别放我们的管理员的类和普通成员的类;最后是我们的Main类,我们的程序从这里开始执行。
(一)图书类
1.Book 类
我们在book 包里面创建 Book 类。该类里面是我们的图书属性,包括书名,作者名,价格、种类、是否被借出,然后给出set和get方法,方便我们后面对数据进行修改,最后重写一下toString()方法,方便打印输出。
package book;
public class Book {
private String name;
private String author;
private int price;
private String type;
private boolean isBorrowed;
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
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 boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
(isBorrowed == true ? " 已借出" : " 未借出") +
//", isBorrowed=" + isBorrowed +
'}';
}
}
2.BookList 类
创建好Book类后就要创建书架类,书架是存放我们的书籍的地方,我们可以在这里面给一个数组,用于存放不同的书。然后定义我们书的数量,这里我们用userSize用来记录我们图书的数量。set和get方法用于我们对userSize的调整,同时我们给出了调整书架里面书的方法。这里我们写一个构造方法,用于把我们的书架初始化为有三本书,指定了书的数量userSize的大小为3。
package book;
public class BookList {
private Book[] books = new Book[10];
private int usedSize;
public BookList() {
books[0] = new Book("三国演义", "罗贯中", 10, "小说");
books[1] = new Book("西游记", "吴承恩", 11, "小说");
books[2] = new Book("红楼梦", "曹雪芹", 12, "小说");
this.usedSize = 3;
}
public Book getBook(int pos) {
return books[pos];
}
public void setBook(int pos, Book book) {
books[pos] = book;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public boolean isFull() {
if (this.usedSize == books.length) {
return true;
} else
return false;
}
}
(二)操作类
1.添加图书AddOperation类
在这个类实现对图书的增加,先输入书的信息,然后 new 一本书。
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("新增图书...");
if (bookList.isFull()) {
System.out.println("书架满了,不能新增!");
return;
}
System.out.println("请输入你要新增图书的名称:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
System.out.println("请输入你要新增图书的作者:");
String author = scanner.nextLine();
System.out.println("请输入你要新增图书的价格:");
int price = scanner.nextInt();
//scanner在输入输出时,要int在String后面,除非用户scanner.nextLine()来回收nextInt换行
scanner.nextLine();
System.out.println("请输入你要新增图书的类型:");
String type = scanner.nextLine();
Book book = new Book(bookName, author, price, type);
int currentSize = bookList.getUsedSize();//目前存放3本书
bookList.setBook(currentSize, book);
bookList.setUsedSize(currentSize + 1);
System.out.println("新增图书成功!");
}
}
2.借阅图书BorrowOperation类
在这个类里实现图书借阅。
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowedOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("借阅图书...");
System.out.println("请输入你要借阅的书籍:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
book.setBorrowed(true);
System.out.println("借阅成功!");
return;
}
}
System.out.println("借阅失败!");
}
}
3.删除图书DelOperation类
在这里实现对图书的删除。
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书...");
System.out.println("请输入你要删除的书籍名称:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
int pos = -1;
int i = 0;
for (i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
//如果找到这本书就记录它的下标
pos = i;
break;
}
}
if (i >= currentSize) {
System.out.println("没有找到这本书!");
return;
}
//开始删除
for (int j = 0; j < currentSize - 1; j++) {
Book book = bookList.getBook(j + 1);
bookList.setBook(j, book);
}
System.out.println("删除图书成功!");
//修改setUsedSize
//把后一个位置的图书往前一个位置存放
bookList.setUsedSize(currentSize - 1);
//将最后一个位置置为空
bookList.setBook(currentSize - 1, null);
}
}
4.显示图书ShowOperation类
在这个类里面实实现图书属性的显示。
package operation;
import book.Book;
import book.BookList;
public class ShowOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("显示图书...");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
System.out.println(book);
}
}
}
5.退出系统ExitOperation类
在这里实现对图书管理系统的退出功能。
package operation;
import book.BookList;
public class ExitOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize - 1; i++) {
bookList.setBook(i, null);
}
System.exit(0);
}
}
6.查找图书FindOperation类
在这里实现对图书的查找功能。
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation {
public void work(BookList bookList) {
System.out.println("查找图书...");
System.out.println("请输入你要查找的书籍:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
System.out.println("找到了这本书");
System.out.println(book);
return;
}
}
System.out.println("没有找到这本书");
}
}
7.归还图书ReturnOperation类
在这里实现图书的归还功能。
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("归还图书...");
System.out.println("请输入你要归还的书籍:");
Scanner scanner = new Scanner(System.in);
String bookName = scanner.nextLine();
int currentSize = bookList.getUsedSize();
for (int i = 0; i < currentSize; i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(bookName)) {
book.setBorrowed(false);
System.out.println("归还成功!");
return;
}
}
System.out.println("归还失败!");
}
}
8.IOperation接口
我们在这里写一个接口,后面我们调用这个接口,就可以重写这个抽象类。
package operation;
import book.BookList;
public interface IOperation {
public void work(BookList bookList);
}
(三)用户类
1.User 类
我们在这里写抽象类,是为了方便对它进行继承。我们的抽象类有name成员,还有IOperation类型的数组,我们可以向接口里面放我们的操作方法,其它的类都实现了我们的接口并且重写了接口里面的work()方法。
package user;
import book.BookList;
import operation.IOperation;
public abstract class User {
protected String name;
protected IOperation[] iOperations;
public User(String name) {
this.name = name;
}
public abstract int menu();
public void doIoperations(int choice, BookList bookList) {
this.iOperations[choice].work(bookList);
}
}
2.AdminUser类
我们这里实现管理员菜单。
package user;
import operation.*;
import java.util.Scanner;
public class AdminUser extends User {
public AdminUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation()
};
}
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);
int choice = scanner.nextInt();
return choice;
}
}
3.NormalUser类
我们在这里先帮父类写构造方法,然后将IOperation进行初始化里面放着是我们普通用户所能进行的一系列操作,再下面就是我们的菜单方法,因为我们的普通用户和管理员所能进行的操作是不一样的,需要同时选择我们的操作。
package user;
import operation.*;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name) {
super(name);
this.iOperations = new IOperation[]{
new ExitOperation(),
new FindOperation(),
new BorrowedOperation(),
new ReturnOperation()
};
}
public int menu() {
System.out.println("*****普通用户菜单*****");
System.out.println("1.查找图书");
System.out.println("2.借阅图书");
System.out.println("3.归还图书");
System.out.println("0.退出系统");
System.out.println("********************");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
(四)Main函数入口
我们一开始先new一个BookList——书架,然后开始登录操作输入身份之后,返回一个用户的对象,此时我们拥有了两个对象,一个是书架bookList,还有就是我们的用户对象,然后我们的用户就可以对我们的书架进行一系列的操作。
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
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("请输入你的身份:1.管理员 2.普通用户");
int choice = scanner.nextInt();
if (choice == 1) {
AdminUser adminUser = new AdminUser(name);
return adminUser;
} else {
NormalUser normalUser = new NormalUser(name);
return normalUser;
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
//user有可能引用管理员身份,有可能引用普通用户身份
while (true) {
User user = login();
int choice = user.menu();
user.doIoperations(choice, bookList);
}
}
}
程序运行后先打印我们的菜单,顺便返回我们输入的操作,接着拿着我们的操作choice和我们的书架bookList去执行,user.doWork(),拿着我们的choice找到IOperation,运行对应的操作,最终实现我们指定的功能。
四、运行演示
(一)管理员
(二)普通用户
五、总结
我们通过利用前面所学的知识点:类,抽象类,封装,继承,多态,接口等知识,将它们综合运用起来,就可以写出一个简单的图书管理系统,以上就是本期JavaSE的分享内容,感谢大家的支持,我们下次再见!!!