【Java】图书管理系统 介绍与实现

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

1.介绍 

       图书馆作为知识的殿堂和学术的中心,其管理系统不仅是图书馆管理的必备工具,更是为用户提供优质、高效服务的重要保障,促进了知识的传播和学术的发展。随着信息量的急剧增长和用户需求的多样化,传统的图书馆管理方式已经难以满足现代社会的需求。因此,引入一套高效、智能的图书馆管理系统变得尤为迫切。

       在本篇博客中,我们将探讨如何构建一套易用便捷的图书馆管理系统。我们将从系统的需求分析开始,一步步领略图书馆管理系统背后的编程思想。相信本文能为您带来新的启发和思考。

2. 准备框架

首先,作为图书管理系统,应具有相应的 登录 以及 菜单 功能

 

登录功能,我们以简单的姓名属性来进行实现;

身份的选择,决定了菜单中可使用的功能种类; 

 

接着,当我们登录系统,系统首先会初始化书架中所有的书籍到内存中,以供我们实现需要的功能;

 

最后,在相应的身份下选择相应的功能,例如查找,借阅和归还书籍; 

因此,需要以下包和类来搭建框架:

 

Book类,用于定义书籍属性,提供构造方法,get and set 方法,以及toString方法等实现;

BookList类,通过数组来存放书籍,实现初始化,并提供一些方法,例如数组下标;

operation包中包含了菜单中所有的操作选项,由IOperation作为接口;

User类作为AdminUser与NormalUser的父类,通过动态绑定来实现不同用户的不同操作; 

3.代码实现 

3.1 book

 3.1.1 Book

package book;public class Book {private String name;private String author;private int price;private String type;private boolean isLend;//是否被借出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 isLend() {return isLend;}public void setLend(boolean lend) {isLend = lend;}public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isLend == true ? "已借出" : "未借出")+//", isLend=" + isLend +'}';}
}

3.1.2 BookList

package book;public class BookList {private Book[] books = new Book[10];private int usedSize;public BookList(){books[0] = new Book("操作系统原理","阿罗哈",67,"教材");books[1] = new Book("网络技术","阿罗呀",17,"教材");books[2] = new Book("Linux嵌入式","阿罗哇",57,"教材");this.usedSize = 3;//用来记录数组已用大小,以及寻找下标}public Book getBook(int pos) {return books[pos];}public void setBook(int pos,Book book) {books[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public boolean isFull(){if(this.usedSize == books.length){return true;}return false;}
}

 3.2 user

3.2.1 User

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();//该方法是一个抽象方法,所以User类要是一个抽象类//并且该方法需要在User的子类中实现public void doIoperations(int choice, BookList bookList){this.ioperations[choice].work(bookList);}
}

3.2.2 AdminUser

package user;import java.util.Scanner;
import operation.*;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("***********************");System.out.println("请输入你需要的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

3.2.3 NormalUser

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

3.3 operation

3.3.1 IOperation

package operation;import book.BookList;public interface IOperation {void work(BookList bookList);
}
//通过该接口,所有接入该接口的类都将重写work方法
//通过动态绑定实现对应功能

3.3.2 AddOperation

package operation;import book.BookList;
import book.Book;import java.util.Scanner;public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList){if(bookList.isFull()){System.out.println("书架满了,无法新增!");return;}System.out.println("请输入新增的图书的书名:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();System.out.println("请输入新增图书的作者:");String author = scanner.nextLine();System.out.println("请输入新增图书的价格:");int price = scanner.nextInt();System.out.println("请输入新增图书的类型:");String type = scanner.nextLine();Book book = new Book(bookName,author,price,type);int currentSize = bookList.getUsedSize();//3bookList.setBook(currentSize,book);bookList.setUsedSize(currentSize+1);System.out.println("新增图书成功!");}
}

3.3.3 BorrowedOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowedOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("输入借阅图书的书名:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(bookName)) {book.setLend(true);System.out.println("借阅成功!");return;}}System.out.println("借阅失败!");}
}

3.3.4 DelOperation

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);String bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();int pos = -1;int i = 0;for (; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(bookName)) {//找到这本书了 记录下标pos = i;break;}}if(i >= currentSize) {System.out.println("没有要找的书!");return;}//开始删除了for (int j = pos; j < currentSize-1; j++) {//bookList[j] = bookList[j+1];Book book = bookList.getBook(j+1);bookList.setBook(j,book);}//修改usedSizebookList.setUsedSize(currentSize-1);bookList.setBook(currentSize-1,null);System.out.println("删除成功!");}
}

