【Java】使用JavaSE实现图书管理系统详解

news2024/11/23 22:33:07

目录

 

1.前言

2.初步框架搭建

3.Book 书架和书架里的书

3.1书本

3.2书架

4.User  用户和管理员

4.1初步想法

4.2用户

4.3管理员

4.4main函数中如何调用不同的成员

5.方法的调用

  5.1接口

5.2增加图书

5.3借阅图书

  5.4删除图书

5.5退出系统

5.6查找图书

5.7归还图书

5.8显示图书

5.9main方法

6.小结


1.前言

  大家好,今天我来带大家使用JavaSE的知识来完成一个简单的图书管理系统。在日常生活中,我们需要各种管理系统来管理我们的一些信息,比如学生管理系统,图书管理系统等。在这些系统中,我们包含了对增删查改等功能。我们将从Java面向对象的特性来庖丁解牛,逐步详细向大家分析。

2.初步框架搭建

  既然要使用面向对象的语言来设计该系统,我们就得把该系统的主要对象先构思出来。首先我们需要一个书架。来存放和使用我们的图书。然后需要用户或者管理员,对这些书进行操作。当然,这些操作的方法我们也需要一个方法区。以便我们对书架上的书进行正确的操作。

 这几个包里面分别存放我们上述所描述的三个对象。接下来我们逐步的在里面加入我们所需要的类,通过面向对象的思想来统筹它们协作完成我们的图书管理系统。

3.Book 书架和书架里的书

  既然我们需要书架,那么书架里也需要我们的书,我们创建两个类,分别是书和书架。

3.1书本

   我们首先需要在书这个类里,创建一些成员变量来描述这些书的信息,如书名,作者,价格,类型,状态(是否被借出)等。这些变量我们可以使用private关键字把它们封装起来,并且提供get和set这种公开接口,以便对它们进行操作。为了后续方便打印,我们重写了object类的toString方法。并在我们这个方法里使用三目运算符来进行书的状态判断。

package Book;

public class Book {
    private String name;// 书名
    private String author; //作者
    private double price;//价格
   private String type;//类型
    private boolean isBorrowed;//状态 (是否被借出)

    public Book(String name, String author, double price, String type) {
       this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    public Book(boolean isBorrowed){
        this.isBorrowed=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 double getPrice() {
        return price;
    }

    public void setPrice(double 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 "书{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + (isBorrowed==true?"已被借阅":"未被借阅" )+
                '}';
    }
}

3.2书架

 拥有了书这个类,我们需要一个书架来存放这些书,并且判断书架里存放了几本书。我们初始可以在书架的构造方法(以便后续的操作)里自定义一些书进行存放。

package Book;

import java.util.Scanner;

public class BookList {
    Book[] books=new Book[10];
    private int usesize;//查看有多少本书
    public BookList(){
       books[0]=new Book("三国演义","罗贯中",10.5,"小说");
        books[1]=new Book("西游记","吴承恩",18.8,"小说");
        books[2]=new Book("水浒传","施耐庵",22.5,"小说");
        this.usesize=3;
    }




    public int getUsesize() {
        return usesize;
    }

    public void setUsesize(int usesize) {
        this.usesize = usesize;
    }

    public Book getBooks(int pos) {
        return books [pos];
    }
    public Book setbooks(int pos,Book book){
        return  books[pos]=book;
    }

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

4.User  用户和管理员

4.1初步想法

  为了方便我们进行调用不同的成员(用户或者管理员),我想到了使用一个抽象类来当它们的父类,并且让这两个成员继承它。这样我们就可以构成向上转型,使用多态的思想来调用不同的成员了。

package user;


import Book.BookList;
import operation.IoPeration;

public abstract class User  {
    public User(String name) {
        this.name = name;
    }
    String name;
    protected IoPeration[] ioPerations;
    public abstract int menu();
    public void doWord(int choice, BookList bookList){
        ioPerations[choice].work(bookList);
    }


}

4.2用户

  我们的用户继承了User以后,也要考虑到后续方法的调用,所以我使用一个接口数组用来存放这些方法,这样我就可以使用数组的下标来调用不同的方法了。并且将我们的菜单栏也描述出来。

package user;

import operation.*;

import java.util.Scanner;

public class Normal extends User{
    public Normal(String name) {
        super(name);
        //这个接口数组方便我们调用不同的方法。
        this.ioPerations=new IoPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }

    @Override
    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;

    }
}

4.3管理员

  与用户的相似。都是通过接口数组来调用不同的方法。并且描述了菜单。

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 Deteperation(),
                new ShowOperation(),
        };
    }

    @Override
    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;

    }
}

