Java学习(11):Java实现图书馆书库管理系统

2023-11-15

接上次博客:Java学习(10)多接口、接口的继承、抽象类和接口的区别、Object类【toString 、equals、hashcode】、接口实例 【compareTo、clone 】、浅拷贝和深拷贝、内部类_di-Dora的博客-CSDN博客

我们要想完成这个书库管理系统,首先应该理清楚它的底层逻辑。

我们一共写了三个包:

包1:book,它里面放了两个源文件,一个是Book,它代表了“Book”这个类,定义了相关的成员,代表了每本书的具体属性;一个是BookList,它可以被看作是一个书架,存放了我们拥有的图书的相关信息,可以对图书的信息进行查阅,还可以保存当前图书的数量。

包2:operation,它里面放了多个源文件,代表了可以对图书进行的一些相关操作,这些对象又都继承了一个接口IOPeration。

包3:user,针对不同的使用对象,该系统呈现的功能也会有所差异,所以这个包里面先实现了一个 User 作为父类,又实现了两个子类 NormalUser 和 AdminUser ,分别代表普通用户和管理员。

综上,整个系统的结构如下图:

 下面是这个系统的基础代码,我会通过注释在相关地方说明一些需要注意的知识点:

1、TestBook/src/Main.java

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;


public class Main {

    //可以利用返回值,的向上转型达到返回值的一致性
    public static User login() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1---》管理员  0---》普通用户");
        int choice = scanner.nextInt();
        if(choice == 1) {
            /*AdminUser adminUser = new AdminUser(name);
            return adminUser;*/
            return new AdminUser(name);
        }else {
            /*NormalUser normalUser = new NormalUser(name);
            return normalUser;*/
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {

        BookList bookList = new BookList();

        User user = login();
        while (true) {
            int choice = user.menu();
            //user是哪个对象? choice是几? ---》 这些能够确定:我能够操作哪个对象的哪个方法。
            //通过这两个变量可以确定之后,怎么联系起来
            /*
             * 1. 先让AdminUser和NormalUser存好各自对应的操作
             * 2. 我们就可以通过不同对象的menu调用对象对应的操作了!
             */
            user.doOperation(choice, bookList);

        }
    }
}

2、TestBook/src/book

(1)、TestBook/src/book/Book.java

package book;

public class Book {
    private String name;//书名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出 默认是false

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
        //因为boolean isBorrowed 默认是false ,所以我们不需要在构造函数里面再写一遍

    }

    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) ? "  该图书已经被借出":"  该图书未被借出")+
                /*", isBorrowed=" + isBorrowed +*/
                '}';
    }
}

(2)、TestBook/src/book/BookList.java

package book;

public class BookList {

    private Book[] books = new Book[10];

    private int usedSize;//这是一共计数器用来记录当前实际放的书的书目!

    public BookList() {
        //构造方法 来初始化成员
        this.books[0] = new Book("三国演义","罗贯中",50," 中国古典名著 ");
        this.books[1] = new Book("西游记","吴承恩",38," 中国古典名著 ");;
        this.books[2] = new Book("红楼梦","曹雪芹",45," 中国古典名著 ");;
        this.usedSize = 3;
    }
    //传入想要取得的图书的下标,得到图书
    public Book getBook(int pos) {
        return books[pos];
    }
    //传入想要放入的图书和放置的位置
    public void setBooks(int pos,Book book) {
        books[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

3、TestBook/src/operation

(1)、TestBook/src/operation/AddOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOPeration {
    @Override
        public void work(BookList bookList){
            System.out.println("新增图书!");
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入想要添加的书的书名:");
            String name = scanner.nextLine();
        //遍历整个书架,查看是否已经添加相同书籍
        for(int n =0;n<bookList.getUsedSize();n++){
            Book book2=bookList.getBook(n);
            if(book2.getName().equals(name)){
                System.out.println("书库中已包含本书,不可以重复添加!");
                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);
            int usedSize = bookList.getUsedSize() + 1;//我们需要增加一下目前拥有的书的数量
            bookList.setBooks(bookList.getUsedSize(), book);
            bookList.setUsedSize(usedSize);
            System.out.println("添加成功!");
        }
}

(2)、TestBook/src/operation/BorrowedOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;


public class BorrowedOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        int currentSize = bookList.getUsedSize();
        System.out.println("这是本书库所有藏书");
        for (int k = 0; k < currentSize; k++) {
            Book book = bookList.getBook(k);
            System.out.println(book);
        }
        System.out.println("请输入想要借阅的书的书名:");
        String nameborrow = scanner.nextLine();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(nameborrow)) {
                if(!book.isBorrowed()){
                    book.setBorrowed(true);
                    System.out.println("借阅成功!");
                    return;
                }
                else{
                    System.out.println("该图书已被借出,请重新选择!");
                }
            }
        }
        System.out.println("没有你想要借阅的书!");
    }
}

