Java——图书管理系统

前言

本篇文章来带大家做一个简单的练习:图书管理系统。

1.展示

在开始之前,带大家看看完成后的效果:
请添加图片描述
可以看到,这里图书管理系统有管理员和用户,都可以对图书进行操作。下面来进行实现。

2.代码实现

在这个系统中,我创建了三个包:
在这里插入图片描述
book用于存放图书。
operation用于对各种操作的实现
user用于管理员和用户的实现。

2.1 book包

首先定义一个Book类,属性包含名称,作者,价格,类型,是否被借出。

public class Book {
    public Book(String name, String author, int 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 ? "已被借出" : "未被借出")+
                '}';
    }

    private String name;
    private String author;
    private int price;
    private String type;
    public boolean isBorrowed;

    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 void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }
}

而这只是一本书,需要一个”书架“来存放多个书,于是创建一个BookList类,包含了一个Book数组,和存放数量。

public class BookList {
    public static final int MAX_BOOKS = 10;
    private Book[] books;
    private int usedSize;

    public BookList() {
        this.books = new Book[MAX_BOOKS];
        books[0] = new Book("三国演艺", "罗贯中", 19, "武侠");
        books[1] = new Book("水浒传", "施耐庵", 29, "武侠");
        books[2] = new Book("红楼梦", "曹雪芹", 39, "小说");
        this.usedSize = 3;
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }


    public Book getBooks(int pos) {
        return books[pos];
    }

    public void setBooks(int pos, Book book) {
        books[pos] = book;
    }

    public boolean isExist(String name) {
        for (int i = 0; i < usedSize; i++) {
            if (name.equals(books[i].getName())) {
                return true;
            }
        }
        return false;
    }

    public boolean isFull() {
        return usedSize == MAX_BOOKS;
    }

    public boolean isEmpty() {
        return usedSize == 0;
    }
}

还有三个方法,将在后面操作包中用到。

2.2 operation包

管理员和普通用户一共有七个操作,添加,删除,显示,退出,借阅,归还,查找,这些操作都是基于图书来进行的,于是可以定义一个接口IOperation,包含一个work类,这些操作只需重写work类就可以实现相关的操作。

public interface IOperation {
    void work(BookList books);
}

剩下的七个类:
AddBook

public class AddBook implements IOperation {
    @Override
    public void work(BookList books) {
        int size = books.getUsedSize();
        System.out.println("新增图书");
        if (books.isFull()) {
            System.out.println("图书库已满,无法新增");
            return;
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入图书名称:");
        String name = scanner.next();
        if (books.isExist(name)) {
            System.out.println("图书已存在,无法新增");
            return;
        }
        System.out.println("请输入图书作者:");
        String author = scanner.next();
        System.out.println("请输入图书价格:");
        int price = scanner.nextInt();
        System.out.println("请输入图书类型:");
        String type = scanner.next();
        Book book = new Book(name, author, price, type);
        books.setBooks(size, book);
        System.out.println("新增成功:");
        books.setUsedSize(size + 1);
        System.out.println(books.getBooks(size));
    }
}

BorrowBook

public class BorrowBook implements IOperation {
    @Override
    public void work(BookList books) {
        System.out.println("借阅书籍");
        int size = books.getUsedSize();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要借阅的书籍名称");
        String name = scanner.nextLine();
        for (int i = 0; i < size; i++) {
            if (name.equals(books.getBooks(i).getName())) {
                if (books.getBooks(i).isBorrowed()) {
                    System.out.println("该书籍已被借出");
                    return;
                }
                books.getBooks(i).setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }

        }
        System.out.println("未找到该书籍");
    }
}

DelBook

public class DelBook implements IOperation {
    @Override
    public void work(BookList books) {
        System.out.println("删除图书");
        if (books.isEmpty()) {
            System.out.println("图书库为空,无法删除");
            return;
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的图书名称:");
        String name = scanner.next();

        int size = books.getUsedSize();
        for (int i = 0; i < size; i++) {
            if (name.equals(books.getBooks(i).getName())) {
                if (books.getBooks(i).isBorrowed()) {
                    System.out.println("该图书已被借出,无法删除");
                    return;
                }
                for (int j = i; j < size - 1; j++) {
                    books.setBooks(j, books.getBooks(j + 1));
                }
                books.setBooks(size - 1, null);
                System.out.println("删除成功");
                books.setUsedSize(size - 1);
                return;
            }
        }
        System.out.println("未找到该图书");
    }
}

ExitSystem

public class ExitSystem implements IOperation {
    @Override
    public void work(BookList books) {
        System.out.println("退出系统");
        System.exit(0);
    }
}

FindBook

public class FindBook implements IOperation {
    @Override
    public void work(BookList books) {
        System.out.println("查找书籍");
        int size = books.getUsedSize();
        System.out.println("请输入要查找的书籍名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();

        for (int i = 0; i < size; i++) {
            if (name.equals(books.getBooks(i).getName())) {
                System.out.println("找到该书籍:");
                System.out.println(books.getBooks(i));
                return;
            }
        }
        System.out.println("未找到该书籍");
    }
}

ReturnBook

public class ReturnBook implements IOperation {
    @Override
    public void work(BookList books) {
        System.out.println("归还书籍");
        int size = books.getUsedSize();
        System.out.println("请输入要归还的书籍名称");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < size; i++) {
            if (name.equals(books.getBooks(i).getName())) {
                if (!books.getBooks(i).isBorrowed()) {
                    System.out.println("该书籍未被借出");
                    return;
                }
                books.getBooks(i).setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
    }
}

ShowBook

public class ShowBook implements IOperation {
    @Override
    public void work(BookList books) {
        System.out.println("展示图书");
        int size = books.getUsedSize();
        for (int i = 0; i < size; i++) {
            System.out.println(books.getBooks(i));
        }
    }
}

这些操作大家应该都很熟悉,就不做过多解释了。

2.3 user包

一共有两种人员,管理员和普通用户,我们可以定义一个抽象类User来让管理员类和普通用户类继承他。
先看User类

public abstract class User {
    private String name;

