【Java】实现图书管理系统

文章目录

  • 1. 设计背景
  • 2. 需求分析
  • 3. 设计思路
  • 4. 实现
    • 4.1 book包
      • 4.1.1 Book类
      • 4.1.2 BookList类(书架)
    • 4.2 user包
      • 4.2.1 User 类
      • 4.2.2 AdminUser类(管理员用户)
      • 4.2.3 NormalUser类(普通用户)
    • 4.3 operation包
      • 4.3.1 IOPeration接口
      • 4.3.2 FindOperation类(查找图书)
      • 4.3.3 AddOperation类(新增图书)
      • 4.3.4 DelOperation类(删除图书)
      • 4.3.5 ShowOperation类(显示图书)
      • 4.3.6 ExitOperation类(退出系统)
      • 4.3.7 BorrowOperation类(借阅图书)
      • 4.3.8 ReturnOperation类(归还图书)
    • 4.4 Main类
    • 4.5 完整代码

1. 设计背景

  • 随着社会的发展和科技的进步,图书馆的规模和藏书量都在不断扩大,图书的管理和维护变得越来越复杂。传统的图书管理方式已经无法满足现代图书馆的需求,因此需要开发一种高效、便捷的图书管理系统来提高图书管理效率和读者的借阅体验。
  • 在这种背景下,我们设计了Java图书管理系统。该系统采用Java语言开发,具有跨平台、可扩展、可维护等优点,可以满足现代图书馆的管理需求。该系统分为管理员用户和普通用户,主要实现了图书的查询、新增、删除、借阅、归还等功能。
  • 此外,图书管理系统是 java 知识学习的运用,运用了到了类和对象,构造方法,方法调用,数组,继承,多态,封装,接口,抽象类等知识。通过这个图书管理系统的练习,能更好的帮助我们更好的巩固对前面学习知识。

2. 需求分析

这个图书系统在登陆页面分为管理员用户和普通用户,管理员用户和普通用户的实现页面不一样

  • 管理员用户需要实现的功能有查找图书, 新增图书,删除图书,显示图书,退出系统。
  • 普通用户需要实现的功能有查找图书, 借阅图书,归还图书 退出系统。

3. 设计思路

回顾面向对象的核心

  • 找到对象
  • 创建对象
  • 使用对象
  1. 首先我们需要找出图书馆里系统里的所有对象:
    在图书管理系统在的对象有用户(普通用户和管理员用户),其中还有存放书本的书架
  2. 普通用户和管理员用户所展示的页面有所不同,利用继承和多态实现这一思路。
  3. 我们将普通用户和管理员用户的操作单独封装起来设计成一个类,并且定义一个接口来接收方法,接口达到了统一性。

4. 实现

我们要完成图书系统,可以先搭框架,再完善细节。其中使用了三个包,book包;operation 包和 user 包。
在这里插入图片描述

4.1 book包

book包中包含Book类和BookList类(书架)

4.1.1 Book类

Book类针对书籍,定义了有关书的属性,作者、价格、名字、类别,状态(判断是否被借出),通过构造方法,获取 get 和 set 方法,重写了toString 函数。

代码实现:

package book;public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;//构造方法public Book(String name, String author, int price,String type) {this.name = name;this.author = author;this.price = price;this.type = type;}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 int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getType() {return type;}public void setType(String type) {this.type = type;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrowed == true) ? " 已经借出" : " 未被借出") +//", isBorrowed=" + isBorrowed +'}';}
}

4.1.2 BookList类(书架)

这么多本书怎么放到书架上?其中数组可以组织数据,所以我们在书架类里会使用一个数组来存放书本

代码实现:

package book;public class BookList {private Book[] books;private int usedSize;//记录当前书架上 实际存放书的数量private static final int DEFAULT_CAPACITY = 10;public BookList(){this.books = new Book[DEFAULT_CAPACITY];//当前书架能存放10本书//放好书!this.books[0] = new Book("三国演义","罗贯中",10,"小说");this.books[1] = new Book("西游记","吴承恩",23,"小说");this.books[2] = new Book("红楼梦","曹雪芹",28,"小说");this.usedSize = 3;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book getBook(int pos){return books[pos];}public void setBooks(int pos,Book book){books[pos] = book;}public Book[] getBooks(){return books;}
}

4.2 user包

user包中存放User类,AdminUser 类(管理员用户)和 NormalUser类(普通用户)

4.2.1 User 类

User 类是 AdminUser 类和 NormalUser类的父类,创建User为抽象类,抽象方法menu菜单和IOperation数组的初始化。

代码实现:

package user;import book.BookList;
import operation.IOPeration;public abstract class User {protected String name;protected IOPeration[] ioPerations;public User(String name) {this.name = name;}public abstract int menu();public void doOperstion(int choice, BookList bookList){ioPerations[choice].work(bookList);}
}

4.2.2 AdminUser类(管理员用户)

通过继承User类,调用到IOperation功能接口以调用管理员用户所需的功能

代码实现:

package user;import operation.*;import java.util.Scanner;//子类继承父类要先帮父类进行构造,父类对name进行初始化,
//子类就要提供一个构造方法,在构造方法中使用super方法对继承过来的成员name进行初始化
public class AdminUser extends User {public AdminUser(String name) {super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};}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);System.out.println("请输入你的操作:");int choice = scanner.nextInt();return choice;}
}

4.2.3 NormalUser类(普通用户)

通过继承User类,调用到IOperation功能接口以调用普通用户所需的功能

代码实现:

package user;import operation.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name){super(name);this.ioPerations = new IOPeration[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}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);System.out.println("请输入你的操作:");int choice = scanner.nextInt();return choice;}
}

4.3 operation包

一些操作类的方法放在operation包中

4.3.1 IOPeration接口

定义一个接口来接收方法,接口达到了统一性,利用多态进行操作,在以下的类中执行接口,并重载。

代码实现:

package operation;import book.BookList;public interface IOPeration {void work(BookList bookList);
}

4.3.2 FindOperation类(查找图书)

根据输入的书名来查找图书,有两种情况一种是找到了,输出图书信息,另一种则是没有找到。

代码实现:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("查找图书!");System.out.println("请输入你要查找的图书名字:");//输入书名Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//遍历数组int currentSize = bookList.getUsedSize();//获取当前有几本书for (int i = 0; i <currentSize ; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)){System.out.println("找到了这本书,信息如下:");System.out.println(book);return;}}System.out.println("很抱歉,没有找到这本书!");}
}

4.3.3 AddOperation类(新增图书)

从键盘输入新增图书的成员信息使之变成书的对象,将新增图书默认放在当前最后一本书的后面。
这里我们需要做两个判断:1. 判断当前书架是否已经存放了这本书,如果已经有这本书了,就不需要存放;2. 还需要判断当前书架有没有满,如果书架满了也不进行存放(不考虑扩容)。如果前面这两个判断都没有出现,则将新增图书默认放在当前最后一本书的后面。

代码实现:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("新增图书!");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 book = new Book(name,author,price,type);//检查当前书架(数组)中有没有这本书int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book1 = bookList.getBook(i);if(book1.getName().equals(name)){System.out.println("当前书架中有这本书,不需要存放!");return;}}if(currentSize == bookList.getBooks().length){System.out.println("书架已经满了!");}else {bookList.setBooks(currentSize,book);bookList.setUsedSize(currentSize+1);}}
}

4.3.4 DelOperation类(删除图书)

输入书名进行删除,删除的步骤如下:

  1. 找到有没有这本书,如果没有则返回没有要删除的图书,反正进行删除。
  2. 从后往前进行覆盖
  3. 将最后一本书进行置空

代码实现:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("删除图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的图书:");String name = scanner.nextLine();int pos = -1;int currentSize = bookList.getUsedSize();int i = 0;for (; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name)){pos = i;break;}}if(i == currentSize){System.out.println("没有你要删除的图书!");return;}//开始删除int j = pos;for (; j < currentSize-1; j++) {//[j] = [j+1]Book book = bookList.getBook(j+1);bookList.setBooks(j,book);}bookList.setBooks(j,null);bookList.setUsedSize(currentSize-1);System.out.println("删除成功!");}
}

4.3.5 ShowOperation类(显示图书)

我们在书架类里中使用了一个数组来存放书本,所以我们这里要显示图书就直接把数组里的每个对象打印出来就可以了。book实际上是一个对象,我们打印对象理论上会输出该对象的地址,但是现在不会了,因为我们在Book类中重写了我们的 toString 方法,会调用我们自己的 toString 方法,所以现在可以直接打印对象。

代码实现:

package operation;import book.Book;
import book.BookList;public class ShowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("打印图书!");int currentSize = bookList.getUsedSize();//获取当前有几本书for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}

4.3.6 ExitOperation类(退出系统)

退出系统非常容易,只需要调用系统的 exit 方法,传入参数0进行退出运行。

package operation;import book.BookList;public class ExitOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("退出系统!");System.exit(0);}
}

4.3.7 BorrowOperation类(借阅图书)

1.你要借阅哪本书?
2. 你借阅的书有没有?
3. 借阅的方式是什么?将isBorrowed置为 true表示借阅成功

