Java基础(7)图书管理系统

 

目录

1.前言

2.正文

2.1思路

2.2Book包

2.3people包

2.4operation包

2.5主函数

3.小结


1.前言

哈喽大家好吖,今天来给前面Java基础的学习来一个基础的实战,做一个简单的图书管理系统,这里边综合利用了我们之前学习到的类和对象,继承与多态以及抽象类和接口等许多重要的概念以及知识,事不宜迟,让我们开始吧。

2.正文

2.1思路

在正式开始图书管理系统的代码完成前,我们需要先对一系列所需要创建的对象,各个对象之间的关系,如何实现这种关系,都要有一个提前的规划,下面我通过PlantUML生成了图书管理系统的基础框架,我据图一一解释。

5bb1025dd32d46988dc8d2955c31fb72.png

在图书管理系统里面,会参与各种行为的对象都有哪些呢?有书本,借阅者,管理员,具体的借阅功能等,所以我们一共有四个包,分别为:

  1. Book包
  2.  

    operation包

  3. people

  4. 主函数所在包

我们把各个模块把它分成各个包来进行封装,是代码的条理性更好。

2.2Book包

在Book包中,我们创建了俩个对象,一个是book对象,另一个书用于存放书的bookshelf对象,具体实现如下:

package Book;public class Book {private String bookName;private String writer;private String classification;private Boolean borrow;public Book(String bookName, String writer, String classification, Boolean borrow) {this.bookName = bookName;this.writer = writer;this.classification = classification;this.borrow = borrow;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getWriter() {return writer;}public void setWriter(String writer) {this.writer = writer;}public String getClassification() {return classification;}public void setClassification(String classification) {this.classification = classification;}public Boolean getBorrow() {return borrow;}public void setBorrow(Boolean borrow) {this.borrow = borrow;}
}

因为成员的访问权限我们设置为private,所以我们需要各种getter和setter方法来调用成员变量,其中getter和setter方法是可以通过系统快速生成的,即按住alt+insert可以快速实现该方法。

下面是Bookshelf对象:

package Book;public class bookShelf {private Book[] books = new Book[10];private int bookNum = 0;public bookShelf() {this.books[0] = new Book("三国演义","罗贯中","历史演义",null);this.books[1] = new Book("三体","刘慈欣","科幻小说",null);this.books[2] = new Book("西游记","吴承恩","小说",null);this.bookNum = 3;}public Book getBooks(int pos) {return books[pos];}public void setBooks(Book book,int pos) {this.books[pos] = book;}public int getBookNum() {return bookNum;}public void setBookNum(int bookNum) {this.bookNum = bookNum;}
}

我们在bookshelf的构造方法中提前初始化里三个对象,即可以理解为图书馆中原本就存放的书。创建一个bookNum变量用于记录当前所存放的图书数量。

2.3people包

在people包中我们通过继承来实现,首先创建了一个person抽象类用于抽取管理员和借阅者的共同属性以及方法,再分别实现子类Admin与normalUser。

person类:

package People;import operation.*;
import Book.*;public abstract class Person {public String name;public Operation[] iOperations;public Person(String name) {this.name = name;}public abstract int menu();public void finishOPerations(int choice,bookShelf bookShelf) {iOperations[choice].work(bookShelf);}
}

共同属性姓名不必多说,还额外创建了一个功能数组,另外创建一个菜单方法用于打印各自的菜单,最后还有finishOPeration方法,通过这个功能数组即可实现输入菜单对应选项进入对应功能的操作。

Admin类:

package People;import operation.*;import java.util.Scanner;public class Admin extends Person {public Admin(String name) {super(name);this.iOperations = new Operation[]{new edit(),new showBook(),new findBook(),new addBook(),new delBook()};}@Overridepublic int menu() {System.out.println("*******************");System.out.println("**欢迎来到管理员菜单**");System.out.println("******0.退出系统*****");System.out.println("******1.显示图书*****");System.out.println("******2.寻找图书*****");System.out.println("******3.增加图书*****");System.out.println("******4.减少图书*****");System.out.println("*******************");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}}

在这个构造方法中需要对功能数组中添加功能方法,下文同样。

normalUser类:

package People;import operation.*;import java.util.Scanner;public class normalUser extends Person {@Overridepublic int menu() {System.out.println("*******************");System.out.println("***欢迎来到用户菜单***");System.out.println("******0.退出系统*****");System.out.println("******1.显示图书*****");System.out.println("******2.寻找图书*****");System.out.println("******3.借阅图书*****");System.out.println("******4.归还图书*****");System.out.println("*******************");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}public normalUser(String name) {super(name);this.iOperations = new Operation[]{new edit(),new showBook(),new findBook(),new borrowBook(),new returnBook()};}}

2.4operation包

在这个包里面,我们尝试把各种人物的行为全都各个创建成对象来进行分别实现,这里我们采用了接口,即在这个包里接了这个接口的其他对象,都需要将接口中的方法重写,来达到方法都得到实现的目的。

首先是接口:

package operation;import Book.bookShelf;public interface Operation {public void work(bookShelf bookShelf);
}

接口中的方法不需要具体实现。

接下来就是各种需要实现的对象与对象之间的逻辑了,如借阅图书,归还图书,查询图书,退出系统等,我一一进行讲解:

findBook类:

package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;//找书先要判断是否有书,若有则借,若无则直接返回
public class findBook implements Operation{public void work(bookShelf bookShelf){Scanner scanner = new Scanner(System.in);System.out.println("查找图书");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){System.out.println("找到了《" + name + "》书");return;}}System.out.println("未找到"+ "《"+ name + "》");}
}