    public IOperation[] operations;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
}

这里有一个抽象方法menu(),两种人的菜单都不一样,可以对User类的menu()方法进行重写,注意,这里还写了一个未初始化的接口数组,用于存放各自的操作类。

NormalUser

public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
        this.operations = new IOperation[]{
                new ExitSystem(),
                new FindBook(),
                new BorrowBook(),
                new ReturnBook()
        };
    }


    @Override
    public int menu() {
        System.out.println("欢迎" + this.getName() + "来到图书系统");
        System.out.println("*******普通用户菜单*******");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        System.out.println("************************");
        System.out.println("请输入您的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice > 3 ? -1 : choice;

    }
}

AdminUser

public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
        this.operations = new IOperation[]{
                new ExitSystem(),
                new FindBook(),
                new AddBook(),
                new DelBook(),
                new ShowBook()

        };
    }


    @Override
    public int menu() {
        System.out.println("欢迎" + this.getName() + "进入图书管理系统");
        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 > 4 ? -1 : choice;

    }
}

可以看到两个的代码十分相似。各自的接口数组都存放了相应的操作类。

2.4 Main类

最后就是用Main类把这些包都串起来。

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) {
            return new AdminUser(name);
        } else {
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {

        BookList bookList = new BookList();
        User user = login();

        while (true) {
            int choice = user.menu();
            if (choice < 0) {
                System.out.println("您的输入有误,请重新输入");
                continue;
            }
            user.operations[choice].work(bookList);
        }
    }
}

可以看到实现了一个login方法,根据选择,可以返回相应的身份,而后调用了相应的menu方法,返回一个数字下标,对印着接口数组种的各种类,让操作类得以实现。

user.operations[choice].work(bookList);

这一行应该是相对难以理解的,我们分开来看,首先第一个user,在界面开始时,如果你选择1,你就对应的是管理员,选择2,则对应的是普通用户,然后是.operations[choice],这里是调用接口方法的数组,比如你是管理员,若choice是1,则可以当作new FindBook(),,于是可以当作user.new FindBook(),而后就是调用这个类的work方法,传入一个bookList对象,来进行操作。

总结

到此图书管理系统就全部介绍完毕了,希望大家看完之后也能对Java类和对象有更深层次的理解,我也知道这个管理系统并不完备,还有许多bug,且只实现了主要的功能,这只是真正图书管理系统的一小部分而已,但是就是这一小部分也花费了我十分长的时间,有机会的话我会在后面继续完善这个系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值