Java——简单图书管理系统

前言:

  • 一、图书管理系统是什么样的?
  • 二、准备工作
    • 分析有哪些对象?
    • 画UML图
  • 三、实现三大模块
    • 用户模块
    • 书架模块
    • 管理操作模块
      • 管理员操作有这些
      • 普通用户操作有这些
  • 四、Test测试类
  • 五、拓展

哈喽,大家好,我是无敌小恐龙。
写一个图书管理系统,可以回顾以前所学习是知识:数据类型,变量,if ,for,数组,方法,类和对象,封装,继承,多态,抽象类和接口。把这些知识串起来,不仅可以加深我们对知识的理解,还可以初步理解做一个系统是什么流程,资源包也上传了哦。

一、图书管理系统是什么样的?

请看如下动图:
在这里插入图片描述
在这里插入图片描述

程序一运行:开始先输入名字,在输入身份是否为管理员还是普通用户,最终就是一些操作了。这就是要做的简单图书管理系统了,心理暗自说:还是蛮简单的嘛,嘿嘿嘿。重点是学Java面向对象的开发思想哟!!!对象与对象之间的联系。

二、准备工作

分析有哪些对象?

用户: 管理员 普通用户
书:Book 书架
一些操作: 操作的是书架

画UML图

三大模块:用户模块,书架模块,管理操作模块
在这里插入图片描述

三、实现三大模块

用户模块

用户分为管理员和普通用户,可以抽象出一个公共的类:User(abstract) 其子类有Admin,NormalUser。放入一个包User中。
User

package User;import Book.Bookshelf;
import Operation.IOOperation;public abstract class User {//用户名protected String name;//用户的管理操作protected IOOperation[] operations;public User(String name) {this.name = name;}//抽象的菜单方法,应为不同的用户有不同的实现菜单方式,返回值为int 返回 你要选择那个?public abstract int menu();//不同的用户,不是也有不同的操作吗?//注意:操作的是书架//答:采用了多态public void doOperation(int option,Bookshelf bookshelf) {operations[option].work(bookshelf);}}

Admin

package User;import Operation.*;
import java.util.Scanner;
public class Admin extends User{public Admin(String name) {super(name);//不同的用户操作不同,直接在用户初始化时,就决定了有那些操作了--->直接赋值this.operations = new IOOperation[]{new ExitSystemOperate(),new FindBookOperate(),new AddBookOperate(),new DeleteBookOperate(),new ShowBookOperate(),};}//重写自己的菜单方法@Overridepublic 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 s = new Scanner(System.in);int option = s.nextInt();return option;}}

NormalUser:

package User;import Operation.*;
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.operations = new IOOperation[]{new ExitSystemOperate(),new FindBookOperate(),new BorrowBookOperate(),new BackBookOperate()};}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("********************");System.out.println("请输入选项:");Scanner s = new Scanner(System.in);int option = s.nextInt();return option;}}

书架模块

书类:

package Book;public class Book {private String name; //书名private String author; //作者private double price; //价格private String type; //类型private Boolean isBorrow; //是否借出//isBorrow 不能出现在构造方法中,书的借出是要看有人借了才是借出状态,且全局变量初始就是falsepublic Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;this.isBorrow = false;}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 double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getType() {return type;}public void setType(String type) {this.type = type;}public Boolean getBorrow() {return isBorrow;}public void setBorrow(Boolean borrow) {isBorrow = borrow;}//重写toString方法,输出时更看得懂,更好看些,用来展示书本的功能!@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", "+(isBorrow==true?"已借出":"在馆")+'}';}
}

书架:

