Java 基础语法纯 Java《图书管理系统》练习

Posted 吞吞吐吐大魔王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 基础语法纯 Java《图书管理系统》练习相关的知识,希望对你有一定的参考价值。

前言:

之前介绍了很多 Java 语法的基础知识,但此时我感觉到有些知识学了但还是没学透。所以自己写了个图书管理系统,并且写下这篇文章,让自己对于 Java 语法的理解的更加透彻!

1. 构思

首先我们在敲之前要想好整体的框架,一个图书管理系统应该有什么呢?此时我们可以假想去图书馆借书

  • 用户: 就是我们要和这些书有接触的人(包括借书的人图书馆的管理员),可以构造一个 User 类去构建这个用户的共性,再通过普通用户和管理员对这个 User 类继承,并完善各自的特性
  • 书: 即我们要接触的对象
    • 每本书: 对于所有的书我们可以寻找共性(书的名字、作者、价格、类型)去构造一个 Book 类
    • 存放书的书架: 假如所有的书都在书架上,那么我们查、借、还、增、删等操作都是要借助书架来完成,这就好比一个数组,我们将这些书存入进去,那么对所有书的操作就只需要对这个书架进行就行。因此我们可以构造一个书的顺序表 BookList,然后添加一系列操作,去完成对书的各种功能

此时我们就有了用户、书、书架,而它们之间的联系就是

用户通过对书架进行操作然后去影响的状态

而对于书架的操作我们其实就可以抽象的看成下面这样的函数

public void work(BookList bookList);

而这个函数就是各种操作的一个抽象,故我们可以将对书架的操作抽象出来,写一个接口 Ioperation,再将各种功能继承这个接口,那么我们对书架进行操作时,只需要使用 work 方法,就可以实现不同的操作

2. 整体框架

接下来我们先用做一个框架图,以便于我们在敲代码时,可以依照这个框架去完善各部分

那么接下来我们就根据构思先将基本的框架搭好

3. 解析各包代码

首先我根据框架图,先新建了三个包

  • 用户(user 包)
  • 书(book 包)
  • 操作(operation 包)

2.1 书(book 包)

这个包里面就是和书有关的内容,包括 Book 类和 BookList

2.2.1 单独的书(Book 类)

构建这个类我们先将我们自己抽取的共性想出来,我自己是使用了下面这几个属性

书名、作者、价格、类型、是否借出

接下来就之间上代码吧,因为这个比较简单

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

    public String getName() {
        return name;
    }
    
    public boolean isLent() {
        return isLent;
    }

    public void setLent(boolean lent) {
        isLent = lent;
    }

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

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

由于我定义的几个成员变量都是私有的,所以下面创建了一些成员的 getter 和 setter 方法(有些没用到的 getter 和 setter 方法我个人删除了,因为本次没有用到)

并且重写了 toString 方法,因为我们在显示书籍信息的时候会更舒服

最后再写了个构造方法,因为新增书籍时肯定要将书的各种信息都存入

2.2.2 书架(BookList)

书架我个人就设计成了顺序表,那么我们要用到哪些成员和方法呢?

  • 已存入书的数量
  • 书的数组:用来存放书
  • 一些方法

先看我的代码吧

public class BookList {
    private int usedSize=3;
    private  Book[] books =new Book[10];
    public  BookList(){
        this.books[0]=new Book("Java 核心技术卷I","Cay S.Horstmann",119,"很贵很贵的书");
        this.books[1]=new Book("鸟哥的 Linux 私房菜","鸟哥",118,"很贵很贵的书");
        this.books[2]=new Book("剑指 Offer","何海涛",65,"很贵的书");
    }
    public int getSize(){
        return usedSize;
    }
    public void setSize(int size){
        this.usedSize=size;
    }
    public void setBooks(int pos, Book book){
        books[pos]=book;
    }
    public Book getBook(int pos){
        return books[pos];
    }
}

上述代码中,个人就先存放了三本书,故 usedSize 为3,而整体设计最多可以放10本书,这其实可以根据不同的情况进行修改

后面便是一些方法,包含

  • 得到存入书的数量:寻找某本书时遍历要用到
  • 修改存入书的数量:增加和删除书籍时要用到
  • 得到某本书:取书时要用到
  • 修改某本书:新增书籍时要将新的书的信息录入

2.2 对于书架的操作(operation 包)

该包类即我们用户进行的操作,我个人设计了下面几个操作

新增、删除、查找、借阅、归还、显示所有书籍、退出系统

由于对于书架的操作我们其实就可以抽象的看成下面这样的函数

public void work(BookList bookList);

所以我们先看下接口的代码

2.2.1 操作接口

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

这里其实就用到了接口和抽象类

接着我们再通过各种操作去继承接口,并完善各自的内容

2.2.2 新增书籍

public class AddOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        if(bookList.getSize()==10){
            System.out.println("书库已满,无法增加书籍");
            return;
        }
        Scanner reader = new Scanner(System.in);
        String name;
        String author;
        int price;
        String type;
        System.out.print("请输入你要新增的书名:");
        name=reader.nextLine();
        System.out.print("请输入该书的作者:");
        author=reader.nextLine();
        System.out.print("请输入该书的价格:");
        price=reader.nextInt();
        reader.nextLine();
        System.out.print("请输入该书的类型:");
        type=reader.nextLine();

        int pos=bookList.getSize();
        Book book = new Book(name, author, price, type);
        bookList.setBooks(pos, book);
        bookList.setSize(bookList.getSize()+1);
    }
}