3.3.5 ExitOperation

package operation;import book.BookList;
public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统中......");int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {bookList.setBook(i,null);}System.exit(0);}
}

3.3.6 FindOperation

package operation;import book.Book;
import book.BookList;import java.util.Scanner;
public class FindOperation implements IOperation{public void work(BookList bookList) {System.out.println("请输入你要查找的图书名:");Scanner scanner = new Scanner(System.in);String bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {//Book book = bookList[i];Book book = bookList.getBook(i);if(book.getName().equals(bookName)) {System.out.print("找到了这本书:");System.out.println(book);return;}}System.out.println("没有你要找的书....");}
}

3.3.7 ReturnOperation

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);String bookName = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(bookName)) {book.setLend(false);System.out.println("归还成功!");return;}}System.out.println("归还失败!");}
}

3.3.8 ShowOperation

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[i];Book book = bookList.getBook(i);System.out.println(book);}}
}

3.4 Main

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login() {Scanner scanner = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = scanner.nextLine();System.out.println("请选择你的身份,1.管理员用户   2.普通用户");int choice = scanner.nextInt();if(choice == 1){AdminUser adminUser = new AdminUser(name);return adminUser;}else{NormalUser normalUser = new NormalUser(name);return normalUser;}}public static void main(String[] args) {BookList bookList = new BookList();//User有可能引用 管理员用户 有可能引用普通用户User user = login();while (true){int choice = user.menu();user.doIoperations(choice,bookList);}}
}

4.总结

该代码主要涉及了类和对象 继承和多态抽象类和接口这些编程思想

通过该项目的实战,可以对这些思想有着更加深刻的理解;

希望这篇博客能为你理解java编程思想提供一些帮助。

如有不足之处请多多指出。

我是高耳机。 

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

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

相关文章

基于FPGA的数字信号处理(6)--如何确定Verilog表达式的符号

前言 尽管signed语法的使用能带来很多便利&#xff0c;但同时也给表达式的符号确定带来了更多的不确定性。比如一个有符号数和一个无符号数的加法/乘法结果是有符号数还是无符号数&#xff1f;一个有符号数和一个无符号数的比较结果是有符号数还是无符号数&#xff1f;等等。接…

力扣刷题Day2

题目链接&#xff1a; 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 效果&#xff1a; 解题思路&#xff1a; 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 注意不可以只是单纯的改变节点内部的值&#xff0c;而…

《QT实用小工具·四十七》可交互的创意动态按钮

1、概述 源码放在文章末尾 该项目实现了可交互的创意动态按钮&#xff0c;包含如下功能&#xff1a; 所有颜色自定义 鼠标悬浮渐变 两种点击效果&#xff1a;鼠标点击渐变 / 水波纹动画&#xff08;可多层波纹叠加&#xff09; 额外鼠标移入/移出/按下/弹起的实时/延迟共8种事…

51单片机两个中断及中断嵌套

文章目录 前言一、中断嵌套是什么&#xff1f;二、两个同级别中断2.1 中断运行关系2.2 测试程序 三、两个不同级别中断实现中断嵌套3.1 中断运行关系3.2 测试程序 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#x…

德国著名自动化公司Festo设计了一款仿生蜜蜂,仅重34g,支持多只蜜蜂编队飞行!...

德国著名的气动元件研发及自动化解决方案供应商Festo公司近日展示了一款仿生蜜蜂&#xff08;BionicBee&#xff09;&#xff0c;重量只有34g&#xff0c;却完全可以实现自主飞行&#xff0c;还支持多只相同的蜜蜂机器人编队飞行。 BionicBee 重约 34 克&#xff0c;长 22 厘米…

Redis线程模型及性能优化概述

redis线程模型&#xff1a; 网络模块命令处理 redis的性能&#xff1a; 一个取决于物理内存&#xff0c;另一个是对于socket请求的处理速度。 4.0以前 单线程模式 请求流程&#xff1a;对于一个请求&#xff0c;线程会根据操作产生相应的事件&#xff08;读&#xff0c;写事…

基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的水产养殖系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【MyBatis】进阶使用 (动态SQL)

