实战项目——用Java实现图书管理系统

前言

首先既然是管理系统,那咱们就要实现以下这几个功能了-->

分析

1.首先是用户分为两种,一个是管理员,另一个是普通用户,既如此,可以定义一个用户类(user),在定义管理员类,普通用户类去继承。

2.还有就是书这个对象,首先是书的属性(书名,作者,价格,种类,是否借出),这可以定义成一个Book类,其实就是存储这些新的容器-- 书架类(Booklist)

3.最后这些功能,仔细观察,由于身份不同,操作也不同,一般来讲,我们可以把对应的方法放到对应的类当中去,但这次用接口也可以巧妙实现

分模块进行编码

book包

 为了方便查看,就把这两个类放进一个book的包里。

Book类

package book;

public class Book {
    private String name;//姓名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isLead;//是否被借出

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

    public void setLead(boolean lead) {
        isLead = lead;
    }
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

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

在这个类中,把书的属性成员定义为私有,通过公共成员函数去访问和调用,最后重写toString 方法来表示输出。

Booklist类

package book;

public class Booklist {
    private Book[] books =new Book[10];
    private int usedSize;//记录存放次数

    public Booklist() {
        books[0]=new Book("红楼梦","曹雪芹",25,"小说");
        books[1]=new Book("月华","小明",27,"小说");
        books[2]=new Book("多少","小花",20,"小说");
        this.usedSize=3;
    }

    public boolean isFull(){//判断书架是否满
        if(this.usedSize==books.length){
            return true;
        }else{
            return false;
        }
    }
    public int getUsedSize() {//获取存了多少本书
        return usedSize;
    }
    //设定书的数量
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public Book getBooks(int pos) {//获取书架中pos位置书的信息
        return books[pos];
    }
    //把新增的图书信息放到pos位置上去
    public void setBooks(int pos,Book book) {
        books[pos]=book;
    }

}

 在这个书架类中,定义一个容量为10的对象数组来存储书的信息,事先存入三本书,同时usedSize 用来记录书的数量,而后面的方法则与实现对应的功能相关。且往后细看~接口类

package operater;

import book.Booklist;

public interface IOperation {
    void work(Booklist booklist);
}

在这个接口里定义了一个方法 ​work​,该方法需要一个 ​Booklist​ 对象作为参数。任何实现 ​IOperation​ 接口的类都必须提供 ​work​ 方法的具体实现。这样一来就方便不同的用户进行操作了。

User包

user类

package User;

import book.Booklist;
import operater.IOperation;

// 定义一个抽象类 user,表示用户
public abstract class user {
    protected String name;

    // 构造方法,初始化用户名称
    public user(String name) {
        this.name = name;
    }

    //抽象方法,显示菜单并返回用户选择的操作编号
    public abstract int menu();

    //存储用户可以执行的操作数组
    protected IOperation[] iOperations;

    //根据用户选择执行相应的操作
    public void DoIoperation(int choice, Booklist booklist) {
        //调用用户选择的操作的 work 方法
        this.iOperations[choice].work(booklist);
    }
}

因为身份不同,所以显示的菜单也不同,所以便声明一个抽象方法 menu(),同时定义一个操作数组,来进行对应的操作,如图

普通用户类(Normaluser)

package User;

import operater.*;

import java.util.Scanner;

public class Normaluser extends user{
    //重写构造方法
    public Normaluser(String name) {
        super(name);
       //根据不同的输入进行对应的操作,已经方法按顺序放入数组,所以位置别搞错了
        this.iOperations=new IOperation[]{
          new Exit(),
          new Find(),
          new Borrow(),
          new Return()
        };
    }

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

    }
}

管理员类(Adminuser)

package User;

import operater.*;

import java.util.Scanner;

public class Adminuser extends user{
    public Adminuser(String name) {
        super(name);
        this.iOperations=new IOperation[]{
                new Exit(),
                new Find(),
                new Add(),
                new Del(),
                new Show()
        };
    }
    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;
    }
    }