4.4main函数中如何调用不同的成员

  在初步想法中,我们定义了一个抽象类作为父类。并让这两个子类来继承它。那么我们自然就联想到面向对象中多态的使用,我们通过向上转型的多态来调用不同的成员。

 public static User login(){
        System.out.println("请输入你的姓名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        System.out.println("请输入你的用户类型 1=>管理员 0=>用户");
        int choice=scanner.nextInt();
        if(choice==1){
            return new AdminUser(name);
        }else return new Normal(name);
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();
            User user = login();
            

5.方法的调用

  在初步定义了User用户和管理员还有Book,书架与书籍以后。我们此时需要一些方法来帮助我们操作这些书籍。我们在前面分析到,如果我们想使用不同的方法,那么就需要一个接口数组来存放继承这个接口数组的方法。通过数组的下标来调用。

  5.1接口

package operation;

import Book.BookList;

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

5.2增加图书

  增加图书很简单,我们通过Scanner类把我们需要的增加的书本信息加入到book数组的下一个位置,并且将Usesize+1。当然,为了严谨,我们需要判断一下书架里有没有这本书。

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("新增图书");
        int count= bookList.getUsesize();
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入书名");
        String name=scanner.nextLine();
        System.out.println("请输入作者");
        String author=scanner.nextLine();
        System.out.println("请输入该书的类型");
        String tpye=scanner.nextLine();
        System.out.println("请输入价格");
        double price=scanner.nextDouble();
        Book book=new Book(name,author,price,tpye);
        int a= bookList.getUsesize();
        for (int i = 0; i < a; i++) {
            if(bookList.getBooks(i).getName().equals(name)){
                System.out.println("已经有这本书了");
                return;
            }
        }

        bookList.setBooks(book);
        bookList.setUsesize(a+1);
    }
}

5.3借阅图书

  借阅图书的时候,我们首先要在书架里遍历去判断书架里有没有这本书,然后需要把书的状态改成true即可。

package operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class BorrowOperation implements IoPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        for (int i = 0; i < bookList.getUsesize(); i++) {
            Book book=bookList.getBooks(i);
            if(book.getName().equals(name)&& book.isBorrowed()==false){
                System.out.println("借阅成功");
                book.setBorrowed(true);
                return;
            }
        }
        System.out.println("没有找到这本书");
    }
}

  5.4删除图书

   通过两次遍历,第一次遍历找到这本书,第二次遍历,把这本书后面的书放到它的位置上,从后往前覆盖,并且将最后一个置为null。

package operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class Deteperation 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 count= bookList.getUsesize();
        int index=-1;
        for (int i = 0; i < count; i++) {
            Book book=bookList.getBooks(i);
            if(book.getName().equals(name)){
                index=i;
                break;
                }
            }
        for (int j = index; j <count-1; j++) {
            Book book=bookList.getBooks(j+1);
            bookList.setbooks(index,book);
        }
        bookList.setUsesize(count-1);
        bookList.setbooks(count-1,null);
        System.out.println("删除成功");

        }
    }

5.5退出系统

 改操作只需要一行函数即可。

package operation;

import Book.BookList;

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

5.6查找图书

  和前面的方法类似,仅需遍历并且通过我们之前重写的toString方法来打印书的信息即可。

package operation;

import Book.BookList;

import java.util.Scanner;

public class FindOperation 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 count= bookList.getUsesize();
        for (int i = 0; i < count; i++) {
            if(bookList.getBooks(i).getName().equals(name)){
                System.out.println("找到了");
                System.out.println(bookList.getBooks(i));
                return;
            }
        }
        System.out.println("没有找到这本书");

    }
}

5.7归还图书

  和借阅图书很相似。改变一下isBorrowed的布尔值即可。

package operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IoPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        for (int i = 0; i < bookList.getUsesize(); i++) {
            Book book=bookList.getBooks(i);
            if(book.getName().equals(name)&& book.isBorrowed()==true){
                System.out.println("归还成功");
                book.setBorrowed(false);
                return;
            }
        }
        System.out.println("没有找到这本书");

    }
}

5.8显示图书

   遍历并打印书架上的书。