动态SQL \<if>\<trim>\<where>\<set>\<foreach>\<include> 在填写表单时&#xff0c;有些数据是非必填字段&#xff08;例如性别&#xff0c;年龄等字段&#xff09;&#xff0c;那就需要在接收到参数时判断&#xff0c;根据参数具体的情况…

【知识学习/复习】损失函数篇,包含理解应用与分类:回归、分类、排序、生成等任务

损失函数总结 一、损失函数理解二、不同任务的损失函数的应用1.图像分类2.目标检测3.语义分割4.自然语言处理&#xff08;NLP&#xff09;5.图神经网络&#xff08;GNN&#xff09;6.生成式网络 三、损失函数1. 回归任务损失函数常见损失函数IoU系列损失函数1. IoU损失函数&…

TiDB 利用binlog 恢复-反解析binlog

我们知道TiDB的binlog记录了所有已经执行成功的dml语句&#xff0c;类似mysql binlog row模式 &#xff0c;TiDB官方也提供了reparo可以进行解析binlog&#xff0c;如下所示: [2024/04/26 20:58:02.136 08:00] [INFO] [config.go:153] ["Parsed start TSO"] [ts449…

[C++][数据结构]二叉搜索树:介绍和实现

二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也…

IoT Scenario: Smart Retail System-Multiple Sources and Multiple Terminals

物联网/大数据可视化领域发文可以联系&#xff1a;nascimsina.com IoT Scenario: Smart Retail System Overview The use of IoT in the retail industry enhances customer experiences, optimizes inventory management, and provides valuable insights into consumer beh…

【架构】后端项目如何分层及分层领域模型简化

文章目录 一. 如何分层1. 阿里规范2. 具体案例分析 二. 分层领域模型的转换1. 阿里规范2. 模型种类简化分析 三. 小结 本文描述后端项目中如何进行分层&#xff0c;以及分层领域模型简化 一. 如何分层 1. 阿里规范 阿里的编码规范中约束分层逻辑如下: 开放接口层&#xff1a…

Java全栈开发前端+后端(全栈工程师进阶之路)-环境搭建

在课程开始前我们要配置好我们的开发环境&#xff0c;这里我的电脑太乱了&#xff0c;我使用vm虚拟机进行搭建开发环境&#xff0c;如果有需要环境的或者安装包&#xff0c;可以私信我。 那我们开始 首先我们安装数据库 这里我们使用小皮面板 小皮面板(phpstudy) - 让天下没…

【计算机毕业设计】基于SSM++jsp的社区管理与服务系统【源码+lw+部署文档+讲解】

目录 摘 要 Abstract 第一章 绪论 第二章 系统关键技术 第三章 系统分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3运行可行性 3.1.4法律可行性 3.4.1注册流程 3.4.2登录流程 3.4.3活动报名流程 第四章 系统设计 4.3.1登录模块顺序图 4.3.2添加信息模块顺序图 4.4.1 数据库E-…

【Node.js工程师养成计划】之express框架

一、Express 官网&#xff1a;http://www.expressjs.com.cn express 是一个基于内置核心 http 模块的&#xff0c;一个第三方的包&#xff0c;专注于 web 服务器的构建。 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用&…

使用LocalGPT+cpolar打造可远程访问的本地私有类chatgpt服务

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问&#xff0c;由于localGPT只能通过本地局域网IP地址端口号的形式访问&#xff0c;实现远程访问…

iOS 实现视图遮罩效果

有时候&#xff0c;我们会遇到这种需求&#xff0c;只讲视图的某个部分展示出来 这时候&#xff0c;我们可以通过设置该视图layer.mask layerb来实现&#xff0c;需要注意的是&#xff0c;这里的layerb必须要设置backgroundColor&#xff0c;渐变layer有colors,否则达不到效果…

Java学习3:程序流程控制

Java程序流程控制 1.执行顺序 顺序结构分支顺序 if,switch 循环结构 for ,while ,do-while 2.if分支 三种形式 if(条件表达式){} else if(){} else{}3.switch分支 string week "周一"; switch(week){case "周一":stem.out.println("周一&qu…

UG NX二次开发(C++)-获取模型中所有的拉伸(Extrude)特征

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG 12中创建几个拉伸特征3、UFun中获取对象类型4、通过NXOpen过渡5.测试结果1、前言 在采用UG NX二次开发时,有时需要在模型中获取特定的对象,比如拉伸特征、关联特征等等。但是通过…