基于Java实现的图书管理系统

前言:该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能,分为两个用户群体:管理者和普通用户。使用了类与对象,封装继承多态,抽象类和接口等Java基础知识。

一.思路

面向对象三部曲:找对象,创建对象,使用对象。

1.找对象

图书馆管理系统中的对象有书和人。人通过一些方法操作书。操作方法是一个集合。

2.创建对象

这里可用使用包将它们整合在一起,人、书和功能各一个包。

书是一个类,还一个类是书架。书中是定义书的各种属性,书架是放书的地方,也是操作书的地方。

人分为两种,一种是管理员,一种是普通用户。创建一个父类将两人共有的属性放在这里,另外创建两个子类扩展父类。

功能这个包里放着各种各样我们实现的包,

3.脉络

 public static void main(String[] args) {
        BookList bookList=new BookList();//实例化书架,形象的理解为创建了一个图书馆

        Person person=logic();      //判断这个人是哪一个类,是管理员还是普通用户

        while(true){
            int choice=person.menu();

            person.doFunction(choice,bookList);
        }
    }

这是main方法的全部。

我们可以看到,我们先实例化了书架,相当于建立起了一个书架,我们可以在这个书架上对书进行操作。

第二步,通过一个logic方法判断出用户是哪一类。

书架有了,身份有了,接下来就是书架进行操作,也就是下面while循环里的内容。

二.框架的具体实现

1.logic方法的实现

先上代码:

 public static Person logic(){
        System.out.println("欢迎来的图书管理系统");
        System.out.println("请输入您的姓名:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        System.out.println("输入1:管理员  2:普通用户");
        int choice=scanner.nextInt();
        if(choice==1){
            return new Manager(name);
        }else{
            return new Normal(name);
        }
    }

返回值是我们定义的父类Person。通过输入的选择,用if分出两种情况(这里不是很严谨,没有判别输入其他数字的情况),直接new一个对象返回,new完类也实例化完了。

这样我们就得到了我们要用户身份。

2.person.menu方法的实现

person现在是某一个具体的身份,可以调用其类里的menu方法。

//普通用户
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;
    }
//管理员
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("请输入你的操作:");
        Scanner scanner=new Scanner(System.in);
        int choice= scanner.nextInt();
        return choice;
    }

通过输入数字来选择我们要进行的操作,并将刚输入的数字作为返回值去返回。

获得具体数字后我们可以进行下面的操作来进行具体的实现。

3.person.doFunction方法的实现

public IFunction[] iFunctions;
public void doFunction(int choice, BookList bookList){
        iFunctions[choice].work(bookList);
    }

这是Person类中的内容,可以看到我们先定义了一个接口数组,使用了这个接口中的某一个方法。在一开始实例化两种用户时我们就用构造方法来实现了数组的“赋值”:

//普通用户
public Normal(String name) {
        super(name);       
        this.iFunctions = new IFunction[]{
                new Exit(),
                new Seek(),
                new Borrow(),
                new Back()
        };
    }
//管理员
public Manager(String name) {
        super(name);       
        this.iFunctions=new IFunction[]{
                new Exit(),
                new Seek(),
                new Add(),
                new Del(),
                new Show()
        };
    }

这里的顺序对应了menu方法里的顺序,大家可以去上面查看。

4.接口的实现

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

在接口里写了一个work方法,这个就是上面调用的方法。参数是书架,目的是为了操作书架。

三.功能的具体实现

0.前置内容

每一个具体的功能都通过接口连上了IFunction,都要再次实现work方法

iFunctions[choice].work(bookList);

另外在书架上定义一个int变量来记录书的数量

int size = 0;

1.查阅图书