operater包

Add类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Add implements IOperation{
    public void work(Booklist booklist1){

        if(booklist1.isFull()){
            System.out.println("书架已满,不能新增!");
        }
        System.out.println("新增图书");
        System.out.println("请输入你要新增的图书的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        System.out.println("请输入你要新增的图书的作者:");
        String bookAuthor= scanner.nextLine();

        System.out.println("请输入你要新增的图书的价格:");
        int bookPrice = scanner.nextInt();
        scanner.nextLine();

        System.out.println("请输入你要新增的图书的类型:");
        String bookType = scanner.nextLine();

        Book book=new Book(bookName,bookAuthor,bookPrice,bookType);

        int currentSize=booklist1.getUsedSize();//新增图书的位置其实就是i本书的位置
        booklist1.setBooks(currentSize,book);
        booklist1.setUsedSize(currentSize+1);//书的数量+1
        System.out.println("成功添加图书");
    }
}

在新增图书的过程中,要分别添加书的属性才行,这时切不可直接用booklist,这时类对象,不是数组,创建一个对象数组book,之前Booklist中方法便派上用场, 看图就更好理解了~

Borrow类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Borrow implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("借阅图书");
        System.out.println("请输入你要借阅的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        //找到要借阅的书的下标
        for (int i=0; i < booklist1.getUsedSize() ; i++) {
            Book book1=booklist1.getBooks(i);
            if(book1.getName().equals(bookName)) {
                book1.setLead(true);
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("借阅失败!");
    }
    }

借阅图书其实和删除差不多,只要改变状态为已借出。

Del类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Del implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("删除图书");
        System.out.println("请输入你要删除的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();
        int current=booklist1.getUsedSize();

        int pos=-1;
        int i = 0;
        //找到要删除的书的下标
        for (; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
            if(bookName.equals(book1.getName())) {
                //System.out.println("找到了");
                pos=i;
            }
        }
        if(pos>=current){
            System.out.println("没有你要找的书!");
    }
        //开始删除
        for (int j = pos; j <current-1; j++) {
           // booklist1[j]=booklist1[j+1];不能直接用类对象

            Book book= booklist1.getBooks(j+1);
            booklist1.setBooks(j,book);
        }
        booklist1.setUsedSize(current-1);
        booklist1.setBooks(current-1,null);
        System.out.println("删除成功!");

    }
}

删除图书,首先要找到要删除图书的下标pos, 找到后要把后面的图书全都往前移动一格,从pos位置开始遍历,将j+1位置的图书存放到book对象中去,在调用setBook方法传给j位置。后面的位置设置成null,同时更新书的数量~

Exit类

package operater;

import book.Booklist;

public class Exit implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("退出系统");

        //避免退出系统后内存被回收
        int current=booklist1.getUsedSize();
        for (int i = 0; i < current ; i++) {
            booklist1.setBooks(i,null);
        }

        System.exit(0);

    }
}

 直接调用系统的退出即可~

Find类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Find implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("查找图书");
        System.out.println("请输入你要查找的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();
        
        int current=booklist1.getUsedSize();
        for (int i = 0; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
            if(bookName.equals(book1.getName())) {
                System.out.println("找到了");
                System.out.println(book1);
                return;
            }
        }
            System.out.println("没找到这本书!");
        }
}

Return类

package operater;

import book.Book;
import book.Booklist;
import java.util.Scanner;

public class Return implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("归还图书....");
        System.out.println("请输入你要归还的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        //找到要归还的书的下标
        for (int i=0; i < booklist1.getUsedSize() ; i++) {
            Book book1=booklist1.getBooks(i);
            if(book1.getName().equals(bookName)) {
                book1.setLead(false);
                System.out.println("归还成功!");
                return;
            }
        }
        System.out.println("归还失败!");
    }
    }

Show类

package operater;

import book.Book;
import book.Booklist;

