【用java在控制台实现简单的图书管理系统】

> 这个简易的图书管理系统,适合javaSE基础学完,所能做的项目,让学到的知识合理运用起来!检验自己的不二选择!也希望本博客对你有所帮助。(能帮助一点点我就心满意足了)

book包

Book类

这个类是用对图书的这些属性(书名,作者,类型,价格)进行了封装。为了允许外部代码访问和修改这些属性,你提供了公共的 getter 和 setter 方法。并且此处重写了toString()方法。

package book;

import java.util.Objects;

public class Book {
    private String name;
    private String author;
    private String type;
    private int price;
    private boolean isBorrowed;

    public Book(String name, String author, String type, int price) {
        this.name = name;
        this.author = author;
        this.type = type;
        this.price = price;
    }

    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 String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Book book = (Book) o;
//        return price == book.price && Objects.equals(name, book.name) && Objects.equals(author, book.author) && Objects.equals(type, book.type);
//    }


    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", type='" + type + '\'' +
                ", price=" + price +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

改进:
1.看这段代码你会发现我注释掉了equals(Object o)方法,因为JVM提供的equals(Object o)方法比较的是所有成员变量,而在接下来的操作,你可以根据自己的需要重写equals(Object o)。
2.重写的toString(),因为isBorrowed只有true或false两种,所以我们在这里可以运用三目操作符((isBorrowed==true)?“已借出”:“未借出”)

BookList类

package book;

public class BookList {
    public int usedSize;//有效的数据个数【实际存放书的数量】
    Book[] books=new Book[10];//定义了Book类型的数组,里面可以存放10本书

    public BookList() {
        this.books[0] = new Book("西游记","吴承恩","小说",66);
        this.books[1] = new Book("红楼梦","曹雪芹","小说",77);
        this.books[2] = new Book("三国演义","罗贯中","小说",88);
        this.usedSize = 3;//在创建书架时直接默认存在3本书
    }

    public int getUsedSize() {
        return usedSize;
    }

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

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

    public void setBooks(Book[] books) {
        this.books = books;
    }
}

user包

User 类

User我们这里只设定了两类人:管理员、普通用户
因为管理员和普通用户进入系统的操作,以及界面是差不多(不一样的是界面上的操作可能不同)。所以我们这里定义了抽象的User类,管理员或者普通用户在使用时只需要继承User类,重写抽象User类中的方法,这样大大减少了代码数量。

package user;

import book.BookList;
import opertion.IOperation;

public abstract class User {
    String name;
    IOperation[] iOperations;

    public abstract int menu();

    public abstract void doOpertion(int choice, BookList bookList);

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

AdmiUser类(管理员)

继承User类,重写了User中的抽象方法,在构造函数中将iOperations数组初始化。

package user;

import book.BookList;
import opertion.*;

import java.util.Scanner;
//管理员
public class AdmiUser extends User{
    public AdmiUser(String name) {
        super(name);
        this.iOperations=new IOperation[]{
                new ExitOpertion(),//退出程序
                new FindOpertion(),//查找
                new AddOpertion(),//增添
                new DeletOpertion(),//删除
                new ShowOpertion()//显示
        };
    }
    public  int menu(){
        int choice = -1;
        while(true) {
            System.out.println("欢迎 " + this.name + " 来到图书管理系统");
            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);
            choice = scanner.nextInt();
            if(choice >=0 && choice <= 4){
                break;
            }else {
                System.out.println("输入错误");
            }
        }
        return choice;
    }
        public void doOpertion(int choice, BookList bookList){
        this.iOperations[choice].work(bookList);
    }
}

NormalUser类(管理员)

继承User类,重写了User中的抽象方法,在构造函数中将iOperations数组初始化。(和AdmiUser(管理员)初始的数组内容不同,以及重写的menu()不同)

package user;

import book.BookList;
import opertion.*;

import java.util.Scanner;
//普通用户
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOpertion(),
                new FindOpertion(),
                new BorrowOpertion(),
                new ReturnOpertion(),
                new ShowOpertion()
        };
    }


    public int menu() {
        int choice = -1;
        while(true) {
            System.out.println("欢迎 " + this.name + " 来到图书管理系统");
            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);
            choice = scanner.nextInt();
            if(choice >=0 && choice <= 4){
                break;
            }else {
                System.out.println("输入错误");
            }
        }
        return choice;
    }
    public void doOpertion(int choice, BookList bookList){
        this.iOperations[choice].work(bookList);
    }
}

opertion包

IOperation接口

这个接口是管理员和普通用户对图书进行操作的(查找图书,增加图书,借阅图书…)
这个图书管理系统基本上都是通过书名来进行操作的

package opertion;

import book.BookList;
//定义一个接口来对图书进行操作
    public interface IOperation {
        void work(BookList bookList);
    }

FindOpertion(查找图书)

package opertion;

import book.Book;
import book.BookList;

import java.util.Scanner;
//这里是通过书名进行找书
public class FindOpertion implements IOperation {
    @Override
    public void work(BookList bookList) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要查找的书名");
        String name = sc.nextLine();
//        System.out.println("请输入你要查找的作者");
//        String author = sc.nextLine();
//        System.out.println("请输入你要查找书的类型");
//        String type = sc.nextLine();
//        System.out.println("请输入你要查找书的价格");
//        int price = sc.nextInt();
//        Book book = new Book(name, author, type, price);
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if (bookList.getBooks()[i].getName().equals(name)) {
                System.out.println(bookList.getBooks()[i].toString());
                return;
            }
        }
        System.out.println("没有该书");
    }
}

