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…

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

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…

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;我们…

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 环境✨ 喜欢的小伙伴可以点点关注 &#…

股票数据集2-纳斯达克NASDAQ 100 分析

1. 数据清洗 用邻近均值的方法&#xff0c;去掉Non_Padding中的NaN数据 这里没用df.fillna(), 因为其只有前向(ffill )和 后向 (bfill) 插值&#xff0c;不适合大量连续的NaN pd转换为np&#xff0c;写一个函数, 返回np数组的空值&#xff0c;lambda的匿名函数返回y轴空值的索…

IDEA配置mybatis-config.xml模板文件

IDEA配置mybatis-config.xml模板文件 File>>Settings>>File and Code Templates 创建mybatis-config.xml模板 模板内容取自mybatis官网 mybatis官网 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC &qu…

【Java】解决Java报错:NullPointerException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 调用 null 对象的实例方法2.2 访问 null 对象的属性2.3 自动拆箱引起的 NullPointerException 3. 解决方案3.1 使用条件判断防止 NullPointerException3.2 优先使用Optional类 4. 预防措施4.1 在方法入口进行校验4.2 使用注解提高…

如何将 Windows图片查看器的背景颜色改成浅色(灰白色)?

现在大家基本都在使用Win10系统&#xff0c;我们在双击查看图片时&#xff0c;系统默认使用系统自带的图片&#xff08;照片&#xff09;查看器去打开图片。图片查看器的背景色默认是黑色的&#xff0c;如下所示&#xff1a;&#xff08;因为大家可能会遇到同样的问题&#xff…

【Linux】进程5——进程优先级

1.进程优先级 1.1.什么是进程优先级 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。还可以把进程运行到指定的CPU上&#x…

关于CodeCombat(沙漠)布朗噪声的攻略

关于CodeCombat(沙漠)//布朗噪声的攻略 总的来说怎么猥琐怎么来 1.走到墙角骷髅看不到的位置&#xff0c;让宠物制造噪音&#xff0c;然后英雄走过去&#xff0c;就是这样没错&#xff08;坐标之类能明白) 最后看看运行结果吧 Rec 0002 希望天天开心

Java SE(Java Platform, Standard Edition)

Java SE&#xff08;Java Platform, Standard Edition&#xff09; 是Java平台的一个版本&#xff0c;面向桌面应用程序、服务器和嵌入式环境。Java SE提供了开发和运行Java应用程序的基础API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&…