java图书管理系统

发布于:2024-03-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

以下为想要实现的功能:

1,Book:

首先建立Book这个类,里面包含书的详细信息,包括书名,作者,价格,类型,是否借出(用bool类型,因为只有借出和未借出两种状态),需要封装起来,均用private修饰,防止被其他类访问到。

生成书的构造方法;只需要写书名,作者,价格,类型即可,因为每创立一本书都默认为未借阅的。

打印书的信息,需要重写toString方法(可借助编译器生成),编译器自动生成的islend打印的内容为true或者false。我们可以将其改为“已借阅”和“未借阅”字样。-》 (isLend?"已借阅":"未借阅")

我们还需要让编译器自动生成get和set方法,因为成员变量只能在类中使用,所以我们需要可以在类外访问到成员变量的方法。

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

    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 isLend() {
        return isLend;
    }

    public void setLend(boolean lend) {
        isLend = lend;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isLend=" + (isLend?"已借阅":"未借阅") +
                '}';
    }
}

2,BookList

要存放所有的书,所以在这个类里面建立一个内容为书这个类的数组,并定义一个int类型的变量useSize来记录这个数组里面已经放了多少本书了。

因为useSize被封装起来,所以也要写方法来获取和设置这个值。

public class BookList {
    Book[] books=new Book[10];
    private int useSize;

    public BookList(){
        books[0]=new Book("三国演义","罗贯中",10,"小说");
        books[1]=new Book("西游记","吴承恩",12,"小说");
        books[2]=new Book("红楼梦","曹雪芹",11,"小说");
        this.useSize=3;

    }


    public int getUseSize() {
        return useSize;
    }

    public void setUseSize(int useSize) {
        this.useSize = useSize;
    }
}

3,用户

用户分为两种,一种为普通用户,另一种为管理者,这两个类里面有一些相同的成员变量以及方法,所以我们可以写一个User父类,让两个类继承与这个父类,这个样可以减少代码的重复。又因为这个父类是为了被继承,不会描述具体的对象,所以这个父类为一个抽象类。

public abstract class  User {
    private String name;

    public User(String name) {
        this.name = name;
    }
}
public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
    }
}
public class Administrator extends User{
    public Administrator(String name) {
        super(name);
    }
}

4,Main

主函数里,建立目录目录方法。里面包括输入使用者的姓名和选择身份。如果选择的为1,则返回一个实例化的Administrator,如果选择的为2.则返回一个实例化的NormalUser,之后用User user接收,实现向上转型。

public class Main {
    public 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 Administrator(name);
        }else {
            return new NormalUser(name);
        }

    }
    public static void main(String[] args) {
        User user=login();
}

这时实例化好了用户(普通用户或者管理者)。这是需要打印出他们分别对应的目录,以及选择目录中不同功能的选项。由于要打印好实例化用户的对象,所以要在Administrator和NormalUser类中分别描述目录内容。因为刚刚在实例化对象时发生向上转型,而向上转型只能访问父类下方的方法,所以要先在父类里写一个抽象方法 menu();而子类重写这个方法,用来打印目录和做出会功能的选择。

在User中增加:

public abstract int  menu();

在Administrator中增加:

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

在NormalUser中增加:

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

这时Main类通过父类的引用来调用 menu方法,发生动态绑定,从而执行对应子类的 menu方法,并返回在子类方法中选择的操作序号。

我们可以将多个操作作为一个整体,成为一个接口,这样方便后续的使用。首先,创立一个接口,接口里有一个work的方法,由于各个操作都需要用到BookList这个类,所以将BookList作为work方法的参数。然后分别将增加图书,借阅图书……建为一个类,并引用这个接口。

public interface IOperation {
    void work(BookList bookList);
}
public class AddBook implements IOperation {


    @Override
    public void work(BookList bookList) {
        System.out.println("增加图书");
    }
}
public class BorrowBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
    }
}
public class DelBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
    }
}
public class ExitSystem implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
    }
}
public class FindBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
    }
}
public class ReturnBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
    }
}
public class ShowBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
    }
}

接口创立好后,在User类中,实例化一个接口数组,并在两个子类中对接口数组进行赋值,将属于他们各自操作的接口放入接口数组中。

User中:

IOperation[] iOperations=new IOperation[]{};

在NormalUser中:

this.iOperations=new IOperation[]{new ExitSystem(),new FindBook(),
        new BorrowBook(), new ReturnBook()};

在Administrator中:

this.iOperations=new IOperation[]{new ExitSystem(),new AddBook(),
        new DelBook(),new ShowBook()};

这样在实例化好对象,发生向上转型时,也实例化好好了这个接口数组,然后在父类User中建立一个抽象方法,用这个方法去调用接口数组中的接口。

User中:

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

在NormalUser中:

@Override
public void doOperation(int choice, BookList bookList) {
    iOperations[choice].work(bookList);
}

在Administrator中:

 @Override
    public void doOperation(int choice, BookList bookList) {
        iOperations[choice].work(bookList);
    }
}

与此同时,在主函数中,通过父类的引用调用doOperation这个方法,从而去实现具体的操作。

在Main中:

while(true){
     int choice = user.menu();
     user.doOperation(choice, bookList);
 }

此时框架已经搭建好,只需要分别完成对应操作的代码:

FindBook:寻找图书时,需要遍历books这个数组,看有没有与查找到图书名字相同的有则找到了,打印出书本的信息,反之,则没找到。

public class FindBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        System.out.println("输入要找的书名或者作者姓名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了!!!");
                System.out.println(book);
                return;
            }
            if(book.getAuthor().equals(Name)){
                System.out.println("找到了!!!");
                System.out.println(book);
            }
        }
        System.out.println("没有该图书!!!");
    }
}

ShowBook:借助上述代码的for循环即可实现

public class ShowBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            System.out.println(book);
        }
    }
}

AddBook:先判断书架是否满了,如果满了,添加失败,没有满,则输入书名,此时判断书架上有无这本书,如果有不添加,如果没有,再输入作者,价格,类型等。

在BookList中增加:

public boolean isFull(){
    return useSize==books.length;
}
public void setBook(Book book){
    books[useSize]=book;
}

在AddBook中:

public class AddBook implements IOperation {

    @Override
    public void work(BookList bookList) {
        System.out.println("增加图书");
        if (bookList.isFull()==true){
            System.out.println("书架满了,添加失败");
            return;
        }
        System.out.println("输入要增加的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("此书已有,增加失败");
                System.out.println(book);
                return;
            }
        }
        System.out.println("输入书的作者");
        String author=scanner.nextLine();
        System.out.println("输入书的价格");
        int price=scanner.nextInt();
        scanner.nextLine();
        System.out.println("输入书的类型");
        String type=scanner.nextLine();
        Book book=new Book(Name,author,price,type);
        bookList.setBook(book);
        bookList.setUseSize(currentSize+1);
        System.out.println("添加成功");
    }
}

DelBook:先在BookList增加一个能改变books数组内容的方法,先找图书,如果没找到,删除失败,如果找到了,得到该书的下标pos,将pos+1下标所对应的数组内容移到以下标为pos的位置上,然后pos+1,重复上述操作,所以这个需要一个for循环来实现。

在BookList中增加:

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

在DelBook中:

public class DelBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("输入要删除的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        int i = 0;
        int pos=-1;
        for (; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了,开始删除");
                pos=i;
            }
        }
        if (i>=currentSize) {
            System.out.println("此书没有,删除失败");
            return;
        }
        for (int j = pos; j <currentSize-1 ; j++) {
            Book book1=bookList.getBook(j+1);
            bookList.setBook(j,book1);
            return;
        }
        bookList.setUseSize(currentSize-1);
        bookList.setBook(currentSize-1,null);
        System.out.println("删除成功");
    }
}

ExitSystem:要将数组中的内容全部置为null,防止内存泄漏。

public void work(BookList bookList) {
    System.out.println("退出系统");
    int currentSize=bookList.getUseSize();
    for (int i = 0; i <currentSize ; i++) {
        Book book=bookList.getBook(i);
        bookList.setBook(i,null);
    }
    System.exit(0);
}

ReturnBook:

public class ReturnBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("输入要归还的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了!!!");
                book.setLend(false);
                System.out.println("归还成功");
                return;
            }

        }
        System.out.println("归还失败");
    }
}

BorrowBook:

public class BorrowBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        System.out.println("输入要借阅的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了!!!");
                book.setLend(true);
                System.out.println("借阅成功");
                return;
            }

        }
        System.out.println("借阅失败");
    }
}

全部代码展示:

Main:

public class Main {
    public 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 Administrator(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();
            user.doOperation(choice, bookList);
        }

    }


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

    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 isLend() {
        return isLend;
    }

    public void setLend(boolean lend) {
        isLend = lend;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isLend=" + (isLend?"已借阅":"未借阅") +
                '}';
    }
}
BookList
public class BookList {
    Book[] books=new Book[10];
    private int useSize;