package operation;

import Book.BookList;
import Book.Book;
import java.util.Arrays;

public class ShowOperation implements IoPeration{
    @Override
    public void work (BookList bookList) {
        System.out.println("显示所有书");

        for (int i = 0; i < bookList.getUsesize(); i++) {
            Book book=bookList.getBooks(i);
            System.out.println(book);
        }

    }
}

5.9main方法

    我们在调用成员的时候会输入我们所需的操作的数字,并且将这个数字返回给我们的接口数组。通过它来调用不同的方法。因为我们要有很多操作,所以需要while(true)来多步操作

import Book.BookList;
import user.AdminUser;
import user.Normal;
import user.User;

import java.util.Scanner;

public class Main {

    public static User login(){
        System.out.println("请输入你的姓名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        System.out.println("请输入你的用户类型 1=>管理员 0=>用户");
        int choice=scanner.nextInt();
        if(choice==1){
            return new AdminUser(name);
        }else return new Normal(name);
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();
            User user = login();
        while (true) {
            int choice = user.menu();
            user.doWord(choice, bookList);
        }
    }
}

6.小结

  在做一个图书管理系统的时候,我们首先需要进行一个大的框架的设计。并且具体到每一个对象。使用面向对象的思想,逐步去完成每个类和类中的方法。然后使用我们之前所学到的知识把这些串联起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/879005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用python实现激光雷达LAS数据滤波的7种方式,使用laspy读写

激光雷达&#xff08;LiDAR&#xff09;数据在实际应用中可能受到噪声和不完美的测量影响&#xff0c;因此数据去噪和滤波方法变得至关重要&#xff0c;以提高数据质量和准确性。以下是一些常用的激光雷达数据去噪与滤波方法。 原始数据如下&#xff1a; 1. 移动平均滤波&…

springcloud3 hystrix实现服务降级,熔断,限流以及案例配置

一 hystrix的作用 1.1 降级&#xff0c;熔断&#xff0c;限流 1.服务降级&#xff1a; A方案出现问题&#xff0c;切换到兜底方案B&#xff1b; 2.服务熔断&#xff1a;触发规则&#xff0c;出现断电限闸&#xff0c;服务降级 3.服务限流&#xff1a;限制请求数量。 二 案例…

uni-app中使用pinia

目录 Pinia 是什么&#xff1f; uni-app 使用Pinia main.js 中引用pinia 创建和注册模块 定义pinia方式 选项options方式 定义pinia 页面中使用 pinia选项options方式 函数方式 定义pinia 页面中使用 函数方式 定义的pinia Pinia 是什么&#xff1f; Pinia&#xff0…

ES中倒排索引机制

在ES的倒排索引机制中有四个重要的名词&#xff1a;Term、Term Dictionary、Term Index、Posting List。 Term&#xff08;词条&#xff09;&#xff1a;词条是索引里面最小的存储和查询单元。一段文本经过分析器分析以后就会输出一串词条。一般来说英文语境中词条是一个单词&a…

利用安全区域的概念解决移动端兼容不同手机刘海的问题

移动端 安全区 在做移动端的项目时&#xff0c;由于不同的手机设备设置的不同&#xff0c;有些手机在上方有刘海的设计&#xff0c;我们需要做适配&#xff0c;即把想要展示的内容放在安全区域内展示。 1.自定义导航栏 在pages.json中修改如下配置 {"path":"…

QEMU源码全解析37 —— Machine(7)

接前一篇文章&#xff1a;QEMU源码全解析36 —— Machine&#xff08;6&#xff09; 本文内容参考&#xff1a; 《趣谈Linux操作系统》 —— 刘超&#xff0c;极客时间 《QEMU/KVM》源码解析与应用 —— 李强&#xff0c;机械工业出版社 特此致谢&#xff01; 上回书讲完了q…

人流目标跟踪pyqt界面_v5_deepsort

直接上效果图 代码仓库和视频演示b站视频006期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 代码展示&#xff1a; YOLOv5 DeepSORT介绍 YOLOv5 DeepSORT是一个结合了YOLOv5和DeepSORT算法的目标检测与多目标跟踪系统。让我为您详细解释一…

IL汇编ldc指令学习

ldc指令是把值送到栈上&#xff0c; 说明如下&#xff0c; ldc.i4 将所提供的int32类型的值作为int32推送到计算堆栈上&#xff1b; ldc.i4.0 将数值0作为int32推送到计算堆栈上&#xff1b; ... ldc.i4.8 将数值8作为int32推送到计算堆栈上&#xff1b; ldc.i4.m1 将数值-…

无名管道 / 有名管道(FIFO)

根据上节所讲就可以了解到&#xff1a;管道其实就是实现进程间通讯IPC中的一种类型方法 基本概念&#xff08;无名管道&#xff09; 管道是一种最基本的IPC机制&#xff0c;通常指无名管道&#xff0c;也是UNIX系统IPC最古老的形式。管道只能作用于有血缘关系的进程之间&…

R语言实现随机生存森林(2)

library(survival) library(randomForestSRC) help(package"randomForestSRC") #构建普通的随机生存森林 data(cancer,package"survival") lung$status<-lung$status-1 rfsrc.fit1 <- rfsrc(Surv(time, status) ~ ., lung,ntree 100,block.size 1,…

时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-LSTM鲸鱼算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计学习总结参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-…

maven install

maven install maven 的 install 命令&#xff0c;当我们的一个 maven 模块想要依赖其他目录下的模块时&#xff0c;直接添加会找不到对应的模块&#xff0c;只需要找到需要引入的模块&#xff0c;执行 install 命令&#xff0c;就会将该模块放入本地仓库&#xff0c;就可以进…

Linux文件属性查看和修改学习

一、基本属性 1、看懂文件属性&#xff1a; Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c; Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的…

对约瑟夫问题的进一步思考

约瑟夫问题重述&#xff1a; 在计算机编程的算法中&#xff0c;类似问题又称为约瑟夫环 约瑟夫环&#xff1a;N个人围成一圈&#xff0c;从第一个开始报数&#xff0c;第M个将被杀掉&#xff0c;最后剩下一个&#xff0c;其余人都将被杀掉。 例如N6&#xff0c;M5&#xff0…

gRPC vs REST:创建API的方法比较

本文对gRPC和REST的特征和区别进行了介绍&#xff0c;这可能是当今创建API最常用的两种方法。 文章目录 一、gRPC的介绍 二、什么是REST&#xff1f; 三、什么是gRPC? 四、gRPC和REST的比较 &#xff08;1&#xff09;底层HTTP协议 &#xff08;2&#xff09;支持的数据…

实现C++多线程的完全指南

目录 引言&#xff1a;1. 理解多线程编程的基本概念2. 引入C标准库中的线程库3. 创建线程4. 线程同步和互斥5. 线程间的通信使用多线程需要关注的要点结论&#xff1a; 引言&#xff1a; 在现代软件开发中&#xff0c;多线程编程已经成为一项非常重要的技能。通过利用多线程&a…

前后端分离------后端创建笔记(07)表单验证

1、我输入数据&#xff0c;然后关闭&#xff0c;重新打开会发现残存的数据仍然保留着 2、点了这个x号&#xff0c;数据就全部被清理了 3、点这三个地方&#xff0c;数据全部都清理掉 4、这里先写一个方法 4.1 定义一个方法 4.2 这里表单的数据在哪里&#xff0c;就是这个 4.3 …

最新Kali Linux安装教程:从零开始打造网络安全之旅

Kali Linux&#xff0c;全称为Kali Linux Distribution&#xff0c;是一个操作系统(2013-03-13诞生)&#xff0c;是一款基于Debian的Linux发行版&#xff0c;基于包含了约600个安全工具&#xff0c;省去了繁琐的安装、编译、配置、更新步骤&#xff0c;为所有工具运行提供了一个…

无监督学习之主成分分析-半导体制造高维数据如何降维

数据降维不只存在于半导体数据中&#xff0c;它是存在于各行各业的&#xff0c;我们要分析的数据维数较多的时候全部输入维数较大这时就要采取降维的方法综合出主要的几列用于我们的分析。 PCA的哲学理念是要抓住问题的主要矛盾进行分析&#xff0c;是将多指标转化为少数几个…

13 docker使用问题

目录 docker模块分布&#xff1a; ①&#xff1a;安装"abseil"C库 ②&#xff1a;安装CMake​编辑 ③&#xff1a;grpc安装 ④&#xff1a;protobuf安装​编辑 ⑤&#xff1a;qt界面显示 ⑥&#xff1a;dockerfile编写​编辑 ⑦&#xff1a;执行docker脚本 …