通过遍历来实现,若遍历到有此书则打印找到了并返回,若能走完遍历则未找到。

showBook类:

package operation;import Book.bookShelf;public class showBook implements Operation{public void work(bookShelf bookShelf) {System.out.println("显示图书");//遍历书架for (int i = 0; i < bookShelf.getBookNum(); i++) {System.out.println(bookShelf.getBooks(i));}}}

这个遍历打印即可,没什么特殊。

addBook类:

//新增图书,先判断该书是否存在,再实例化一个书对象添加进bookshelf,并将bookNum增加package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;public class addBook implements Operation {@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入添加的图书名字");String name = scanner.nextLine();System.out.println("请输入添加的图书作者名字");String writer = scanner.nextLine();System.out.println("请输入添加的图书分类");String classfication = scanner.nextLine();//遍历判断是否有相同书for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){System.out.println("书库里已有该书");return;}}//新增图书bookShelf.setBooks(new Book(name,writer,classfication,false), bookShelf.getBookNum());bookShelf.setBookNum(bookShelf.getBookNum() + 1);//新增图书加1System.out.println("书《" + name +"》已添加成功");}
}

新增图书是属于Admin对象的类方法,先输入要添加的书的各个成员变量的信息,再遍历寻找有无相同书,若没有则添加。

delBook类:

//删除一本书,现需要查找是否有该书,删书即使后一个覆盖前一个即可package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;public class delBook implements Operation{@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你需要删除的书");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){for(int j = i;j < bookShelf.getBookNum() - 1;j++){bookShelf.setBooks(bookShelf.getBooks(j + 1),j);}bookShelf.setBookNum(bookShelf.getBookNum() - 1);System.out.println("该书已删除完毕");return;}}System.out.println("不存在该书");}
}

也是遍历寻找输入的书,若找到删除的书,则将后面的书一一往前覆盖即可实现删除功能,最后不要忘了bookNum要进行减一操作。

borrowBook类:

package operation;import Book.Book;
import Book.bookShelf;
import java.util.Scanner;public class borrowBook implements Operation{@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入要借阅书的名字");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){bookShelf.getBooks(i).setBorrow(true);//设置借阅状态System.out.println("书《" + name +"》借阅成功");return;}}System.out.println("不存在该书,借阅失败");}
}

还是先遍历找书,若有则改变图书的借阅状态,若无则借阅失败。

returnBook类:

package operation;import Book.bookShelf;import java.util.Scanner;public class returnBook implements Operation{@Overridepublic void work(bookShelf bookShelf) {Scanner scanner = new Scanner(System.in);System.out.println("请输入要归还书的名字");String name = scanner.nextLine();for(int i = 0;i < bookShelf.getBookNum();i++){if(name.equals(bookShelf.getBooks(i).getBookName())){bookShelf.getBooks(i).setBorrow(false);//设置借阅状态System.out.println("书《" + name +"》归还成功");return;}}System.out.println("不存在该书,归还失败");}
}

和借书操作如出一辙,唯一的区别就是状态改变的true与false不同。

edit类:

package operation;import Book.bookShelf;public class edit implements Operation{@Overridepublic void work(bookShelf bookShelf) {for(int i = 0;i < bookShelf.getBookNum();i++){bookShelf.setBooks(null,i);}bookShelf.setBookNum(0);System.exit(0);}
}

 实现退出功能,先将储存的图书删除,将bookNum清零,最后退出系统。

2.5主函数

在主函数中同样,我们把登陆(即选择自己是管理员还是借阅者身份的选择)的login功能也通过单独的类方法来进行实现。

Login类:

package System;import People.Admin;
import People.Person;
import People.normalUser;import java.util.Scanner;public class Login{public Person loginIn(){System.out.println("*欢迎来到图书管理系统**");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的名字");String name = scanner.nextLine();System.out.println("*******************");System.out.println("******1.管理员******");System.out.println("******2.普通用户****");System.out.println("请输入你的身份");if(scanner.nextInt() == 1){return new Admin(name);}else{return  new normalUser(name);}}
}

最后就是主函数,这个时候主函数就会比较整洁明了,记得要分别实例化书架bookShelf对象以及Login登陆对象了。

package System;import Book.*;
import People.*;public class system {public static void main(String[] args) {bookShelf bookShelf = new bookShelf();Login login = new Login();Person person = login.loginIn();while(true){int choice = person.menu();person.finishOPerations(choice,bookShelf);}}}

这样我们图书管理系统就完成了! 

3.小结

今天的图书管理系统的分享到这里就结束了,喜欢的小伙伴不要忘了点一手关注再走哦,欢迎大家在评论区多多交流哦。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

研发运营一体化(DevOps)能力成熟度模型

目录 应用设计 安全风险管理 技术运 持续交付 敏捷开发管理 基于微服务的端到端持续交付流水线案例 应用设计 安全风险管理 技术运 持续交付

Android调用系统相机录像并设置参数

最近要做一个 Android上的录像功能&#xff0c;由于之前做拍照功能完全是用自定义方式&#xff0c;太麻烦。故这次决定直接调用系统相机来录像。 一、添加权限 首先&#xff0c;添加必要的权限 <!-- 授予该程序使用摄像头的权限 --><uses-permission android:name&q…

Could not find artifact cn.hutool:hutool-all:jar:8.1 in central 导入Hutool报错

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.9</version></dependency> 引入hutool 8.1版本的工具…

攻防世界-流量分析WP

流量分析1来自 <攻防世界> 题目描述:流量分析&#xff0c;你知道这堆流量做了什么事情吗&#xff0c;你能恢复出来flag吗&#xff1f; 1&#xff0c;首先查看IPv4统计信息 如果该流量记录的是黑客的攻击行为产生的流量&#xff0c;那么出现频率最高的流量应该来自攻击者…

2024软考网络工程师笔记 - 第8章.网络安全

文章目录 网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型3️⃣安全目标与技术 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552…

论文笔记:LaDe: The First Comprehensive Last-mile Delivery Dataset from Industry

2023 KDD 1 intro 1.1 背景 随着城市化进程的加快和电子商务的发展&#xff0c;最后一公里配送已成为一个关键的研究领域 最后一公里配送&#xff0c;如图1所示&#xff0c;是指连接配送中心和客户的包裹运输过程&#xff0c;包括包裹的取件和配送除了对客户满意度至关重要外…

cpp的vector类

本篇将讲述vector类中的各种重要和常用函数&#xff08;begin&#xff08;&#xff09;、end&#xff08;&#xff09;、rbegin&#xff08;&#xff09;、rend&#xff08;&#xff09;cbegin&#xff08;&#xff09;、cend&#xff08;&#xff09; 、crbegin&#xff08;&a…

Vuejs设计与实现 — 渲染器核心:挂载与更新

前言 挂载 与 更新 是 渲染器 的核心功能&#xff0c;也是渲染器应该要提供的基本功能&#xff0c;而 挂载 和 更新 又是基于 VNode 虚拟节点的&#xff0c;因为 VNode 节点描述了其对应的 真实 DOM 应该是什么样子的。 挂载与卸载 VNode 节点 无论是 vue 还是 react 都引入…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目&#xff0c;所以这里就结合一下&#xff0c;在搭建 k8s 集群后安装运维常用服务&#xff0c;比如 ansible 和 prometheus&#xff0c;用 NFS 实现数据存储同步&#xff0c…

鸿蒙中富文本编辑与展示

富文本在鸿蒙系统如何展示和编辑的&#xff1f;在文章开头我们提出这个疑问&#xff0c;带着疑问来阅读这篇文章。 富文本用途可以展示图文混排的内容&#xff0c;在日常App 中非常常见&#xff0c;比如微博的发布与展示&#xff0c;朋友圈的发布与展示&#xff0c;都在使用富文…

LeetCode_231. 2 的幂_java

1、题目 231. 2 的幂https://leetcode.cn/problems/power-of-two/ 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n &#xff0c;则认为 n 是 2 的幂次方…

ComfyUI初体验

ComfyUI 我就不过多介绍了&#xff0c;安装和基础使用可以看下面大佬的视频&#xff0c;感觉自己靠图文描述的效果不一定好&#xff0c;大家看视频比较方便。 ComfyUI全球爆红&#xff0c;AI绘画进入“工作流时代”&#xff1f;做最好懂的Comfy UI入门教程&#xff1a;Stable D…

ArcGIS001:ArcGIS10.2安装教程

摘要&#xff1a;本文详细介绍arcgis10.2的安装、破解、汉化过程。 一、软件下载 安装包链接&#xff1a;https://pan.baidu.com/s/1T3UJ7t_ELZ73TH2wGOcfpg?pwd08zk 提取码&#xff1a;08zk 二、安装NET Framework 3.5 双击打开控制面板&#xff0c;点击【卸载程序】&…

dbt-codegen: dbt自动生成模板代码

dbt项目采用工程化思维&#xff0c;数据模型分层实现&#xff0c;支持描述模型文档和测试&#xff0c;非常适合大型数据工程项目。但也需要用户编写大量yaml描述文件&#xff0c;这个过程非常容易出错且无聊。主要表现&#xff1a; 手工为dbt模型编写yaml文件&#xff0c;这过…

STM32传感器模块编程实践(十一) ADC模数转换模块ADS1115简介及驱动源码

文章目录 一.概要二.ADS1115芯片介绍三.ADS1115芯片主要特性四.ADS1115模块接线说明五.ADS1115参考原理图六.通讯协议介绍七.STM32单片机与ADS1115模块实现电压采集实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.源代码工程下载九.小结 一.概要 ADC&#xff0c;全称为…

认识和使用 Vite 环境变量配置,优化定制化开发体验

Vite 官方中文文档&#xff1a;https://cn.vitejs.dev/ 环境变量 Vite 内置的环境变量如下&#xff1a; {"MODE": "development", // 应用的运行环境"BASE_URL": "/", // 部署应用时使用的 URL 前缀"PROD": false, //应用…

JavaScript完整笔记

JS引入 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。 通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;有两种方式&#xff1a; 内部方式 通过 script 标签包裹 JavaScript 代码 我们将 &…

使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】

FRP&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用程序&#xff0c;主要用于内网穿透。它允许用户将内部网络服务暴露到外部网络&#xff0c;适用于 NAT 或防火墙环境下的服务访问。 他是一个开源的 服务 如果大家不想用 花生壳 软件&#xff0c;可以尝…

卷积神经网络评价指标

1.评价指标的作用 1. 性能评估&#xff1a;评价指标提供了一种量化的方式来衡量CNN模型的性能。通过这些指标&#xff0c;我们可以了解模型在特定任务上的表现&#xff0c;比如图像分类、目标检测或图像分割等。 2. 模型比较&#xff1a;不同的模型架构或训练策略可能会产生不…

基于SSM考研助手系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教学秘书管理&#xff0c;考研资讯管理&#xff0c;考研名师管理&#xff0c;考研信息管理&#xff0c;系统管理 教学秘书账号功能包括&#xff1a;系统首页&#xff0c;个人中心…