package Book;public class Bookshelf {//书架采用数组的形式存储书本,整个系统的操作都在维系着这个书数组!!!private Book[] bookList = new Book[10];//书数组已经使用的空间private int usedSize;//我们在这里,对书架初始化时就先放入了三本书了,这就是为什么上述动图,一查看书就有三本书了。public Bookshelf() {this.bookList[0] = new Book("三国演义","罗贯中",9.9,"小说");this.bookList[1] = new Book("西游记","吴承恩",19.9,"小说");this.bookList[2] = new Book("红楼梦","曹雪芹",29.9,"小说");this.usedSize = 3;}public Book[] getBookList() {return bookList;}//书是一本本存入public void setBook(Book book) {this.bookList[this.usedSize] = book;this.usedSize++;}//取书的话,要看书的位置(下标)public Book getBook(int pos) {return this.bookList[pos];}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}

管理操作模块

这么多的操作,就要用到接口IOOperation了has a 有这种操作work(),对书架的操作,书架里有书的数组work(Bookshelf bookshelf)!!!
IOOperation

package Operation;import Book.Bookshelf;public interface IOOperation {void work(Bookshelf bookshelf);}

管理员操作有这些

增加一本书

package Operation;
import Book.*;
import java.util.Scanner;public class AddBookOperate implements IOOperation{@Overridepublic void work(Bookshelf bookshelf) {Scanner s = new Scanner(System.in);System.out.println("新增图书........");System.out.println("请输入书名:");String name = s.nextLine();Book[] books = bookshelf.getBookList();//判断图书已满吗?if(bookshelf.getUsedSize()==bookshelf.getBookList().length) {System.out.println("馆里图书已满,不能新增图书!");return;}//判断书是否已经存在了for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {System.out.println("图书管已存在"+"《"+name+"》"+",新增失败!");return;}}//不存在,即可新增!System.out.println("请输入输入作者:");String author = s.nextLine();System.out.println("请输入输入价格:");double price = s.nextDouble();System.out.println("请输入输入书的类型:");s.nextLine();String type = s.nextLine();Book book = new Book(name,author,price,type);bookshelf.setBook(book);bookshelf.setUsedSize(bookshelf.getUsedSize()+1);System.out.println("新增图书"+name+"成功!");}
}

删除一本书

package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class DeleteBookOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("删除图书........");System.out.println("请输入你要删除的图书:");Scanner s = new Scanner(System.in);String name = s.nextLine();Book[] books = bookshelf.getBookList();Boolean isBook = false;int pos = -1;//判断图书是否存在for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {isBook = true;pos = i;}}//不存在if(isBook==false) {System.out.println("删除图书失败。"+"馆里还没有这本 "+name+" 书");} else {//存在就删除这本我不想要的书//以下为从数组删除这本书的方法//如果为最后一本图书,特判,直接置为nullif(pos==bookshelf.getUsedSize()-1) {books[pos] = null;}else{//不是最后一本,则按这种算法for (int i = pos; i < bookshelf.getUsedSize()-1; i++) {if(name.equals(books[i].getName())) {books[i] = books[i+1];}}}//最后修改使用的大小bookshelf.setUsedSize(bookshelf.getUsedSize()-1);}}
}

展示所有的书

package Operation;import Book.Book;
import Book.Bookshelf;public class ShowBookOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("显示图书........");Book[] books = bookshelf.getBookList();//遍历打印for (int i = 0; i < bookshelf.getUsedSize(); i++) {System.out.println(books[i]);}}
}

退出图书馆里系统

package Operation;import Book.Bookshelf;public class ExitSystemOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("退出图书系统........");System.exit(0);}
}

普通用户操作有这些

借一本书