public class Show implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("展示图书");
        int current=booklist1.getUsedSize();

        for (int i = 0; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
                System.out.println(book1);
        }
    }
}

这三个其实是大同小异的,都是循环遍历再进行对应的操作,这里主要记住的是String类型的数据比较不能直接用==,而是要用equals()方法。

看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

APKDeepLens:一款针对Android应用程序的安全扫描工具

关于APKDeepLens APKDeepLens是一款针对Android应用程序的安全扫描工具&#xff0c;该工具基于Python开发&#xff0c;旨在扫描和识别Android应用程序&#xff08;APK文件&#xff09;中的安全漏洞。 APKDeepLens主要针对的是OWASP Top 10移动端安全漏洞&#xff0c;并为开发人…

从零开始使用 Docsify 搭建文档站点

引言 在当今的技术环境中&#xff0c;拥有一份易于访问和美观的文档是至关重要的。Docsify 是一个非常适合快速搭建文档站点的工具&#xff0c;它简单易用&#xff0c;且不需要生成静态文件。本文将带你一步步从零开始使用 Docsify 搭建一个文档站点。 1. 安装 Node.js 和 np…

竞赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

基于小波分析的纹理和颜色反射对称性检测(MATLAB R2018A)

对称物体在自然图像和合成图像中普遍存在。作为对称物体最重要的全局特征之一&#xff0c;对称性检测长期以来都是计算机视觉领域的研究热点&#xff0c;并在图片的语义提取、图像语义理解以及情感识别等任务上具有广泛的应用。对称物体的检测技术&#xff0c;就是将图片中所蕴…

使用myCobot和OAK-D OpenCV DepthAI摄像头制作一个可以在眼前始终享受视频的手机支架!

引言 由于YouTube和Netflix的出现&#xff0c;我们开始躺着看手机。然而&#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架&#xff0c;让你无需用手拿着手机。请务必试试&#xff01; 准备工作 这次我们…

荣耀大横评,睿蓝7-450荣耀版卷出来的性价比之王

手握11万左右预算,如何在市场内选出一辆合适自己的车?荣耀版车型无疑是当下的最佳答案。在众多荣耀版车型中,比亚迪宋PLUS荣耀版EV520km领先型(后统称宋PLUS荣耀版)、比亚迪元PLUS荣耀版430km领先型(后统称元PLUS荣耀版)、比亚迪海豚PLUS荣耀版420km时尚版(后统称海豚荣耀版)、…

78.Vue 3 重用性模态框组件

模态框是大多数 Web 应用程序中的基本构建块。虽然最初实现起来可能看起来有点棘手&#xff0c;但实际上&#xff0c;使用 Vue 和一些 Flexbox 技巧&#xff0c;这不仅可行&#xff0c;而且非常简单。 让我们一起实现一个基础的模态框组件。 架构如下&#xff1a; AppModal.vue…

【Spring Boot】Spring AOP中的环绕通知

目录 一、什么是AOP?二、AOP 的环绕通知2.1 切点以及切点表达式2.2 连接点2.3 通知&#xff08;Advice&#xff09;2.4 切面(Aspect)2.5 不同通知类型的区别2.5.1 正常情况下2.5.2异常情况下 2.6 统一管理切点PointCut 一、什么是AOP? Aspect Oriented Programming&#xff…

【C语言内存函数】

目录 1.memcpy 使用 模拟实现 2.memmove 使用 模拟实现 3.memset 使用 4.memcmp 使用 1.memcpy 使用 void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字节数 destination&#xff1a;指向要复制内…

文件操作详解(C语言)

1.为什么要用到文件&#xff1f;怎样数据才能持久化&#xff1f; 保存在内存中的数不安全&#xff08;一次断电&#xff0c;忘记保存&#xff0c;不用了还给系统&#xff09; 持久化&#xff1a;保存在硬盘上&#xff08;放在文件中&#xff09; 什么是文件&#xff1f;文件…

