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

news2024/12/23 19:17:53

前言:该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能,分为两个用户群体:管理者和普通用户。使用了类与对象,封装继承多态,抽象类和接口等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);
    }

四.总结

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

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

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

相关文章

K8s种的service配置

什么是service 官方的解释是:   k8s中最小的管理单元是pod&#xff1b;而service是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法;   Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种服务发现机制。 你可以在 Pod 集合中运行代码…

统计每个活动的用户访问量,且每个用户仅统计一次

场景&#xff1a;统计每个活动的用户访问量&#xff0c;且每个用户仅统计一次。 首先活动表是已经存在了的&#xff0c;一般情况下&#xff0c;我们都会在创建一个用户访问表&#xff0c;其中唯一主键是用户ID活动ID作为唯一主键 create table user_visist_activity_record(i…

2024年中国金融行业网络安全研究报告

网络安全一直是国家安全的核心组成部分&#xff0c;特别是在金融行业&#xff0c;金融机构拥有大量的敏感数据&#xff0c;包括个人信息、交易记录、财务报告等&#xff0c;这些数据的安全直接关系到消费者的利益和金融市场的稳定&#xff0c;因此金融行业在网络安全建设领域一…

OpenCV学习 基础图像操作(十四):直方图均衡化和直方图规定化

基础原理 直方图操作是基于像素统计的基础图像操作,被广泛运用于调整图像的对比度,并由此衍生出很多变种和该经的方式. 图像相直方图 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的…

美业系统SaaS收银系统源码-顾客在系统付款了但系统未显示怎么办?美业系统实测

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 1. 提供门店名称、付款凭证和会员手机号 2. 到订单明细查询&#xff0c; 按门店名称和会员手机号查询看是否有相…

高工咨询:《2024中国人形机器人产业发展蓝皮书》

高工咨询所发布的《2024中国人形机器人产业发展蓝皮书》全面梳理了人形机器人产业的发展现状、政策环境、资本市场、技术发展、市场前景以及面临的机遇与挑战等情况。 人形机器人是当今世界科技领域最具潜力和前景的产业之一。随着科技的不断进步和人 工智能技术的快速发展&…

轻松拿捏C语言——二分查找

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; 目录&#x1f389; 一、介绍&#x1f308; 二、步骤&#x1f319; 三、代码☀️ 一、介绍 二分查找是一种在有序数组中…

DINO中为什么教师模型用大图,学生模型用小图

在 DINO&#xff08;可以理解为由DIstillation和NO labels的缩写&#xff09;中&#xff0c;使用不同的图像裁剪策略对教师模型和学生模型进行训练有其特定的原因。具体来说&#xff0c;教师模型使用大图&#xff08;global views&#xff09;&#xff0c;学生模型则同时使用大…

二十三篇:未来数据库革新:AI与云原生的融合之旅

未来数据库革新&#xff1a;AI与云原生的融合之旅 1. 智能数据库管理&#xff1a;AI的魔法 在数字化时代&#xff0c;数据库技术作为信息管理的核心&#xff0c;正经历着前所未有的变革。AI&#xff08;人工智能&#xff09;和云原生技术的融合&#xff0c;正在重新定义数据库…

Dubbo生态之深度分析sentinel的流量控制

1. 深度了解sentinel限流规则参数的含义 博客Dubbo生态之sentinel限流-CSDN博客中有dubbo集成sentinel的demo演示 在sentinel中&#xff0c;限流的直接表现形式就是&#xff0c;在执行Entry nodeA SphU.entry(resourceName)的时候抛出FlowException异常&#xff0c;FlowExce…

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代&#xff0c;北京3D元宇宙场景在线制作以其独特的优势&#xff0c;成为了行业内的创新引领者。它能够快速完成空间设计&#xff0c;根据您的个性化需求&#xff0c;轻松设置布局、灯光、音效以及互动元素等&#xff0c;为您打造出一个更加真实、丰富…

su模型导进3D无法炸开和移动?---模大狮模型网

SketchUp(简称SU)作为一款广受欢迎的3D建模软件&#xff0c;其直观的操作界面和丰富的功能深受用户喜爱。然而&#xff0c;当我们将SU模型导入到其他3D软件(如3ds Max、Maya等)时&#xff0c;有时会遇到模型无法炸开(即分解)和移动的问题。这不仅影响了我们的工作效率&#xff…

Mesa GL Dispatch分发分析与理解

Mesa GL Dispatch分发分析与理解 引言 这篇博客的核心是从OpenGL应用程序的典型api入手&#xff0c;分析gl api 调用到用户态驱动后端的过程&#xff0c;进而总结出一个典型的调用栈。理解了这个典型调用栈&#xff0c;对后续任何一个API的调用过程分析&#xff0c;都是a piec…

618有哪些值得买的好物?这几款好物通宵整理吐血推荐!

随着618购物节越来越近&#xff0c;很多买家终于等到了用好价钱买好东西的好机会。不管是你一直想要的家居电器&#xff0c;还是最新的数码产品&#xff0c;平时挺贵的东西在618期间会便宜不少。不过&#xff0c;这么多东西可选&#xff0c;促销活动也多得让人看花了眼&#xf…

实现echarts多图联动效果

实现echarts多图联动效果 文章目录 实现echarts多图联动效果业务场景实现关键api代码示例&#xff08;vue&#xff09; 业务场景 提示&#xff1a;主要是记录一下多个echarts联动效果实现方案 这本来就是echarts本身自带的api&#xff0c;并没有多高级&#xff0c;奈何寻找的过…

VUE3学习第一篇:启动ruoyi

1、找到ruoyi的vue3版本 然后下载代码到本地&#xff0c; 我刚开始用的nodejs14报错&#xff0c; 后面换成nodejs16&#xff0c;启动前端成功了。 页面如下图所示

用大模型搭建一个自己的新闻小助手

背景 信息快速增长的时代&#xff0c;及时获取到有价值的资讯是一件很必要的事情。已经有各类新闻app和获取信息的渠道了&#xff0c;为什么还需要在构建一个小助手来获取新闻资讯呢&#xff1f;其实原因很简单各类新闻app服务的是具体一类人群&#xff0c;个人和人群还是有偏…

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型&#xff0c;有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢&#xff1f;今天我们就来聊聊这个问题。 目前来看&#xff0c;主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

13 VUE学习:组件v-model

基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 [defineModel()]宏&#xff1a; <!-- Child.vue --> <script setup> const model defineModel()function update() {model.value } </script><te…

还在使用Swagger吗?ApifoxHelper插件隆重登场

目录 前言 安装Apifox Idea插件安装 插件令牌配置 获取令牌 Idea配置令牌 快速上手 同步文档 查看文档 结语&#xff1a; 前言 最近发现一款特别好用的插件&#xff0c;帮助开发者快速生成接口文档。ApifoxHelper插件实现代码零侵入&#xff0c;只需要写上相应注释即可…