代码实现:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你想要借阅的图书:");String name = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)){book.setBorrowed(true);System.out.println("借阅成功!");System.out.println(book);return;}}System.out.println("你借阅的图书不存在!");}
}

4.3.8 ReturnOperation类(归还图书)

归还的图书的操作与借阅类似,归还则将isBorrowed置为 false表示借阅成功。

代码实现:

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOPeration{@Overridepublic void work(BookList bookList) {System.out.println("归还图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你想要归还的图书:");String name = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)){book.setBorrowed(false);System.out.println("归还成功!");System.out.println(book);return;}}System.out.println("你归还的图书不存在!");}
}

4.4 Main类

我们在Main类中执行操作,其中Main类主要包含Login方法,即实现用户登陆操作。

  1. 创建一个空的 BookList 对象(bookList)用于存放图书信息。
  2. 调用 Login 方法来进行用户登录操作,获取一个 User 对象(user)。这个 User 对象代表着当前登录的用户,可以执行特定的操作以管理图书列表。
  3. 用while(true)使程序可以持续进行,直到用户进行退出程序操作(chioce = 0)
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login(){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 AdminUser(name);}else {//普通用户return new NormalUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();//user 指向哪个对象 就看返回值是什么?User user = login();//实现向上转型while (true){int choice = user.menu();System.out.println("choice:"+choice);//根据choice的选择来决定调用哪个方达?user.doOperstion(choice,bookList);}}
}

4.5 完整代码

Java 图书管理系统完整代码

由于本人技术有限,该图书管理系统是相对低级的版本,只完成命令行的交互没有实现数据库,待日后学习了更多知识就将该图书管理系统升级。

本章到这里就结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!
Fighting!!!✊

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

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

相关文章

Maven基本使用

Maven简介: Apache Maven 是一个项目管理和构建工具&#xff0c;它基于项目模型(POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建&#xff0c;报告和文档 Maven的作用: (1&#xff09;项目搭建&#xff1b; &#xff08;2&#xff09;依赖管理&#xff1b; &#xf…

[力扣 Hot100]Day16 除自身以外数组的乘积

题目描述 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n…

Mac Monitor:一款为macOS安全研究量身定制的高级独立系统监控工具

关于Mac Monitor Mac Monitor是一款功能强大的高级独立系统安全监控工具&#xff0c;该工具专为macOS安全研究、恶意软件分类和系统故障排除而设计&#xff0c;主要基于Apple Endpoint Security&#xff08;ES&#xff09;实现其功能。 Mac Monitor能够收集各种类型的系统事件…

ASP.NET Core 过滤器 使用依赖项注入

过滤器是 ASP.NET Core 中的特殊组件&#xff0c;允许我们在请求管道的特定阶段控制请求的执行。这些过滤器在中间件执行后以及 MVC 中间件匹配路由并调用特定操作时发挥作用。 简而言之&#xff0c;过滤器提供了一种在操作级别自定义应用程序行为的方法。它们就像检查点&#…

科普类——设计一套无人驾驶遥操作系统的步骤、架构、软硬件需求(十一)

设计一套无人驾驶遥操作系统的步骤、架构、软硬件需求 **设计步骤**&#xff1a;**整体架构**&#xff1a;**所需硬件及提供商**&#xff1a;**人员需求**&#xff1a; 设计无人驾驶中的遥操作系统是一个跨学科的工程项目&#xff0c;涉及机械工程、电子工程、计算机科学和通信…

ARM与X86架构的区别与联系

文章目录 1.什么是CPU2.复杂指令集和精简指令集3.ARM架构与X86架构的比较3.1.制造工艺3.2 64位计算3.3 异构计算3.4 功耗 4.ARM和X86的发展现状Reference 1.什么是CPU 中央处理单元&#xff08;CPU&#xff09;主要由运算器、控制器、寄存器三部分组成&#xff0c;从字面意思看…

Shell - 学习笔记 - 2.5 - Shell特殊变量:Shell $#、$*、$@、$?、$$

前面讲到了 $n&#xff0c;它是特殊变量的一种&#xff0c;用来接收位置参数。下面将继续讲解剩下的几个特殊变量&#xff0c;它们分别是&#xff1a;$#、$*、$、$?、$$。 Shell 特殊变量及其含义 变量 含义 $0 当前脚本的文件名。 $n&#xff08;n≥1 传递给脚本或函数的…

如何安全地多开Facebook/Twitter/TK/Ins等账号?

