轻项目练习——图书管理代码

项目意义

利用前面所学的知识点:类,抽象类,封装,继承,多态,接口等综合起来的应用。

项目的核心需求

1、简单的登录
2、管理端

  • 整理书籍(该功能为可扩展功能)
  • 查阅书籍
  • 增加书籍
  • 删除书籍
  • 打印书籍列表
  • 退出

3、用户端

  • 查询书籍
  • 借阅书籍
  • 归还书籍
  • 退出

类的设计

这里用包(package)来写,然后再创建相关的类

创建图书相关的类

创建 Book 类

创建 book 包,然后创建 Book 类。包括:名字、作者、价格、种类、是否被借出。在类里面写好构造方法,重写 String 方法:

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)?" 已借出 ":" 未借出 ") +
                '}';
    }
}

创建 BookList 类

要保存书的话,我们可以使用:顺序表、链表来创建。先创建几个初始值,方便后续测试。这里使用顺序表:

public class BookList {
    
    
    private Book[] books = new Book[10];
    private int usedSize;
    public BookList() {
    
    
        books[0] = new Book("三国演义","罗贯中",17,"小说");
        books[1] = new Book("红楼梦","曹雪芹",23,"小说");
        this.usedSize = 2;
    }
    public int getUsedSize() {
    
    
        return usedSize;
    }
    public void setUsedSize(int usedSize) {
    
    
        this.usedSize = usedSize;
    }
    public Book getPos(int pos) {
    
    
        return this.books[pos];
    }
    /**
     * 设置 pos 下标为一本书(添加一本书)
     * @param pos
     * @param book
     */
    public void setBook(int pos, Book book) {
    
    
        this.books[pos] = book;
    }
}

创建操作相关的类

先创建包 operation 然后在包里面创建操作相关的操作类:

AddOperation
DelOperation
FindOperation
DelOperation
DisplayOperation
BorrowOperation
ReturnOperation
ExitOperation

在这里插入图片描述
然后分别实现类的内容:

AddOperation

在这里要实现对图书的增加,先输入书的信息,然后 new 为一本书:

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    
    
    public void work(BookList bookList) {
    
    
        System.out.println("新增图书");
        System.out.println("请输入图书的名字");
        String name = scanner.nextLine();
        System.out.println("请输入图书的作者");
        String author = scanner.nextLine();
        System.out.println("请输入图书的类型");
        String type = scanner.nextLine();
        System.out.println("请输入图书的价格");
        int price = scanner.nextInt();
        Book book = new Book(name,author,price,type);
        int size = bookList.getUsedSize();
        bookList.setBook(size,book);
        bookList.setUsedSize(size + 1);
        System.out.println("新增图书成功");
    }
}

BorrowOperation

在这里完成对图书的借出:

import book.Book;
import book.BookList;
public class BorrowOperation implements IOperation{
    
    
    public void work(BookList bookList) {
    
    
        System.out.println("借阅图书");
        System.out.println("请输入借阅的图书的名字");
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++){
    
    
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
    
    
                book.setBorrowed(true);
                System.out.println("借阅成功");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本书,无法借阅");
    }
}

DelOperation

在这里完成对图书的删除:

import book.Book;
import book.BookList;
public class DelOperation implements IOperation{
    
    
    public void work (BookList bookList) {
    
    
        System.out.println("删除图书");
        System.out.println("请输入要删除的书的名字");
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        int pos = 0;
        for (pos = 0; pos < size; pos++){
    
    
            Book book = bookList.getPos(pos);
            if(name.equals(book.getName())){
    
    
                break;
            }
        }
        if(pos == size){
    
    
            System.out.println("没有找到这本书,无法删除");
        } else {
    
    
            for (int i = pos; i < size - 1; i++){
    
    
                Book book = bookList.getPos(i + 1);
                bookList.setBook(i,book);
            }
            bookList.setBook(size,null);
            bookList.setUsedSize(size - 1);
            System.out.println("删除成功");
        }
    }
}

DisplayOperation

在这里完成对图书的显示:

import book.Book;
import book.BookList;
public class DisplayOperation implements IOperation{
    
    
    public void work(BookList bookList) {
    
    
        System.out.println("打印图书");
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++){
    
    
            Book book = bookList.getPos(i);
            System.out.println(book);
        }
    }
}

ExitOperation

在这里完成对借阅系统的退出:

import book.BookList;
public class ExitOperation implements IOperation{
    
    
    public void work(BookList bookList) {
    
    
        System.out.println("退出系统");
        System.exit(0);
    }
}

FindOperation

进行对书籍的查找:

import book.Book;
import book.BookList;
public class FindOperation implements IOperation{
    
    
    public void work(BookList bookList) {
    
    
        System.out.println("查找图书");
        System.out.println("请输入书名查找");
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++){
    
    
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
    
    
                System.out.println("找到了这本书,信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到这本书");
        return;
    }
}

IOperation

在这里写一个接口,写成工作接口。这样的话,之后调用就可以重写这个抽象类:

import book.BookList;
import java.util.Scanner;
public interface IOperation {
    
    
    void work(BookList bookList);
    Scanner scanner = new Scanner(System.in);
}

ReturnOperation

这里写归还功能:

import book.Book;
import book.BookList;
public class ReturnOperation implements IOperation{
    
    
    public void work(BookList bookList) {
    
    
        System.out.println("归还图书");
        System.out.println("请输入归还书的名字");
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++){
    
    
            Book book = bookList.getPos(i);
            if(name.equals(book.getName())){
    
    
                book.setBorrowed(false);
                System.out.println("还书成功");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有借过这本书,无需归还");
    }
}

创建用户相关的类

这里先创建一个 User 抽象类,然后再用管理员类和普通用户类去继承。

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 doWord(int choice, BookList bookList){
    
    
        iOperations[choice].work(bookList);
    }
}

AdminUser 类

这里实现管理员菜单:

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 DisplayOperation()
        };
    }
    public int menu() {
    
    
        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;
    }
}

NormalUser 类

在这里实现普通用户菜单:

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 BorrowOperation(),
                new ReturnOperation()
        };
    }
    public int menu() {
    
    
        System.out.println("===========p普通用户菜单============");
        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;
    }
}

Main 函数入口

在这里实现整个项目的入口:

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
    
    
    public static User login() {
    
    
        System.out.println("请输入你的姓名");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1 管理员  0 普通用户");
        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 user = login();
        while (true) {
    
    
            int choice = user.menu();
            //根据 choice 调用合适的操作。
            user.doWord(choice, bookList);
        }
    }
}

这里要注意的是,一直循环操作,直到用户退出。通过 login 方法来判定用户的操作,然后调用相应的方法。

实际演示

普通用户

在这里插入图片描述

管理员

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sjp151/article/details/122480002