【javaSE】 实现图书管理系统

news2024/9/25 9:40:56

目录

整体思路

Book包

Book类

BookList类

user包

User类

NormalUser类

AdminUser管理员类

testmain包

opera包

IOPeration接口

普通用户

ExitOperation类

FindOperation类

BrrowOperation类

ReturnOperation类

管理员

AddOperation类

 DelOperation类

ShowOperation类

总结


整体思路

首先我们先来看一下我们要达到的效果

我们得有登录的姓名,与身份的选择

选择不同的身份对应不同的功能

比如选择管理员

选择普通用户

  

得有我们的图书

 博主在这里实现图书管理系统分为四个包进行实现

不会创建包的小伙伴可以去下方链接了解一下

【javaSE】面向对象程序三大特性之封装_遇事问春风乄的博客-CSDN博客https://blog.csdn.net/m0_71731682/article/details/132001012?spm=1001.2014.3001.5501

book包里面实现书类和书架类

opera包里我们用接口实现我们所需要在图书管理系统里实现的功能

testmain包里是我们的主函数所在

user包里用继承来实现我们所需要的管理者与借阅者类

实现所有类如下

接下来我会就每个里面的类进行讲解

Book包

Book类

在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的toString方法

代码实现如下

package book;

public class Book {
    private String name;//书名
    private String author;//作者
    private int price;//价钱
    private String type;//类型
    private boolean isBorrowed;//是否被借阅
    //构造方法
    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 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?"  已借阅":"  未借阅")+
                '}';
    }
}

BookList类

这里我们需要实现的有可以存放很多Book的数组

可以与增加、删除等功能的对应方法

代码实现

package book;

public class BookList {
    //定义常量
    private static final int DEFAULT_SIZE = 20;
    //创建一个Book类型的数组,books里面存放的是多个book类型实例化的对象
    private Book[] books = new Book[DEFAULT_SIZE];
    //记录当前books数组当中 有多少本书?
    private int usedSize;
    public BookList() {
        books[0] = new Book("剑来","烽火戏诸侯",88,"修仙小说") ;
        books[1] = new Book("雪中悍刀行","烽火戏诸侯",66,"武侠小说");
        books[2] = new Book("流浪地球","刘慈欣",99,"科幻小说");
        books[3] = new Book("木苏里","某某",88,"爱情小说") ;
        books[4] = new Book("天官赐福","墨香铜臭",66,"爱情小说");
        books[5] = new Book("镇魂","priest",99,"爱情小说");
        //表示最初是三本
        this.usedSize = 6;
    }
    //读取这一本书
    public Book getBooK(int pos) {
        return this.books[pos];
    }
    //将该书写入该下标对应的位置,可以实现增加图书
    public void setBook(Book book) {
        this.books[usedSize] = book;
    }
    //后面会用于读取图书
    public int getUsedSize() {
        return usedSize;
    }
    //用于写入数组下标,与增加删除功能都有关系
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }


}

user包

User类

这里的User类是作为NormalUser类与AdminUser类的父类

有相应的属性name与构造方法

会提供一个数组,供子类进行使用

有一个抽象类实现菜单

有一个方法会对用户选择后的结果进行传达,然后调用相对应功能的方法

实现代码

package user;

import book.BookList;
import opera.IOPeration;

public abstract class User {
    protected String name;
    protected IOPeration[] ioPerations;

    public User(String name) {

        this.name = name;
    }
    //创建一个抽象类,实现菜单
    public abstract int menu();
    //通过对象的相应调用与所传参数实现操作者选择的功能
    public void doWork(int choice, BookList bookList) {
        this.ioPerations[choice].work(bookList);
    }
}

NormalUser类

普通用户类,继承于User类

这里涉及一个数组,里面用于存放一些对象,来实现普通用户的功能

一个可以让用户选择的菜单,以及返回用户所做的选择

package user;

import opera.*;

import java.util.Scanner;
/**
 * @Author 12629
 * @Description:
 */
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        //对ioPerations数组进行初始化,里面放的是使用者所需要功能类的对象
        ioPerations = new IOPeration[] {
                //0.退出系统
                new ExitOperation(),
                //1.查找图书
                new FindOperation(),
                //2.借阅图书
                new BrrowOperation(),
                //3.归还图书
                new ReturnOperation()
        };
    }

    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+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;
    }

}

AdminUser管理员类

管理员类,继承于User类

这里涉及一个数组,里面用于存放一些对象,来实现管理员的功能

一个可以让管理员选择的菜单,以及返回管理员所做的选择