随着社交媒体的普及&#xff0c;人们需要在不同平台上管理多个账号。然而&#xff0c;如何安全地多开这些账号却是一个需要关注的问题。本文将介绍如何安全地多开Facebook、twitter、YouTube、TikTok等平台账号的方法。 重要关联因素&#xff1a; 1. 隐私和安全&#xff1a;保…

CCF CSP 202312-2因子化简

题目描述 样例 输入 3 2155895064 3 2 2 10000000000 10 输出 2238728 1 10000000000 基本思路 首先&#xff0c;要找出构成n的所有素因子&#xff0c;这些因子满足两个条件&#xff1a;是素数&#xff08;函数判断&#xff09;&#xff0c;且能被n或n的中间值整除&#xf…

【RT-DETR有效改进】CARAFE提高精度的上采样方法(助力细节长点)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的CARAFE(Content-Aware ReAssembly of FEatures)是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法(就是我们的Upsample)的性能。CARAFE的核心思想是:使用输…

ONLYOFFICE:兼顾协作与安全的开源办公套件

文章目录 前言ONLYOFFICE是什么&#xff1f;ONLYOFFICE的特点多人在线协同灵活集成安全可靠跨平台和设备扩展丰富 实操注册登录编写文档插件安装智谱CopilotDraw.io 新版强势功能显示协作者头像插件 UI 界面更新 总结 前言 随着数字化时代的到来&#xff0c;越来越多的文档处理…

【前端】日期转换

记录项目中需要处理的日期格式 默认vue2 初级版 将后端传来的数组 [2024/01/29 08:55:18, 2024/01/29 09:55:18, 2024/01/29 10:11:18]转为 [2024-01-29 08:55, 2024-01-29 09:55, 2024-01-29 10:11]方法 convertDateTimeFormat(arr) {var tempArr arr.map(function (dateT…

操作系统-线程的实现方式和多线程模型(用户级线程 内核级线程 多线程模型的情况)和线程的状态,转换,组织,控制

文章目录 线程的实现方式和多线程模型总览线程的实现方式用户级线程内核级线程多线程模型一对一多对一多对多 小结 线程的状态,转换,组织,控制总览 线程的状态与转换线程的组织与控制 线程的实现方式和多线程模型 总览 线程的实现方式 用户级线程 程序自己通过自己设计的线程…

06 单目初始化器 Initializer

文章目录 06 单目初始化器 Initializer6.1 成员变量/函数6.2 初始化函数 Initialize()6.3 计算基础矩阵 F \boldsymbol{F} F 和单应矩阵 H \boldsymbol{H} H6.3.1 RANSAC 算法6.3.2 八点法计算 F \boldsymbol{F} F 矩阵: ComputeF21()6.3.3 计算基础矩阵 F \boldsymbol{F} …

怎么使用cmd命令来进行Vue脚手架的项目搭建

前言 使用vue搭建项目的时候&#xff0c;我们可以通过对应的cmd命令去打开脚手架&#xff0c;然后自己配置对应的功能插件 怎么打开 我们打开对应的cmd命令之后就开始进入对应的网站搭建 vue ui 然后我们就打开对应的项目管理器来进行配置----这里我们打开开始创建新的项目…

【VS Code+Verilog+Vivado使用】(2)基本设置

文章目录 2 基本设置2.1 字体大小2.2 Tab大小2.3 选中高亮2.4 文件编码 2 基本设置 2.1 字体大小 方法1&#xff1a;VS Code左下角 > 管理 > 设置&#xff0c;搜索"font size"&#xff0c;点击左侧"字体"&#xff0c;根据需要设置"editor.fon…

20240130金融读报1分钟小得01

1、开放银行本质上是以用户需求为核心&#xff0c;以场景服务为切入点的共享平台金融模式&#xff0c;一定程度上加快了商业银行“隐形”和金融服务的无缝和泛在 2、利用自身优势进行差异化竞争&#xff0c;比如农信的客户面对面交流、全方位覆盖、政银紧密合作。针对劣势进行互…

穷游网酒店数据采集与可视化分析与实现

摘 要 穷游网酒店数据采集与可视化分析大屏的背景是为了满足用户对酒店数据的需求以及提供数据洞察和决策支持。随着旅游业的快速发展&#xff0c;人们对酒店信息的需求日益增加&#xff0c;而穷游网作为一家专注于旅游信息的网站&#xff0c;拥有丰富的酒店数据资源。 这个大…

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入…

Flink实战四_TableAPISQL

接上文&#xff1a;Flink实战三_时间语义 1、Table API和SQL是什么&#xff1f; 接下来理解下Flink的整个客户端API体系&#xff0c;Flink为流式/批量处理应用程序提供了不同级别的抽象&#xff1a; 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有状态实…