图书馆管理系统
正文开始@Assassin
目录:
1. 整合性实践简介:
利用类,抽象类,封装,继承,多态,接口等知识点进行一个简单的小项目练习。
2. 核心需求:
- 1.简单的登录
- 2.管理端:
- 整理书籍(该功能为可扩展功能)
- 查阅书籍
- 增加书籍
- 删除书籍
- 打印书籍列表
- 退出
- 3.用户端:
- 查询书籍
- 借阅书籍
- 归还书籍
- 退出
3. 类的设计:
3.1 创建图书相关的类:
先创建 package book
,再创建 Book
类, 表示一本书
package com.haut.iot.book;
public class Book {
private String bookName; //书名
private String author; //作者
private double price; //价格
private String type; //类型
private boolean isBorrowed = false; //是否被借出
//构造方法,初始化属性
public Book(String bookName, String author, double price, String type) {
this.bookName = bookName;
this.author = author;
this.price = price;
this.type = type;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double 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() { //重写toString方法
return "Book{" +
"bookName='" + bookName + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
", isBorrowed=" + isBorrowed +
'}';
}
}
创建 BookList
类, 用来保存 N
本书
package com.haut.iot.book;
public class BookList {
private Book[] books = new Book[100]; //books数组存储书籍
private int usedSize = 0; //已经使用过的大小
//设置几个初始值, 方便后续测试.
public BookList() {
books[0] = new Book("三国演义", "罗贯中", 50, "小说");
books[1] = new Book("水浒传", "施耐庵", 88, "小说");
books[2] = new Book("西游记", "吴承恩", 100, "小说");
this.usedSize = 3; //将useSize置为3
}
public Book getBook(int pos) { //get book
return books[pos];
}
public void setBook(int pos, Book book) { //set book
books[pos] = book;
}
public int getUsedSize() { //get usedSize
return usedSize;
}
public void setUsedSize(int usedSize) { // set usedSize
this.usedSize = usedSize;
}
}
3.2 创建操作相关的类:
先创建 package operation
,再创建一个IOperation
接口:
package com.haut.iot.operation;
import com.haut.iot.book.BookList; //导包
public interface IOperation { //接口
void work(BookList bookList);//抽象方法
}
接下来创建一组操作类, 每个类对应一个用户的动作:
AddOperation
DeleteOperation
FindOperation
RemoveOperation
DisplayOperation
BorrowOperation
ReturnOperation
ExitOperation
先把空类创建好, 不着急实现细节。
抽象出 Operation
的好处:让操作和操作之间低耦合,让操作和用户之间低耦合
3.3 创建用户相关的类:
先创建 package user
包,再创建 User
类, 这是一个抽象类:
package com.haut.iot.user;
import com.haut.iot.book.BookList;
import com.haut.iot.operation.IOperation;
// User类是一个抽象类, 每个子类需要做两件事情
// 1. 初始化对应的操作数组
// 2. 实现 Menu 菜单
public abstract class User {
protected String name; //姓名
protected IOperation[] operations;
public User(String name) {
this.name = name;
}
//显示菜单
public abstract int showMenu();
//根据用户选项执行操作
public void doOperation(BookList bookList, int choice) {
this.operations[choice].work(bookList);
}
}
创建普通用户 NormalUser
类, 是 User
的子类:
package com.haut.iot.user;
import com.haut.iot.operation.*;
import java.util.Scanner;
public class NormalUser extends User {
public NormalUser(String name) { //构造方法
super(name); //帮助父类先完成构造
this.operations = new IOperation[] { //初始化操作数组
new ExitOperation(), //0 退出
new FindOperation(), //1 查找
new BorrowOperation(), //2 借阅
new ReturnOperation() //3 归还
};
}
@Override
public int showMenu() {
System.out.println("===========================");
System.out.println("hello " + this.name + " 欢迎来到图书管理系统~");
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; //返回选择
}
}
创建管理员用户 Admin
类,也是User
类的子类:
package com.haut.iot.user;
import com.haut.iot.operation.*;
import java.util.Scanner;
public class Admin extends User{
public Admin(String name) { //构造方法
super(name); //帮助父类先完成构造方法
this.operations = new IOperation[] { //初始化操作数组
new ExitOperation(), //0 退出
new FindOperation(), //1 查找
new AddOperation(), //2 添加
new DeleteOperation(), //3 删除
new DisplayOperation() //4 显示
};
}
@Override
public int showMenu() {
System.out.println("===========================");
System.out.println("hello " + this.name + " 欢迎来到图书管理系统~");
System.out.println("1.查找图书");
System.out.println("2.新增图书");
System.out.println("3.删除图书");
System.out.println("4.显示所有图书");
System.out.println("0.退出系统");
System.out.println("===========================");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice; //返回选择
}
}
3.4 进行代码整合:
创建 TestMain
类和 main
方法, 搭建整体逻辑:
package com.haut.iot;
import com.haut.iot.book.BookList;
import com.haut.iot.user.Admin;
import com.haut.iot.user.NormalUser;
import com.haut.iot.user.User;
import java.util.Scanner;
public class TestMain {
public static void main(String[] args) {
//1.准备书籍
BookList bookList = new BookList();
//2.登录
User user = login();//向上转型
//主循环
while (true) {
int choice = user.showMenu();
//选择是几,就可以对应哪个方法
user.doOperation(bookList, choice);//动态绑定
}
}
public static User login() {
Scanner scanner = new Scanner(System.in);
System.out.println("Please input your name :>");
String name = scanner.nextLine();
System.out.println("Please enter your identity(1.Admin 2.NormalUser) :>");
int choice = scanner.nextInt();
if (choice == 1) { //选择是1,则为管理员,反之则为普通用户
return new Admin(name);
} else {
return new NormalUser(name);
}
}
}
4. 具体实现Operation:
4.1 AddOperation:
package com.haut.iot.operation;
import com.haut.iot.book.Book;
import com.haut.iot.book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("新增图书");
Scanner scanner = new Scanner(System.in);//扫描器
//输入书名
System.out.println("Please enter the name of the book :>");
String name = scanner.nextLine();
//输入作者
System.out.println("Please enter author of book :>");
String author = scanner.nextLine();
//输入价格
System.out.println("Please enter the price of the book :>");
double price = scanner.nextDouble();
//输入类型
System.out.println("Please enter the type of book :>");
String type = scanner.next(); //这里用next避免nextDouble带来的影响
Book book = new Book(name, author, price, type);
int curSize = bookList.getUsedSize();//获取当前已存放大小
bookList.setBook(curSize, book);
bookList.setUsedSize(curSize + 1);//usedSize + 1
System.out.println("Added books successfully~");
}
}
4.2 BorrowOperation:
package com.haut.iot.operation;
import com.haut.iot.book.Book;
import com.haut.iot.book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter the name of the book :>");
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getBookName().equals(name)) {
//可以借阅
book.setBorrowed(true);
System.out.println("Borrowing successful~");
return;
}
}
System.out.println("There is no such book as you want to borrow~");
}
}
4.3 DeleteOperation:
package com.haut.iot.operation;
import com.haut.iot.book.Book;
import com.haut.iot.book.BookList;
import java.util.Scanner;
public class DeleteOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter the name of the book :>");
String name = scanner.nextLine();
int i = 0;//从0开始遍历
for (i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getBookName().equals(name)) {
//可以删除
break;
}
}
if (i == bookList.getUsedSize()) {
System.out.println("There are no books you want to delete~");
return;
}
//删除 ==>类比顺序表
for (int pos = i; pos < bookList.getUsedSize() - 1; pos++) {
Book book = bookList.getBook(pos + 1);
bookList.setBook(pos, book); //下一个元素覆盖上一个元素
}
System.out.println("Delete successful~");
bookList.setUsedSize(bookList.getUsedSize() - 1);//有效个数减一
}
}
4.4 DisplayOperation:
package com.haut.iot.operation;
import com.haut.iot.book.Book;
import com.haut.iot.book.BookList;
public class DisplayOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("显示图书");
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
System.out.println(book); //打印每一本书
}
}
}
4.5 ExitOperation:
package com.haut.iot.operation;
import com.haut.iot.book.BookList;
public class ExitOperation implements IOperation{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(1); //退出
}
}
4.6 FindOperation:
package com.haut.iot.operation;
import com.haut.iot.book.Book;
import com.haut.iot.book.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("Please enter the name of the book :>");
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getBookName().equals(name)) {
//可以查找
System.out.println(book);
System.out.println("Finding successful~");
return;
}
}
System.out.println("There is no such book as you are looking for~");
}
}
4.7 ReturnOperation:
package com.haut.iot.operation;
import com.haut.iot.book.Book;
import com.haut.iot.book.BookList;
import javafx.scene.transform.Scale;
import java.util.Scanner;
public class ReturnOperation implements IOperation {
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
Scanner scanner = new Scanner(System.in);
System.out.println("Please enter the name of the book :>");
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if (book.getBookName().equals(name)) {
//可以归还
book.setBorrowed(false);
System.out.println("Return successful~");
return;
}
}
System.out.println("There is no book you want to return~");
}
}
5. 测试结果:
测试Admin:
1.查找图书:
2.新增图书:
3.删除图书:
4.显示图书:
测试NormalUser:
1.查找图书:
2.借阅图书:
3.归还图书:
归还后标志位isBorrowed又置为false
0.退出系统:
6. 项目地址:
图书管理系统源代码:
点我跳转到github~