2.2.3 删除书籍

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getSize()==0){
            System.out.println("书库无书,无法进行删除操作");
            return;
        }
        Scanner reader = new Scanner(System.in);
        String name;
        System.out.print("请输入你要删除的书名:");
        name=reader.nextLine();
        for(int i=0;i<bookList.getSize();i++){
            if(name.equals(bookList.getBook(i).getName())){
                while(bookList.getSize()-i-1!=0){
                    bookList.setBooks(i,bookList.getBook(i+1));
                    i++;
                }
                bookList.setSize(bookList.getSize()-1);
                return;
            }
        }
        System.out.println("书库无该图书,无法进行删除操作");
    }
}

2.2.4 查找书籍

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getSize()==0){
            System.out.println("书库无书");
            return;
        }
        Scanner reader = new Scanner(System.in);
        String name;
        System.out.print("请输入你要查找的书名:");
        name=reader.nextLine();
        for(int i=0;i<bookList.getSize();i++){
            if(name.equals(bookList.getBook(i).getName())){
                System.out.println("已查询找到该书,信息如下:");
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("未查询到该书");
    }
}

2.2.5 借阅书籍

public class LendOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getSize()==0){
            System.out.println("书库无书,无法进行借阅");
            return;
        }
        Scanner reader = new Scanner(System.in);
        String name;
        System.out.print("请输入你要借阅的书名:");
        name=reader.nextLine();
        for(int i=0;i<bookList.getSize();i++){
            if(name.equals(bookList.getBook(i).getName())){
                if(bookList.getBook(i).isLent()==false) {
                    bookList.getBook(i).setLent(true);
                    System.out.println("借阅成功");
                }else{
                    System.out.println("该书已被他人借阅,借阅失败");
                }
                return;
            }
        }
        System.out.println("未查询到该书,借阅失败");
    }
}

2.2.6 归还书籍

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner reader = new Scanner(System.in);
        String name;
        System.out.print("请输入你要归还的书名:");
        name=reader.nextLine();
        for (int i =0;i<bookList.getSize();i++){
            if(name.equals(bookList.getBook(i).getName())){
                if(bookList.getBook(i).isLent()==true){
                    bookList.getBook(i).setLent(false);
                    System.out.println("该书归还成功");
                    return;
                }else{
                    System.out.println("该书未被借阅,操作错误");
                    return;
                }
            }
        }
        System.out.println("未查询到你要归还的书籍,操作错误");
    }
}

2.2.7 显示所有书籍信息

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getSize()==0){
            System.out.println("书库无书");
        }
        for(int i=0;i<bookList.getSize();i++){
            System.out.println(bookList.getBook(i));
        }
    }
}

2.2.8 退出系统

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("图书管理系统已退出,欢迎下次使用!");
        System.exit(0);
    }
}

上述具体操作其实就是你对一个顺序表进行一系列操作,当你去思考敲它们时,会发现是整个工程比较简单的一环

2.3 用户(user 包)

这个包里即我要构造的用户(管理员和普通用户),因此我先创建了父类 User。那么一个用户的基本信息有什么呢?

  • 用户名
  • 菜单:我们假想当我们去 ATM 机取钱时,我们可以看到一个界面
  • 用户要进行的操作

那么我们先看我的代码吧!

2.3.1 User 类

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

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

    abstract public int menu();

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

此时你会发现除了用户名的定义,其他属性和行为都有点细节问题需要思考

  • 菜单:因为普通用户和管理员的菜单是不同的,而我们不需要父类去实现具体的代码,所以我修改成了抽象类

  • 用户要进行的操作:其实整合框架的时候才很容易理解上述代码中的

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

    因为我们是需要用户去进行这些操作,而我个人针对普通用户和管理员设计成的界面其实如下图

    所以我先创建了一个操作的数组,注意此时我没有创建对象,因为普通用户和管理员的对象(即操作)是不同的,看上述菜单就知道。之后构造了一个方法(即用户用来调用操作的),将对应操作的序号,以及要操作的对象传进去,就可以实现这些操作的使用

那么现在对于管理员和普通用户的定义也很简单了,即要将菜单和操作数组的对象进行修改

2.3.2 AdminUser 类

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("1:查找图书");
        System.out.println("2:新增图书");
        System.out.println("3:删除图书");
        System.ou

以上是关于Java 基础语法纯 Java《图书管理系统》练习的主要内容,如果未能解决你的问题,请参考以下文章

❤️是你的期末大作业吗?Java基础语法就能实现的图书管理系统 ❤️(建议收藏)

JAVA 语法基础综合练习——学生成绩管理系统

Java——面向对象练习(图书管理系统的实现)

Java开发 | 图书管理系统 | 小程序 | 小练习

Java初学者也可以实现的图书系统小练习

简单图书管理系统练习-Java+Mysql