JAVA圖書管理系統
阿新 • • 發佈:2021-01-28
技術標籤:JAVA筆記
簡單的圖書管理系統原始碼
Test
package BookSystem;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Object o = null;
// 1. 先準備好書籍的資料
BookList bookList = new BookList();
// 2. 建立使用者(涉及到登陸過程)
// 咱們寫這個 main 方法(整合整體邏輯的時候, 不關注使用者是啥)
User user = login();
// 3. 進入主迴圈
while (true) {
// 此時 user 是父類的引用. 呼叫的 menu 是哪個版本的方法?
// 就看 user 到底指向哪種子類的例項
// 這就是多型. 在這個場景中, 呼叫者根本無需關注 user 到底是啥型別~~
int choice = user.menu();
// 有了使用者輸入的選擇之後, 需要根據這個選項, 來執行對應的操作
user. doOperation(choice, bookList);
}
}
public static User login() {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入您的姓名: ");
String name = scanner.next();
System.out.println("請輸入您的角色: 1 管理員, 0 普通使用者");
int who = scanner.nextInt();
if (who == 1) {
return new Admin(name);
}
return new NormalUser(name);
}
}
User
package BookSystem;
import BookSystem.operation.IOperation;
// User 這個類用來作為 Admin 和 NormalUser 的父類
// 存放兩種角色的公共資訊的
// User 類不應該被例項化. 角色實際就只有管理員和普通使用者兩種
// 於是就做成一個抽象類, 防止後面不小心對 User 例項化了, 編譯就能給出報錯
abstract public class User {
protected String name;
protected IOperation[] operations;
// 這個方法用來列印該使用者的選單
// 不同的使用者支援的操作不一樣, 選單內容也不一樣.
// 此處就做成抽象方法, 再由該類的子類來進一步的重寫這樣的方法
public abstract int menu();
public void doOperation(int choice, BookList bookList) {
// 如果 choice 是 1, 並且當前 user 是 Admin 的話,
// 此時取下標為 0 的元素, 就得到了一個 FindOperation 的例項
// 此時 operation 這個引用指向的就是這個 FindOperation 例項
IOperation operation = this.operations[choice - 1];
// 再呼叫 work 方法, 這也是父類引用呼叫方法, 實際執行的是 引用對應的子類的方法
operation.work(bookList);
}
}
NormalUser
package BookSystem;
import BookSystem.operation.*;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name) {
this.name = name;
this.operations = new IOperation[] {
new FindOperation(),
new BorrowOperation(),
new ReturnOperation(),
new ExitOperation()
};
}
@Override
public int menu() {
System.out.println("=========================");
System.out.println("Hello! " + name + ", 歡迎使用咱的圖書管理系統");
System.out.println(" 1. 查閱書籍資訊");
System.out.println(" 2. 借閱書籍");
System.out.println(" 3. 歸還書籍");
System.out.println(" 4. 退出系統");
System.out.println("=========================");
System.out.println("請輸入您的選擇: ");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
BookList
package BookSystem;
// 通過這個類把多個 Book 物件給組織起來
public class BookList {
// 100 相當於這個 BookList 的 capacity
private Book[] books = new Book[100];
private int size = 0;
public BookList(){
books[0] = new Book("朝花夕拾","魯迅",35,"文學散文");
books[1] = new Book("三體","劉慈欣",99,"科幻小說");
books[2] = new Book("駱駝祥子","老舍",29,"文學小說");
books[3] = new Book("十宗罪","蜘蛛",108,"懸疑小說");
size = 4;
}
// 後面需要針對其中的某一本書進行操作.
public Book getBook(int index) {
return books[index];
}
public void setBook(int index, Book book) {
books[index] = book;
}
// 使用 alt + insert 也能生成 getter 和 setter 方法
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}
Book
package BookSystem;
// Book 類用來表示一本書的資訊
// 這些資訊通過 Book 類的屬性來表示
public class Book {
// 原則是, 能用 private 就儘量用 private
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;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
public String getName() {
return name;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
}
Admin
package BookSystem;
import BookSystem.operation.*;
import java.util.Scanner;
public class Admin extends User {
public Admin(String name) {
this.name = name;
this.operations = new IOperation[] {
new FindOperation(),
new AddOperation(),
new DelOperation(),
new DisplayOperation(),
new ExitOperation()
};
}
@Override
public int menu() {
System.out.println("=========================");
System.out.println("Hello! " + name + ", 歡迎使用咱的圖書管理系統");
System.out.println(" 1. 查閱書籍資訊");
System.out.println(" 2. 新增書籍資訊");
System.out.println(" 3. 刪除書籍資訊");
System.out.println(" 4. 列印書籍列表");
System.out.println(" 5. 退出系統");
System.out.println("=========================");
System.out.println("請輸入您的選擇: ");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
IOperation
package BookSystem.operation;
import BookSystem.BookList;
public interface IOperation {
void work(BookList bookList);
}
AddOperation
package BookSystem.operation;
import BookSystem.Book;
import BookSystem.BookList;
import java.util.Scanner;
// 往 BookList 中新增一本書
public class AddOperation implements IOperation {
@Override
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
// 裡面實現具體的新增操作
System.out.println("新增書籍");
System.out.println("請輸入新的書籍的名稱: ");
String name = scanner.next();
System.out.println("請輸入新的書籍的作者: ");
String author = scanner.next();
System.out.println("請輸入新的書籍的價格: ");
double price = scanner.nextDouble();
System.out.println("請輸入新的書籍的類別: ");
String type = scanner.next();
Book newBook = new Book(name, author, price, type);
// 把這本新的書放到 BookList 的末尾即可.
int curSize = bookList.getSize();
bookList.setBook(curSize, newBook);
bookList.setSize(curSize + 1);
System.out.println("新增書籍成功!");
}
}
DeleteOperation
package BookSystem.operation;
import BookSystem.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation {
@Override
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
// 實現刪除一本指定書籍的操作
System.out.println("刪除書籍");
System.out.println("請輸入要刪除的書籍的名字: ");
String name = scanner.next();
int i = 0;
for (; i < bookList.getSize(); i++) {
if (name.equals(bookList.getBook(i).getName())) {
break;
}
}
if (i >= bookList.getSize()) {
// 沒找到匹配名字的書, 刪除失敗
System.out.println("您輸入的書籍 [" + name + "] 在系統中沒有找到! 刪除失敗!");
return;
}
// 如果找到了匹配的名字, 就把 i 位置的元素給刪除掉即可~
if (i == bookList.getSize() - 1) {
// 如果當前要刪除的元素正好是陣列的最後一個元素, 直接 size-- 即可
bookList.setSize(bookList.getSize() - 1);
System.out.println("刪除成功");
return;
}
// 如果要是需要刪除中間元素
// 先把最後一個元素給賦值到要刪除的元素位置,
bookList.setBook(i, bookList.getBook(bookList.getSize() - 1));
// 再刪除最後一個元素
bookList.setSize(bookList.getSize() - 1);
System.out.println("刪除成功");
}
}
FindOperation
package BookSystem.operation;
import BookSystem.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation {
@Override
public void work(BookList bookList) {
// 實現查詢某個書籍的資訊
System.out.println("查詢書籍");
// 讓使用者輸入書名, 來進行查詢
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入要查詢的書名: ");
String name = scanner.next();
// 迴圈遍歷書籍列表
for (int i = 0; i < bookList.getSize(); i++) {
// 此處不使用 equals, 而是使用 contains.
if (bookList.getBook(i).getName().contains(name)) {
System.out.println(bookList.getBook(i));
}
}
}
}
DisplayOperation
package BookSystem.operation;
import BookSystem.Book;
import BookSystem.BookList;
// 把 BookList 中的所有資訊都打印出來
public class DisplayOperation implements IOperation {
@Override
public void work(BookList bookList) {
// 顯示書籍列表
System.out.println("顯示書籍列表");
for (int i = 0; i < bookList.getSize(); i++) {
System.out.println(bookList.getBook(i));
}
}
}
ExitOperation
package BookSystem.operation;
import BookSystem.BookList;
public class ExitOperation implements IOperation {
@Override
public void work(BookList bookList) {
// 退出程式
System.out.println("退出程式");
// 通過這裡的 exit 方法就可以直接結束當前程式(結束了當前 jvm 對應的 java 程序)
System.exit(0);
}
}
BorrowOperation
package BookSystem.operation;
import BookSystem.Book;
import BookSystem.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation {
@Override
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
// 實現借書操作
System.out.println("借閱書籍");
System.out.println("請輸入要借閱的書籍的名稱: ");
String name = scanner.next();
// 找到指定書籍的位置
int i = 0;
for (; i < bookList.getSize(); i++) {
if (bookList.getBook(i).getName().equals(name)) {
break;
}
}
if (i >= bookList.getSize()) {
// 沒找到
System.out.println("未找到指定的書籍, 無法借閱!");
return;
}
// 如果找到了對應的書籍, 再判斷當前這本書是否已經被借閱了
Book currentBook = bookList.getBook(i);
if (currentBook.isBorrowed()) {
// 已經被借閱了, 不能繼續借閱
System.out.println("該書籍已經被借出!");
return;
}
bookList.getBook(i).setBorrowed(true);
System.out.println("借書成功!");
}
}
ReturnOperation
package BookSystem.operation;
import BookSystem.Book;
import BookSystem.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation {
@Override
public void work(BookList bookList) {
Scanner scanner = new Scanner(System.in);
// 實現還書
System.out.println("歸還書籍");
System.out.println("請輸入要還的書籍的名稱: ");
String name = scanner.next();
int i = 0;
for (; i < bookList.getSize(); i++) {
Book book = bookList.getBook(i);
if (book.getName().equals(name)) {
break;
}
}
if (i >= bookList.getSize()) {
System.out.println("書籍沒有找到, 無法歸還!");
return;
}
// 判定當前這本書是否是已經借閱的狀態. 如果沒借出, 也就不必歸還
Book currentBook = bookList.getBook(i);
if (!currentBook.isBorrowed()) {
System.out.println("這本書沒有借出, 無法歸還!");
return;
}
currentBook.setBorrowed(false);
System.out.println("歸還書籍成功! ");
return;
}
}