public void work(BookList bookList) {
        System.out.println("查找图书");
        System.out.println("请输入想要查找书的名称:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();

        int size=bookList.getSize();    //利用BookList类的方法来获得书架上书的数量
        for(int i=0;i<size;i++){
            String bname=bookList.getname(i);
            if(bname.equals(name)){                 //比较字符串
                System.out.println("书找到了");
                return ;
            }
        }
        System.out.println("没有这本书");
    }

bookList.getSize()这个方法是获取现在书架上书的数量,然后进入循环去寻找是否有这本书,比较简单。

2.借阅图书

public void work(BookList bookList) {
        System.out.println("借阅图书");
        System.out.println("输入要借阅书的名称:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();

        int choice=bookList.getSize();

        for(int i=0;i<choice;i++){
            String bname= bookList.getname(i);
            if(bname.equals(name)){
                bookList.changeType(i,true);         //用人方法要说哪一个
                bookList.changeSize(-1);
                System.out.println("借阅成功");
                return ;
            }
        }
        System.out.println("没有这本书无法借阅");
    }

借阅图书要实现的细节:

1.把书的属性设置为已借出;2.书架上书的数量减一。

3.归还图书

public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("输入要归还书的名称:");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();

        int choice=bookList.getSize();

        for(int i=0;i<choice;i++){
            String bname= bookList.getname(i);
            if(bname.equals(name)){
                bookList.changeType(i,false);         //用人方法要说哪一个
                bookList.changeSize(1);
                System.out.println("归还成功");
                return ;
            }
        }
        System.out.println("没有这本书无法归还");
    }

细节方面与上面的借阅相反。

4.新增图书

public void work(BookList bookList) {
        System.out.println("添加书籍");
        int choice=bookList.getSize();
        if(choice==10){
            System.out.println("书架已满无法继续添加");
            return;
        }
        Scanner scanner=new Scanner(System.in);

        System.out.println("请输入新增书的名称:");
        String name=scanner.nextLine();

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

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

        System.out.println("请输入新增书的价格:");
        int price=scanner.nextInt();

        Book newbook=new Book(name,author,price,type);

        for (int i = 0; i < choice; i++) {
            String name2=bookList.getname(i);
            if(newbook.equals(name2)){
                System.out.println("书架上已经有这本书了");
                return ;
            }
        }

        bookList.setBooks(choice,newbook);

        bookList.setSize(choice+1);

        System.out.println("添加成功");
    }

5.删除图书

 public void work(BookList bookList) {
        System.out.println("删除书籍");
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入要删除的书的名称");
        String name=scanner.nextLine();

        int choice=bookList.getSize();
        int i = 0;
        int flag=-1;
        for (; i < choice; i++) {
            String bname=bookList.getname(i);
            if(bname.equals(name)){
                flag=i;
                break;
            }

        }

        if(i==choice){
            System.out.println("没有这本书");
            return ;
        }

        for (int j = flag; j < choice-1; j++) {
            Book book = bookList.getBooks(j+1);

            bookList.setBooks(j,book);
        }
        bookList.setBooks(choice-1,null);
        bookList.setSize(choice-1);
        System.out.println("删除成功");
    }

6.退出系统

public void work(BookList bookList) {
        System.out.println("成功退出系统");
        System.exit(0);
    }

四.总结

以上功能的实现不是最主要的,代码的框架是最主要的。怎么实现一个图书管理系统,它的整个脉络是怎样的,这是重要的。上述功能代码的实现可能有不严谨的地方,大家可以自行修改。

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

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

相关文章

JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!

前言 笔者开始学习数据结构了,虽然笔者已经会用了,不管是C 中的stl亦或是Java 中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就好了…

【AI赋能】香橙派OrangePi AIpro初体验

【AI赋能】香橙派OrangePi AIpro初体验 1、初识香橙派1.1、仪式感开箱1.2、OrangePi AIpro(8T)介绍 2、上电开机2.1、开机2.2、串口调试2.2.1 两种方式登录2.2.2 相关信息 2.3、启动系统2.4、网络配置 3、连接摄像头4、目标检测4.1、Jupyter Lab模式4.2、 目标检测测试4.2.1 视…

花钱学谢宁DOE培训,投入产出比到底如何?

在当今这个快速发展的时代&#xff0c;无论是职场人士还是创业者&#xff0c;都渴望通过不断学习来提升自我能力&#xff0c;以便在竞争激烈的市场中脱颖而出。其中&#xff0c;谢宁DOE培训因其独特的理念和方法&#xff0c;吸引了众多求学者的目光。然而&#xff0c;面对不菲的…

多条文本转二维码怎么做?一键批量建码的使用技巧

怎么快速的制作多条文本信息的二维码&#xff1f;随着二维码的广泛使用&#xff0c;现在很多内容都可以通过生成二维码扫码的方式来获取信息&#xff0c;其他文本二维码就是比较常用的一种类型。那么当需要将多条不同的文本内容每条单独生成二维码时&#xff0c;有什么方法可以…

如何借VR之手,让展厅互动更精彩?

VR虚拟现实技术以其卓越的沉浸式体验为特点&#xff0c;引领用户踏入一个全新的虚拟世界&#xff0c;正因如此&#xff0c;它开始被广泛应用于展厅、商业等多个领域。那么&#xff0c;今天&#xff0c;让我们就来了解一下这种技术是如何为展厅带来精彩互动体验的吧&#xff01;…

Hudi之数据读写探究

Hudi之数据读写深入探究 1. Hudi数据写入 1-1. 写操作 Hudi数据湖中的数据更新、插入和删除操作&#xff0c;是一个基于Apache Hadoop的库&#xff0c;为数据湖提供了一种有效的方法来处理更新和增量数据&#xff0c;并支持基于时间的快照和增量数据处理。Hudi支持三种主要的…

可道云网盘的URL链接能干什么?小白必看的teamOS使用技巧

在繁复的工作日常里&#xff0c;我们每天都在与各种文件和资料打交道。由于文件夹太多&#xff0c;常常会陷入那种死活找不到想要的文件的困境中。 比如询问同事&#xff0c;合同模板在哪&#xff0c;直接发微信当然是很快的&#xff0c;但是事后想归档总是格外麻烦。比如&…

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述&#xff1a; 关于BGT24LTR11N16&#xff0c;它是一款用于信号生成和接收的硅锗雷达MMlC&#xff0c;工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器&#xff08;VCO&#xff09;。 这颗芯片是属于1T1R&#xff0c;也就是一发一收…

10年老运营人吐血整理,给新媒体运营人的20条建议!沈阳新媒体运营培训

对于企业&#xff0c;在新媒体平台开设官方账号应该是已经成为标配。不仅是对企业新媒体运营需求量提高&#xff0c;新媒体人的薪资也是水涨船高。 另外值得注意的是&#xff0c;企业对资深新媒体运营人才尤为重视&#xff0c;这表现在他们不惜重金招聘高薪新媒体运营人才&…

Android Studio中xml预览不显示问题解决办法

具体表现&#xff1a; Android Studio的XML中可以看到视图的相对位置结构&#xff0c;但是看不到具体的模样&#xff0c;全黑&#xff0c;等于半摸黑调UI&#xff08;由于我已经修好了所以没有截图&#xff09;。不是所有的项目都会这样&#xff0c;一部分项目是正常的。 或许…

OrangePi_Kunpeng_Pro开发板测验——性能巨人

文章目录 &#x1f4d1;前言一、开箱初体验的愉悦二、产品规格概述三、前置工作四、性能测试4.1 CPU 性能测试4.1.1 单线程 CPU 测试4.1.2 多线程 CPU 测试 4.2 内存性能测试4.2.1 内存读写性能测试4.2.2 高负载内存测试 4.3 I/O 性能测试4.4 网络性能测试4.5 测试小结4.5.1 CP…

跨域的解决方案

1. 计算机更改跨域 1.C盘->Windows->System32->drivers->etc 2.修改hosts 文件2. Chrome浏览器的跨域设置 操作步骤&#xff1a;1.打开我的电脑——C盘 新建一个文件夹&#xff0c;命名为MyChromeDevUserData2.右键——Chrome——快捷方式——目标&#xff0c;在…

使用python绘制一个五颜六色的爱心

使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心&#xff01; 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战案例全网唯一

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战 前言 笔者我实际工作中&#xff0c;经常遇到mysql数据库死锁问题&#xff01;CSDN上面也有很多大神刨析解决方法&#xff01; 我在实际工作中的MySQL数据库架构很复杂&#xff0c;又涉及到主…

「异步魔法:Python数据库交互的革命」(一)

Hi&#xff0c;我是阿佑&#xff0c;今天将和大家一块打开异步魔法的大门&#xff0c;进入Python异步编程的神秘领域&#xff0c;学习如何同时施展多个咒语而不需等待。了解asyncio的魔力&#xff0c;掌握Async SQLAlchemy和Tortoise-ORM的秘密&#xff0c;让你的数据库操作快如…

Linux新增磁盘挂载分区

1. 查看磁盘分区名称 lsblk 可见&#xff0c;新增的分区为 sdb 2.格式化磁盘 mkfs.xfs -f /dev/sdb 3.挂在磁盘到 /ocean目录&#xff0c;挂在前先创建空目录 /ocean mkdir /oceanmount /dev/sdb /ocean 执行后&#xff0c;可用 df -h 查看分区是否成功 4.持久化磁盘分区&a…

如何让物理服务器可以运行多个虚拟机:VMware ESXi系统安装-详细介绍

目录 一、虚拟机&#xff08;比如VMware ESXi上的虚拟机&#xff09;及其优势 &#xff08;一&#xff09;虚拟机 &#xff08;二&#xff09;虚拟机应用和优势 1、硬件资源利用率提升 2、灵活性和可扩展性 3、高可用性 4、简化管理 5、绿色节能 6、快速响应业务需求 …

应用案例|精密制造中使用复合机器人得到显著提升

精密制造行业对设备的精度、稳定性和效率要求极高&#xff0c;而复合机器人凭借其多功能性、高度灵活性和精准控制能力&#xff0c;正逐渐成为该领域的新宠。以下是一个富唯智能复合机器人在精密制造中的应用案例。 案例背景 某知名汽车零部件制造企业&#xff0c;专注于生产…

【好书分享第十三期】AI数据处理实战108招:ChatGPT+Excel+VBA

文章目录 一、内容介绍二、内页插图三、作者简介四、前言/序言五、目录 一、内容介绍 《AI数据处理实战108招&#xff1a;ChatGPTExcelVBA》通过7个专题内容、108个实用技巧&#xff0c;讲解了如何运用ChatGPT结合办公软件Excel和VBA代码实现AI办公智能化、高效化。随书附赠了…

基于微信小程序开发的一款 高颜值在线答题刷题考试程序

大家好&#xff0c;我是兔兔。今天给大家分享的内容是&#xff0c;兔兔答题模板三的发布。 兔兔答题模板三是一款基于uniapp开发&#xff0c;后端使用PHP&#xff0c;前端使用图鸟UI的微信答题小程序应用程序。相必兔兔答题模板一和兔兔答题模板二&#xff0c;进行了系统架构的…