【Java SE:面向对象项目01】Java图书馆管理系统

图书馆管理系统

正文开始@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~

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁海没有七号公园

谢谢你%%%

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值