package user;

import opera.*;

import java.util.Scanner;

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        //对ioPerations数组进行初始化,里面放的是管理员所需要功能类的对象
        ioPerations = new IOPeration[] {
                //0.退出系统
                new ExitOperation(),
                //1、查找图书
                new FindOperation(),
                //2.新增图书
                new AddOperation(),
                //3.删除图书
                new DelOperation(),
                //4.显示图书
                new ShowOperation()
        };
    }

    public int menu() {
        System.out.println("****************************");
        System.out.println("hello "+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;
    }

}

testmain包

这里需要实现的是

可以根据用户选择不同的身份以及选择身份后所要进行的功能,调用相应的对象实现

代码实现

package testmain;

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

import java.util.Scanner;

/**
 * @Author 12629
 * @Description:
 */
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 NormalUser(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        //返回来的值进行向上转型
        User user = login();
        while(true) {
            //此处是一个简单的多态实现
            int choice = user.menu();
            //根据 choice 和   user 来确定 我到底 调用哪个对象的哪个操作
            user.doWork(choice, bookList);
        }
    }
}

opera包

这个包利用接口来实现这些功能

IOPeration接口

会有一个work的抽象方法,参数类型为BookList的

代码实现

package opera;

import book.BookList;

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

普通用户

ExitOperation类

用于退出该系统

这里的实现很简单,使用System.exit(0);就好

import book.BookList;

public class ExitOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {

        System.out.println("退出系统!");
        System.exit(0);
    }
}

FindOperation类

用于查找图书

根据书名对Books数组里面的每一Book类的名字进行比对

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation  implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currenSize = bookList.getUsedSize();
        System.out.println("请输入要查找书的名字");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        for(int i = 0;i < currenSize;i++) {
            Book book = bookList.getBooK(i);
            if(book.getName().equals(input)){
                System.out.println(book);
                return;
            }
        }
        System.out.println("查找书不存在");
    }

}

BrrowOperation类

实现借阅功能

根据书名进行遍历是否有该图书

判断该图书的状态

借阅后改变该图书的状态,改为已借阅

代码实现如下

import java.util.Scanner;

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

        System.out.println("借阅书籍!");
        System.out.println("请输入你要借阅的图书的名字:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooK(i);
            if(name.equals(book.getName())) {
                if(book.isBorrowed()) {
                    System.out.println("该书已经被借出! ");
                }else {
                    book.setBorrowed(true);
                    System.out.println("借阅图书成功!");
                }
                return;
            }
        }
        System.out.println("没有你要借阅的图书!");
    }

}

ReturnOperation类

归还图书

根据书名进行遍历是否有该图书

判断该图书的状态

归还后改变该图书的状态,改为未借阅

代码实现如下

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOperation 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.getUsedSize();;
            for (int i = 0; i < currentSize; i++) {
                Book book = bookList.getBooK(i);
                if(name.equals(book.getName())) {
                    book.setBorrowed(true);
                    System.out.println("归还图书成功!");
                    return;
                }
            }
            System.out.println("没有你要归还的图书!");
        }
}

管理员

ExitOperation类与FindOperation类为两种身份共有的,这里就不再赘述

AddOperation类

添加书籍

根据书名遍历该书是否已经存在

添加该书的所有属性

对Books数组进行更新,添加;这里就用到了我们前面在BookList里书写的方法,如下图

代码实现如下

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOPeration{
    public void work(BookList bookList) {
        int currenSize = bookList.getUsedSize();
        System.out.println("新增图书!");
        System.out.println("请输入你要新增的图书的名字:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for(int i = 0;i < currenSize;i++) {
            Book book = bookList.getBooK(i);
            if(book.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);

        //1. 获取到当前可以存放书的位置
        int currentSize = bookList.getUsedSize();
        //2. 把书放入指定位置
        bookList.setBook(book);
        //3. 书的有效个数+1
        bookList.setUsedSize(currentSize+1);
        System.out.println("添加成功");
    }

}

 DelOperation类

删除书籍

根据书名遍历该书是否已经存在

寻找该书的数组下标,实现后面数组对前面的覆盖

现有图书数目减一,并将原来图书书目最后一位置为Null

代码实现

package opera;

import book.Book;
import book.BookList;

import java.util.Scanner;

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

        System.out.println("删除图书!");
        System.out.println("请输入你要删除的图书:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        //1. 遍历数组当中 是否有你要删除的书  有记录下标
        int index = -1;
        int currentSize = bookList.getUsedSize();;
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooK(i);
            if(name.equals(book.getName())) {
                index = i;
                break;
            }
        }
        //
        if(index == -1) {
            System.out.println("没有你要删除的书!");
            return;
        }

        for (int i = index; i < currentSize-1 ; i++) {
            //bookList[i] = bookList[i+1];
            Book book = bookList.getBooK(i+1);
            bookList.setBook(book);
        }
        //下标减一
        bookList.setUsedSize(currentSize-1);
        //每次删除 都要置空
        bookList.setBook(null);
        System.out.println("删除成功!");

    }
}