(3)、TestBook/src/operation/DelOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;


public class DelOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("这是本书库现有藏书");
        int currentSize = bookList.getUsedSize();
        for (int k = 0; k < currentSize; k++) {
            Book book = bookList.getBook(k);
            System.out.println(book);
        }
        System.out.println("请输入你想要删除的书的名字:");
        Scanner scanner = new Scanner(System.in);
        /*现在遍历书架,比对是否存在与输入字符串相同的书名
        * 如果有,那么就把后一本数的信息前移,覆盖掉需要删除的书的信息
        * */
        String namedel = scanner.nextLine();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(namedel)) {
                for(int j=i+1;j<currentSize;j++){
                    Book booklatter = bookList.getBook(j);
                    bookList.setBooks(j,booklatter);
                }
                //记得还要减少库存
                bookList.setUsedSize(bookList.getUsedSize()-1);
                System.out.println("删除图书成功!");
                return;
            }
        }
    }
}

我们可以再丰富一下这个代码: 

public class DelOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        if(currentSize==0){
            System.out.println("书架上现在没有书,无法删除书籍!");
            return;
        }
        System.out.println("这是本书库现有藏书");
        for (int k = 0; k < currentSize; k++) {
            Book book = bookList.getBook(k);
            System.out.println(book);
        }
        System.out.println("请输入你想要删除的书的名字:");
        Scanner scanner = new Scanner(System.in);
        String namedel = scanner.nextLine();

        //如果有这本书 就不能添加了
        int index=-1;
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(namedel)) {
                index=i;
                break;
            }
        }

        if(index==-1){
            System.out.println("本书库没有这本书,无法删除!");
            return;
        }

            for(int j=index;j<currentSize-1;j++){
                Book booklatter = bookList.getBook(j+1);
                bookList.setBooks(j,booklatter);
            }
            //记得还要减少库存
            bookList.setUsedSize(bookList.getUsedSize()-1);
            System.out.println("删除图书成功!");
            return;
        }
}

 (4)、TestBook/src/operation/ExitOperation.java

package operation;

import book.Book;
import book.BookList;


public class ExitOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
           bookList.setBooks(i,null);
        }
        bookList.setUsedSize(0);

        System.exit(0);
    }
}

(5)、TestBook/src/operation/FindOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOPeration{
    public void work(BookList bookList){

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的图书的书名:");
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            /*一定不可以这么写!
            * Book book = books[i];
            * 记住!我们现在是在面向对象!
            * */
            if(book.getName().equals(name)) {
                System.out.println("找到了你查找的书:");
                System.out.println(book);
                return;
            }
        }

        System.out.println("不好意思,本书库目前还未收藏该书!");
    }
}

(6)、TestBook/src/operation/IOPeration.java

package operation;

import book.BookList;

public interface IOPeration {
    void work(BookList bookList);//每个子类都要实现这个抽象的方法
}

(7)、TestBook/src/operation/ReturnOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        System.out.println("请输入你想要归还的图书的书名:");
        Scanner scanner = new Scanner(System.in);
        String nameborrow = scanner.nextLine();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(nameborrow)) {
                book.setBorrowed(false);
                System.out.println("归还图书成功!");
                return;
            }
        }
        System.out.println("没有你应该归还的书。");
    }
}

(8)、TestBook/src/operation/ShowOperation.java

package operation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("这是本书库所有藏书");

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            //同样的,这里也不可以这样写:
            //Book book = books[i];
            System.out.println(book);
        }
    }
}

3、TestBook/src/user

(1)、TestBook/src/user/User.java

package user;

import book.BookList;
import operation.IOPeration;


public abstract class User {
    protected String name;//姓名
    public IOPeration[] ioPerations;//这里我们采取的是先定义,后初始化的方式

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

    public abstract int menu();

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

(2)、TestBook/src/user/NormalUser.java

package user;

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 BorrowedOperation(),
                new ReturnOperation()
        };
    }

    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("0. 退出系统");
        System.out.println("************************");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

}

(3)、TestBook/src/user/AdminUser.java

package user;

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 ShowOperation()
        };
        /*this.ioPerations = {
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };*/
    }

    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("************************");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

}

好了,写到这里,我们的书库管理系统就大功告成了(当然了,你也可以自己加一些新的功能)!

最后我们可以来看看这个系统的运行结果:

作为管理员:

 

 作为普通用户:

 

  

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java学习(11):Java实现图书馆书库管理系统 的相关文章

  • 视频文件转换/转码 Google App Engine

    我想启动一个云计算项目 其简单任务是 接收上传的视频文件 对它们进行一些转码 转换 允许用户下载 流式传输生成的文件 我刚在想ffmpeg作为集成在的外部命令行工具Java Google App engine Application 由于很
  • Spring批量写入器限制

    我正在工作 Spring Batch 项目 从数据库读取记录然后写入rabbitmq 然后发送到HTTP消息网关 网关有150TPS我需要将我的应用程序限制为 150TPS 有没有办法带弹簧批的油门或者还有其他更好的方法吗 你能行的 在 S
  • android.os.FileUriExposedException 在 Oreo 中引起(仅!)[重复]

    这个问题在这里已经有答案了 从 Google Play Console 中 我可以看到此异常仅发生在 Android 8 0 的设备上 android os FileUriExposedException at android os Str
  • LibGDX 闪烁

    我已经使用 LibGDX UI 设置来启动一个项目 我在实现 ApplicationListener 中唯一拥有的是 public void create setScreen new LoadingScreen this 这应该会触发 Lo
  • Logback 配置在单行上有异常吗?

    我的日志被提取 传输并合并到 elasticsearch 中 多行事件很难跟踪和诊断 有没有办法使用收集器和正则表达式将异常行分组到单个记录中登录配置 https logback qos ch manual layouts html xTh
  • 声纳要求将这一领域定为最终目标

    我的程序中有以下代码 在与 Maven 集成后 我正在运行 SonarQube 5 对其进行代码质量检查 我面临这个错误 将此 public static processStatus 字段设为最终字段 将此 public static pr
  • 如何在不使用反射的情况下查看对象是否是数组?

    在Java中如何在不使用反射的情况下查看对象是否是数组 如何在不使用反射的情况下迭代所有项目 我使用 Google GWT 所以不允许我使用反射 我很想在不使用反射的情况下实现以下方法 private boolean isArray fin
  • Java J文件选择器

    我希望能够控制外观JFileChooser 我特别想保存如何JFileChooser上次显示时显示 我想保存它是否在详细信息 列表视图中使用以及列表被排序的列 例如 大小或修改日期 我知道有很多关于JFileChooser但我一直没能找到我
  • SQLiteAssetHelper 甚至在从资产文件夹复制数据库之前就导致立即崩溃

    https github com jgilfelt android sqlite asset helper https github com jgilfelt android sqlite asset helper 我要从SQLiteOpe
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • 如何在 Java 中读取/转换 InputStream 为字符串?

    如果你有一个java io InputStream对象 您应该如何处理该对象并生成一个String 假设我有一个InputStream包含文本数据 我想将其转换为String 例如我可以将其写入日志文件 最简单的方法是什么InputStre
  • 什么会导致“IO错误java.net.SocketException:选择失败”?

    我的笔记本电脑上运行一个服务器程序 相同的路由器和相同的代码 它工作正常 客户端可以连接 然而 当我将工作区复制到我的电脑并运行它时 我得到了这样的废话 IO错误java net SocketException 选择失败 这是代码 publ
  • 使用mapstruct映射不同类型列表的元素

    我们正在映射一个对象 该对象具有一个对象列表 这些对象都实现了父接口 但可能具有不同的实现 但当我们映射列表时 似乎只有来自 ParentClass 的值被映射 而不是来自子类的值 但直接映射子进程就可以了 public class Par
  • 当 javadoc 未附加到依赖项时,如何将 javadoc 引用到 Maven 的 eclipse 插件中的依赖项

    我在开发中使用 Eclipse Maven 和 Java 我使用 Maven 下载依赖项 jar 文件和 javadoc 如果可用 并使用 Maven 的 eclipse 插件为 Eclipse 生成 project 和 classpath
  • Spark java:如何处理多部分/表单数据输入?

    我在用spark http sparkjava com 开发网络应用程序 当我想上传文件时出现问题 public final class SparkTesting public static void main final String a
  • 如何在 iText 7 中创建页面大小不等的文档

    如何在 iText 7 中创建页面大小不等的文档 iText7 可以吗 在iText5中 我使用document setPageSize and document newPage 如果您通过高级 API 添加内容 Document add
  • 如何在java中进行多处理,以及预期的速度提升是多少?

    我是一个新手 使用 Java 对 csv 文件进行一些数据处理 为此 我使用 Java 的多线程功能 线程池 将 csv 文件批量导入到 Java 中 并对每一行执行一些操作 在我的四核处理器上 多线程大大加快了处理速度 我很想知道多处理如
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置
  • 旧的和奇异的 JVM 上 java.io.BufferedInputStream 的默认缓冲区大小是多少?

    我一直在为一篇关于以下内容的博客文章进行一些研究java io BufferedInputStream和缓冲区 显然 多年来 默认值已从区区 512 字节增长到 8192 字节 冒昧地 Sun 的 Java 7 实现 甚至在JDK 1 1
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然

随机推荐