    public BookList(){
        books[0]=new Book("三国演义","罗贯中",10,"小说");
        books[1]=new Book("西游记","吴承恩",12,"小说");
        books[2]=new Book("红楼梦","曹雪芹",11,"小说");
        this.useSize=3;

    }

    public int getUseSize() {
        return useSize;
    }

    public void setUseSize(int useSize) {
        this.useSize = useSize;
    }
    public Book getBook(int pos){
        return books[pos];
    }
    public boolean isFull(){
        return useSize==books.length;
    }
    public void setBook(Book book){
        books[useSize]=book;
    }
    public void setBook(int pos,Book book){
        books[pos]=book;
    }
}
User
public abstract class  User {
    private String name;
    IOperation[] iOperations=new IOperation[]{};
    public User(String name) {
        this.name = name;
    }
    public abstract int  menu();
    public  abstract void doOperation(int choice, BookList bookList);
}
Administrator
public class Administrator extends User{
    public Administrator(String name) {
        super(name);
        this.iOperations=new IOperation[]{new ExitSystem(),new FindBook(),new AddBook(),
                new DelBook(),new ShowBook()};
    }

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

    @Override
    public void doOperation(int choice, BookList bookList) {
        iOperations[choice].work(bookList);
    }
}
NormalUser
public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
        this.iOperations=new IOperation[]{new ExitSystem(),new FindBook(),
                new BorrowBook(), new ReturnBook()};
    }


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

    @Override
    public void doOperation(int choice, BookList bookList) {
        iOperations[choice].work(bookList);
    }


}
IOperation
public interface IOperation {
    void work(BookList bookList);
}
AddBook
public class AddBook implements IOperation {


    @Override
    public void work(BookList bookList) {
        System.out.println("增加图书");
        if (bookList.isFull()==true){
            System.out.println("书架满了,添加失败");
            return;
        }
        System.out.println("输入要增加的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("此书已有,增加失败");
                System.out.println(book);
                return;
            }
        }
        System.out.println("输入书的作者");
        String author=scanner.nextLine();
        System.out.println("输入书的价格");
        int price=scanner.nextInt();
        scanner.nextLine();
        System.out.println("输入书的类型");
        String type=scanner.nextLine();
        Book book=new Book(Name,author,price,type);
        bookList.setBook(book);
        bookList.setUseSize(currentSize+1);
        System.out.println("添加成功");
    }
}
BorrowBook
public class BorrowBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        System.out.println("输入要借阅的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了!!!");
                book.setLend(true);
                System.out.println("借阅成功");
                return;
            }

        }
        System.out.println("借阅失败");
    }
}
DelBook

public class DelBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("输入要删除的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        int i = 0;
        int pos=-1;
        for (; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了,开始删除");
                pos=i;
                break;
            }
        }
        if (i>=currentSize) {
            System.out.println("此书没有,删除失败");
            return;
        }
        for (int j = pos; j <currentSize-1 ; j++) {
            Book book1=bookList.getBook(j+1);
            bookList.setBook(j,book1);
            return;
        }
        bookList.setUseSize(currentSize-1);
        bookList.setBook(currentSize-1,null);
        System.out.println("删除成功");
    }
}
ExitSystem

public class ExitSystem implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            bookList.setBook(i,null);
        }
        System.exit(0);
    }
}
FindBook
public class FindBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        System.out.println("输入要找的书名或者作者姓名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了!!!");
                System.out.println(book);
                return;
            }
            if(book.getAuthor().equals(Name)){
                System.out.println("找到了!!!");
                System.out.println(book);
            }
        }
        System.out.println("没有该图书!!!");
    }
}
ReturnBook

public class ReturnBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("输入要归还的书名");
        Scanner scanner=new Scanner(System.in);
        String Name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            if (book.getName().equals(Name)){
                System.out.println("找到了!!!");
                book.setLend(false);
                System.out.println("归还成功");
                return;
            }

        }
        System.out.println("归还失败");
    }
}
ShowBook
public class ShowBook implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        int currentSize=bookList.getUseSize();
        for (int i = 0; i <currentSize ; i++) {
            Book book=bookList.getBook(i);
            System.out.println(book);
        }
    }
}

本文含有隐藏内容,请 开通VIP 后查看