ShowOperation类

显示图书

遍历Books数组

使用重写的toString方法就好

代码实现

package opera;

import book.BookList;

import java.sql.SQLOutput;

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currenSize = bookList.getUsedSize();
        for(int i = 0;i < currenSize;i++) {
            //我们重写了toString,所以这里会优先调用我们重写的toString方法
            System.out.println(bookList.getBooK(i));
        }
        System.out.println("显示完毕");
    }

}

总结

关于《 图书管理系统》就讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。想要完整包的小伙伴可以去到该博文的资源绑定进行下载,也可以私信博主

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

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

相关文章

小白科普-通信网中核心网、城域网、接入网

通信网络的一个整体结构&#xff0c;大致包括&#xff1a;骨干网、核心网、城域网、接入网&#xff0c;其中接入网又分为无线接入和有线接入&#xff0c;以及承载网。 听起来很复杂&#xff0c;我们再分解来看看。 从最靠近用户端开始的是接入网。接入网&#xff0c;简单点来…

迁移学习(新人必看)

先说一下深度学习常见的问题&#xff1a; 1.数据集不够&#xff0c;通常用数据增强解决。 2.参数难以确定&#xff0c;训练时间长&#xff0c;这就需要用迁移学习来解决 什么叫迁移学习呢&#xff1a;比方说有一个对100w的自行车数据集&#xff0c;并用VGG模型训练好的网络&…

【前端】网页

1 网页的相关概念 1.1什么是网页 网站 &#xff1a;是网页的集合 网页 &#xff1a;通常是HTML格式的文件&#xff0c;通过浏览器来阅读 网页是构成网站的基本要素&#xff0c;它通常由图片、链接、文字、声音、视频等元素组成。通常我们看到的网页&#xff0c;常见以.htm或…

【人工智能】PyTorch安装

文章目录 前言一、环境版本二、开始安装CPU版本安装&#xff08;GPU版本在下面-可以直接跳过&#xff09;GPU版本安装CUDA 下载安装cudnn 下载安装 总结 前言 PyTorch是一种开源深度学习框架&#xff0c;它由Facebook AI Research&#xff08;FAIR&#xff09;团队开发并维护。…

计划管理与项目管理:有何区别?

简而言之&#xff0c;是的。尽管它们经常互换使用并对全局产生影响&#xff0c;但它们是完全不同的。 在本文中&#xff0c;我们将了解计划和项目管理之间的差异&#xff0c;提供每个示例&#xff0c;并向您展示如何使计划和项目管理工作更有效地实现您的业务目标。 计划管理与…

2023华数杯数学建模C题思路分析 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…

Spring事务传播机制、实现方式、失效场景即原理

贴一篇源码分析的好文章&#xff1a;https://blog.csdn.net/qq_30905661/article/details/114400417 本质&#xff1a; 一个事务对应一个数据库连接。 通过 this 来调用某个带有 Transactional 注解的方法时&#xff0c;这个注解是失效的&#xff0c;可以看做这个方法&#x…

Windows下安装Zookeeper(图文记录详细步骤,手把手包安装成功)

Windows下安装Zookeeper 一、下载Zookeeper安装包1.1、官网下载Zookeeper1.2、网盘下载Zookeeper 二、解压Zookeeper安装包到指定目录三、Zookeeper安装目录下创建文件夹四、进入config目录五、复制zoo_sample.cfg文件&#xff0c;改名为zoo.cfg六、修改配置文件 zoo.cfg七、添…

Nodejs的fs模块的基础应用

fs模块是Node.js中内置的用于文件系统操作的模块&#xff0c;它提供了各种方法和函数&#xff0c;用于处理文件和目录。 目录 1.写入文件 2.讲讲同步和异步 3.追加写入 4.读取文件 5.文件重命名及文件移动 6.文件删除 7.文件夹的操作 1.写入文件 普通的写入方法&#x…

智能制造企业如何建立大客户管理模型?