一般情况下,都是通过书名来进行查找图书的。对于真正的图书管理系统,肯定不止光书名来进行查找,所以这里有两种改进方式:
1.if (bookList.getBooks()[i].getName().equals(name))将name改成其他的(author)。
2.可以重写equals(Object o)你想通过啥判断就重写方法中通过啥比较。

AddOpertion(增加图书)

增加图书需要先在图书中查找看是否有这个本书,没有就添加,并将sedSize加1.

package opertion;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOpertion implements IOperation {
    @Override
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要增加的书名");
        String name=sc.nextLine();
        System.out.println("请输入你要增加书的作者");
        String author=sc.nextLine();
        System.out.println("请输入你要增加书的类型");
        String type=sc.nextLine();
        System.out.println("请输入你要增加书的价格");
        int price=sc.nextInt();
        Book book=new Book(name,author,type,price);
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if (bookList.getBooks()[i].equals(book)){
                System.out.println("有该书,无需添加");
                return;
            }
        }
        bookList.getBooks()[bookList.getUsedSize()]=book;
        bookList.setUsedSize(bookList.getUsedSize()+1);
        System.out.println("添加成功");
    }
}

DeletOpertion(删除图书)

删除图书需要用到数组的覆盖,就是你需要定义一个变量,这个变量是来标记你要删除书的位置(数组下表)(没有则没有这本书)。特别注意的是:for (int i = flag; i < bookList.getUsedSize() - 1; i++) ,这里必须是bookList.getUsedSize() - 1,不-1, bookList.getBooks()[i] = bookList.getBooks()[i + 1];会抛出异常(数组溢出)。

package opertion;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DeletOpertion implements IOperation {
        @Override
        public void work(BookList bookList) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入要删除的书名");
                String name = sc.nextLine();
                int flag = -1;
                for (int i = 0; i < bookList.getUsedSize(); i++) {
                        if (bookList.getBooks()[i].getName().equals(name)) {
                                flag = i;
                        }
                }
                if (flag != -1) {
                        for (int i = flag; i < bookList.getUsedSize() - 1; i++) {
                                bookList.getBooks()[i] = bookList.getBooks()[i + 1];
                        }
                        bookList.setUsedSize(bookList.getUsedSize() - 1);
                        System.out.println("删除成功");
                } else {
                        System.out.println("没有该书");
                }
        }
}

BorrowOpertion(借阅图书)

借阅图书这里也是通过书名(通例)来借阅,这里需要判断书名和未被借出两个共同满足,才可以借阅成功!

package opertion;

import book.Book;
import book.BookList;

import java.util.Scanner;
//这里是通过书名来进行借阅图书的
public class BorrowOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要借阅的书名");
        String name=sc.nextLine();
//        System.out.println("请输入你要借阅书的作者");
//        String author=sc.nextLine();
//        System.out.println("请输入你要借阅书的类型");
//        String type=sc.nextLine();
//        System.out.println("请输入你要借阅书的价格");
//        int price=sc.nextInt();
//        Book book=new Book(name,author,type,price);
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.getBooks()[i].getName().equals(name)&& bookList.getBooks()[i].isBorrowed()!=true){
                bookList.getBooks()[i].setBorrowed(true);
                System.out.println("借书成功");
                return;
            }else if(bookList.getBooks()[i].getName().equals(name)&& bookList.getBooks()[i].isBorrowed()==true){
                System.out.println("该书被借出");
                return;
            }
        }
        System.out.println("没有该书");
    }
}

ReturnOpertion (归还图书)

归还图书我这里设置的是你需要知道图书的所有信息才可以归还,并且也需要满足已经借出两个条件才可以还书成功!

package opertion;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要归还的书名");
        String name=sc.nextLine();
        System.out.println("请输入你要归还书的作者");
        String author=sc.nextLine();
        System.out.println("请输入你要归还书的类型");
        String type=sc.nextLine();
        System.out.println("请输入你要归还书的价格");
        int price=sc.nextInt();
        Book book=new Book(name,author,type,price);
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if (bookList.getBooks()[i].equals(book)&&bookList.getBooks()[i].isBorrowed()==true){
                bookList.getBooks()[i].setBorrowed(false);
                System.out.println("归还成功");
                return;
            }else if(bookList.getBooks()[i].equals(book)&&bookList.getBooks()[i].isBorrowed()!=true){
                System.out.println("该书未被借出");
            }
        }
        System.out.println("没有该书");
    }
}

特别注意这段代码:Book book=new Book(name,author,type,price);这行代码是在创建一个新的 Book 类型的对象,并将其赋值给变量 book

ShowOpertion(展示图书)

这里就比较简单,就是简单一个数组的遍历,重写的toString()方法

package opertion;

import book.BookList;

public class ShowOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            System.out.println(bookList.getBooks()[i].toString());
        }
    }
}

ExitOpertion(退出程序)

package opertion;

import book.BookList;

public class ExitOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出成功");
        System.exit(0);
    }
}

Main(执行程序)

定义一个静态方法,返回值类型进行了向上转型

import book.BookList;
import user.AdmiUser;
import user.NormalUser;

import user.User;
import java.util.Scanner;

public class Main {
    private static User login(){
        System.out.println("请输入你的姓名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        System.out.println("请输入你的身份:1.管理员;2.普通用户");
        int choice = scanner.nextInt();
        if(choice == 1){
            return new AdmiUser(name);//创建一个 AdmiUser 类的实例,并使用传入的 name 参数来初始化这个实例。
        } else if (choice == 2) {
            return new NormalUser(name);
        }else {
            System.out.println("输入错误");
            return null;
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();

        User user = login();
        while (true){
            int choice = user.menu();
            user.doOpertion(choice,bookList);
        }
    }
}