package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class BorrowBookOperate implements IOOperation{@Overridepublic void work(Bookshelf bookshelf) {System.out.println("借阅图书........");Scanner s = new Scanner(System.in);System.out.println("请输入你要借阅的图书:");String name = s.nextLine();Book[] books = bookshelf.getBookList();for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName()) ) {if(books[i].getBorrow()==false) {//如果馆里有这本书,且还没被借走!System.out.println("借阅"+name+"成功!");books[i].setBorrow(true);return;}System.out.println("借阅失败。"+name+" 已被借出。");return;}}System.out.println("借阅失败。"+"馆里还没有这本 "+name+" 书");}
}

归还一本书

package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class BackBookOperate implements IOOperation{@Overridepublic void work(Bookshelf bookshelf) {System.out.println("归还图书........");Scanner s = new Scanner(System.in);System.out.println("请输入你要归还的图书:");String name = s.nextLine();Book[] books = bookshelf.getBookList();//遍历书架,看是否有归还的这本书。总不能不是我们管的书,我还收下吧!!!for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {System.out.println("归还"+name+"成功!");books[i].setBorrow(false);return;}}System.out.println("归还失败。"+"馆里还没有这本 "+name+" 书");}
}

查找一本书

package Operation;import Book.Book;
import Book.Bookshelf;import java.util.Scanner;public class FindBookOperate implements IOOperation{public void work(Bookshelf bookshelf) {System.out.println("查找图书........");Scanner s = new Scanner(System.in);System.out.println("请输入要查找的图书:");String name = s.nextLine();//遍历书架Book[] books = bookshelf.getBookList();for (int i = 0; i < bookshelf.getUsedSize(); i++) {if(name.equals(books[i].getName())) {System.out.println(books[i]);return;}}System.out.println("馆里还没有这本 "+name+" 书");}
}

退出图书馆里系统,和Admin一样的。

四、Test测试类

整个系统都在围绕书数组,所以要先new Bookshelf()。
在根据用户是什么身份,给其new 什么身份,再获取用户要进行那个操作,穿个给doOperation(option,bookshelf)。

import Book.*;
import User.*;import java.util.Scanner;public class Test {public static User log() {System.out.println("请输入你的姓名:");Scanner s = new Scanner(System.in);String name = s.nextLine();System.out.println("请输入你的身份: 1:管理员   2:普通用户");int id = s.nextInt();System.out.println("欢迎"+name+"来到图书管理系统");if(id==1) {return new Admin(name);} else if(id==2) {return new NormalUser(name);} else {System.out.println("输入错误,请重新输入!");return null;}}public static void main(String[] args) {Bookshelf bookshelf = new Bookshelf();User user = log();while(true) {int option =  user.menu();user.doOperation(option,bookshelf);}}
}

五、拓展

怎么进行数据的保存,数据库。
功能拓展:书名,价格,作者名排序

感谢铁子能看到这里。希望有所收获,如果有哪些不对的地方还请大方指正
在这里插入图片描述

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

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

相关文章

Spark作业运行异常慢的问题定位和分析思路

一直很慢 &#x1f422; 运行中状态、卡住了&#xff0c;可以从以下两种方式入手&#xff1a; 如果 Spark UI 上&#xff0c;有正在运行的 Job/Stage/Task&#xff0c;看 Executor 相关信息就好。 第一步&#xff0c;如果发现卡住了&#xff0c;直接找到对应的 Executor 页面&a…

「前端+鸿蒙」鸿蒙应用开发-TS函数

在 TypeScript 中&#xff0c;函数是一等公民&#xff0c;这意味着函数可以作为参数传递、作为其他函数的返回值&#xff0c;甚至可以赋值给变量。TypeScript 为 JavaScript 的函数增加了类型系统&#xff0c;使得函数的参数和返回值都具有明确的类型。 TS快速入门-函数 基本函…

论文写作神器:15大参考文献来源网站推荐

撰写论文需要大量的参考文献支撑论点,这对在校学生和学者而言都是一大挑战。今天,我们可以充分利用网络资源,高效获取优质文献,摆脱遍查图书馆和杂志社的艰辛。本文就为大家推荐15大优质的参考文献来源网站,助力论文写作! AIPaperDone 拥有完美文献综述的AI论文网站 - AIPaperD…

模糊控制器实现对某个对象追踪输入

MATLAB是一个十分便捷的软件&#xff0c;里面提供了许多集成的组件&#xff0c;本文利用simulink实现模糊控制器实现对某个对象追踪输入。 这里的对象根据自己的需求可以修改&#xff0c;那么搭建一个闭环控制系统并不是难事儿&#xff0c;主要是对于模糊控制器参数的设置&…

win设置ftp服务器~java通过ftp下载文件

1.先设置ftp 2.打开服务 3.设置站点 4.起名字 这样就可以了 5.剩下的就是设置权限和账号了&#xff0c;找到对应的按钮就可以了 6.下载文件的代码 public byte[] downloadFile(File file) throws IOException{ByteArrayOutputStream out new ByteArrayOutputStream();toDi…

seerfar选品功能,OZON运营插件工具seerfar

在当今这个数字化、信息化的时代&#xff0c;电子商务的飞速发展使得越来越多的商家开始关注如何更高效地运营自己的在线店铺。其中&#xff0c;选品作为电商运营的重要一环&#xff0c;直接影响着店铺的流量、转化率和利润。在OZON这样的电商平台上&#xff0c;如何快速、准确…

第四篇红队笔记-百靶精讲之Prime-wfuzz-wpscan-openssl enc

靶机Prime渗透 主机发现 nmap扫描与分析 目录爆破与模糊测试 dirb 目录扫描 dev secret.txt wfuzz发现 file参数 根据secret.txt-location.txt 和 file参数结合 secrettier360 根据filelocation.txt得到的on some other php page&#xff08;改用之前扫到image.p…

chrony内网同步服务器时间

当前需要在10.26.24.62和10.26.24.61两个服务器上设置chrony同步时间&#xff0c;其中10.26.24.62为NTP时间服务器&#xff0c;10.26.24.61去10.26.24.62同步时间 检查Chrony配置文件&#xff1a; 确认10.26.24.62&#xff08;NTP服务器&#xff09;的配置文件 /etc/chrony/c…

Spring 自动配置 condition

目录 前言 1. 自定义condition加载bean 1.1. 自定义一个condition注解 1.2. 实现自定义注解对应的实现类 1.3. 使用如上注解 1.4. 使用Spring上下文获取一下改bean 2. 我们来看看Spring是如何加载redisTemplate的。 2.1. 找到Spring的autoconfigure的jar包&#xff0c;我们…

Web前端高亮:深度解析高亮技术的四个方面、五个方面、六个方面与七个方面

Web前端高亮&#xff1a;深度解析高亮技术的四个方面、五个方面、六个方面与七个方面 在Web前端开发中&#xff0c;高亮技术以其独特的功能和广泛的应用场景&#xff0c;为网页增添了丰富的交互体验。然而&#xff0c;高亮技术的实现并非一蹴而就&#xff0c;它涉及到多个方面…

第二十章 SOAP 错误处理 - 产生故障的方法

文章目录 第二十章 SOAP 错误处理 - 产生故障的方法产生故障的方法MakeFault()MakeFault12()MakeSecurityFault()MakeStatusFault() 第二十章 SOAP 错误处理 - 产生故障的方法 产生故障的方法 MakeFault() classmethod MakeFault(pFaultCode As %String, pFaultString As %S…

Steam下载游戏很慢?一个设置解决!

博主今天重装系统后&#xff0c;用steam下载发现巨慢 500MB&#xff0c;都要下载半小时。 平时下载软件&#xff0c;一般1分钟就搞定了&#xff0c;于是大致就知道&#xff0c;设置应该出问题了 于是修改了&#xff0c;如下设置之后&#xff0c;速度翻了10倍。 另外&#x…

【案例分享】印前制版工单系统:“鹿山科技”助力“铭匠数据”重塑业务流程

内容概要 本文介绍了鹿山信息科技通过明道云HAP平台的数字化解决方案提升了铭匠数据在印前制版行业的效率。周口铭匠数据科技有限公司位于河南省周口市沈丘县&#xff0c;是一家专注于印前制版设计服务的公司&#xff0c;成立于2023年。企业在销售业务、版材制作生产和美工设计…

计算机组成原理复习笔记

前言 就是按照考试的题型写的总结 非常应试版 题型 一、进制转换 只考 十进制 二进制 十六进制 之间的相互转换 一个个看 &#xff08;1&#xff09;十进制 转其他 转二进制&#xff1a;除以2 从小到大取余数&#xff08;0或1&#xff09; 转十六进制 &#xff1a; 除以1…

爬虫可以不必自己写,使用ChatGPT编写抓取电影评论数据脚本

经常去新华书店看看有没有什么新书上架&#xff0c;还是更新挺及时的&#xff0c;可以反映新的技术趋势。这不&#xff0c;最近就看到了这本《巧用 ChatGPT 快速搞定数据分析》&#xff0c;作者是个大牛&#xff0c;第一次看到prompt可以这么写&#xff0c;得写这么长&#xff…

htb-linux-6-beep

nmap web渗透 目录扫描 漏洞关键词 shell py脚本执行 flag root 目前的权限 nmap root

【深度学习】深度学习之巅:在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境

【深度学习】深度学习之巅&#xff1a;在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境 大家好 我是寸铁&#x1f44a; 总结了一篇【深度学习】深度学习之巅&#xff1a;在 CentOS 7 上打造完美Python 3.10 与 PyTorch 2.3.0 环境✨ 喜欢的小伙伴可以点点关注 &#…

本地部署AI大模型 —— Ollama文档中文翻译

写在前面 来自Ollama GitHub项目的README.md 文档。文档中涉及的其它文档未翻译&#xff0c;但是对于本地部署大模型而言足够了。 Ollama 开始使用大模型。 macOS Download Windows 预览版 Download Linux curl -fsSL https://ollama.com/install.sh | sh手动安装说明 …

运维入门- python实现对.log日志文件的无用行内容过滤,便于留存有价值的信息

代码原文&#xff1a; def remove_offline_messages(file_path):try:# 打开文件并读取所有行with open(file_path, r, encodingutf-8) as file:lines file.readlines()# 过滤掉包含pc消息离线pcadmin的行filtered_lines [line for line in lines if 丢弃消息 not in line]# …