pgrouting使用

pgRouting是一个为PostgreSQL和PostGIS提供路由功能的开源库&#xff0c;它支持复杂的图论算法&#xff0c;用于在地理网络中进行最短路径搜索。以下是pgRouting的一些应用实例。 注意事项&#xff1a; 1、路网表中的id、source、target必须是int类型&#xff0c;否则创建拓扑…

傅雷家书思维导图的制作方法,分享制作技巧和软件!

在浩如烟海的书海中&#xff0c;《傅雷家书》以其独特的视角和深厚的情感&#xff0c;成为了无数读者心中的经典。那么&#xff0c;如何将这部饱含父爱的书信集转化为清晰易懂的思维导图呢&#xff1f;本文将为您详细解读傅雷家书思维导图的制作技巧&#xff0c;并推荐几款实用…

java面试-SpringAOP

1.SpringAOP的使用 你了解Spring AOP 吗&#xff1f; 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 2.SpringAOP的原理 我们可以将ASM生成的类进行缓存&#xff0c;这样能解决生成的类比较低效的问题。 ASM是可以操作字节码的框架。 真实实现类和…

Windows 组策略编辑器怎么打开,这两种方法你必须知道

组策略编辑器&#xff08;Group Policy Editor, 简称 GPEdit.msc&#xff09;是 Windows 操作系统中一个强大的工具&#xff0c;主要用于管理和配置系统设置、安全选项、用户权限等&#xff0c;尤其适用于企业环境中批量部署和管理策略。 尽管家庭版 Windows&#xff08;如 Win…

数字集群手持终端是什么_鼎跃安全

在当今快速发展的科技时代&#xff0c;通信技术的进步为各行各业带来了巨大的变革。尤其是在公共安全、应急救援和交通运输等领域&#xff0c;通信的及时性和可靠性变得尤为重要。数字集群手持终端作为一种专用于数字集群通信系统的便携式设备&#xff0c;数字集群手持终端是一…

ubuntu安装miniconda、jupyer、ros2

miniconda: 类似于虚拟机 ,可以安装不同版本的python jupyer: python执行、调试命令工具 1.下载安装文件 wget https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-x86_64.sh 2.安装minconda bash https://repo.anaconda.com/miniconda/Miniconda3-py…

Linux 防火墙开放端口

启动防火墙服务&#xff1a;systemctl start firewalld 查看防火墙开放端口 &#xff1a;firewall-cmd --list-ports 开放3306端口&#xff1a;firewall-cmd --zonepublic --add-port2375/tcp --permanent 防火墙重启&#xff1a;firewall-cmd --reload

第十二届信息系统与计算技术国际会议(ISCTech 2024)

随着信息技术的迅猛发展&#xff0c;信息系统与计算技术已成为推动社会进步和经济发展的重要力量。为了加强国内外专家学者在信息系统与计算技术领域的交流与合作&#xff0c;第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;将于2024年11月8日至11日在…

BK145FRC10HSK、BK165FRC10HSK电液比例开环控制变量泵放大器

BK15FRC10HAK、BK35FRC10HAK、BK45FRC10HAK、BK55FRC10HAK、BK70FRC10HSK、BK80FRC10HSK、BK90FRC10HSK、BK100FRC10HSK、BK120FRC10HSK、BK145FRC10HSK、BK165FRC10HSK、BK180FRC10HSK电液比例开环控制柱塞泵主要是在传统的液压泵基础上&#xff0c;增加了电液比例控制先导阀。…

git基本使用(一):git的基本概念

Git 是一种分布式版本控制系统&#xff0c;最初由 Linus Torvalds 于 2005 年为 Linux 内核开发。它主要用于跟踪文件的更改&#xff0c;特别是在软件开发过程中&#xff0c;可以帮助团队成员协同工作。它在实际项目开发中&#xff0c;应用非常广泛&#xff0c;我们这一节来掌握…
最新文章