01、大客户管理依然是智能制造企业经营的黄金定律 《连线》杂志创始人凯文凯利&#xff08;Kevin Kelly&#xff09;在《技术元素》一书中写道&#xff1a;“数量不是目的&#xff0c;质量才是根本&#xff0c;重视1%的超级用户才是提高效率的关键。” 根据“二八定律”&…

Arduino驱动MQ4模拟甲烷气体传感器(气体传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 MQ4气体传感器,可以很灵敏的检测到空气中的甲烷、天然气等气体,但是对乙醇和烟雾的灵敏度很低。与Arduino结合使用,可以制作火灾甲烷、天然气泄露报警等相关的作品。 1、传感器特性 MQ4对不同种类、不同浓度的气体有不同的…

SystemVerilog数组参数传递及引用方法总结

一、将常数数组传递给task/function 如下面的程序&#xff0c;将一个常数数组传递给function module my_array_test();function array_test(int array[4]);foreach(array[i]) begin$display("array[%0d] %0d", i, array[i]);endendfunctioninitial beginarray_tes…

@Transactional详解(作用、失效场景与解决方法)

一、了解Transactional注解&#xff0c;先要知道事务是什么&#xff0c;但既然知道了这个注解&#xff0c;不知道事务是什么&#xff0c;那就重新再去学习一遍数据库吧&#xff0c;这里讲解开发中代码实现事务的方式 1、编程式事务&#xff08;开发用的很少了&#xff09; 基于…

【火炬之光-召唤装备】

头部胸甲手套鞋子武器盾牌项链戒指腰带神格备注*邪龙头冠无限要塞/血抗血抗血抗***终焉复临任意攻速单手武器/黑峡烬盾1召唤等级血抗*原点的寒冬1召唤等级1.刷钢铁炼境监视者-无垢之墙升级。2.不能用典狱官的胸针参考视频机械领主无限要塞––***终焉复临––求生之欲––参考视…

Zoho CRM有哪些功能?使用体验如何?

市场上有很多CRM品牌&#xff0c;但是Zoho CRM是比较亮眼的存在&#xff0c;不仅屡获CRM国际大奖&#xff0c;更是连续十一年入选Gartner魔力象限。不论是功能、价格还是使用体验&#xff0c;都备受用户青睐。下面我们就来说说&#xff0c;Zoho CRM的使用体验评价。 Zoho CRM有…

Codeforces Round 888 (Div. 3)F题题解

文章目录 [Lisa and the Martians](https://codeforces.com/contest/1851/problem/F)问题建模问题分析1.分析给定的运算操作2.方法1使用Trie树来查找最符合的数代码 方法2通过性质&#xff0c;排序后找运算的最大值代码 证明 Lisa and the Martians 问题建模 ​ 给定n个数和k&…

如何搭建一个口才培训的网站?需要具备哪些条件?

论文题目&#xff1a;如何搭建一个口才培训的网站及所需条件 摘要&#xff1a; 本文探讨了如何搭建一个口才培训的网站&#xff0c;并详细分析了所需的关键条件。口才培训作为一种重要的社交技能&#xff0c;能够帮助人们提升自信和影响力&#xff0c;因此具有广阔的市场前景。…

【yolov5训练报错Wandb wandb.errors.UsageError: api_key not configured (no-tty).】

跑yolov5训练官方代码出现下面的问题&#xff0c;第一个方法就是关闭代理网络vpn&#xff0c;直接运行&#xff0c;阻止数据上传。 D:\anaconda\envs\yolov5\python.exe C:\Users\ljx\Desktop\yoloair-main\yoloair-main\yolov7\train.py YOLOR 2022-11-8 torch 1.8.1cu111…

Nginx 高性能内存池 ----【学习笔记】

跟着这篇文章学习&#xff1a; c代码实现一个高性能内存池&#xff08;超详细版本&#xff09;_c 内存池库_linux大本营的博客-CSDN博客https://blog.csdn.net/qq_40989769/article/details/130874660以及这个视频学习&#xff1a; nginx的内存池_哔哩哔哩_bilibilihttps://w…

TikTok马来西亚站变动,指定物流服务商!

8月2日&#xff0c;据TechinAsia报道&#xff0c;TikTok已将百世快递在马来西亚的子公司BestExpressMalaysia&#xff0c;指定为其在马来西亚的物流服务商。目前&#xff0c;百世快递已在越南、泰国与TikTok展开类似合作。 合作后&#xff0c;百世马来子公司将为TikTokShop卖家…