五分钟”手撕“图书管理系统

前言:

图书馆管理系统需要结合JavaSE的绝大部分知识,是一个很好的训练项目。

为了让大家更加方便的查阅与学习,我把代码放开头,供大家查询。

还有对代码的分析,我将以类为单位分开讲解。

目录

全部代码 

Main类 

User类 

BookList类 

Book类 

NormalUser类 


 

全部代码 

/*一共有三个包*///User包
//User.java
package user;
import Book.BookList;
import Operation.IOparetion;public abstract class User {protected String name;protected IOparetion[] iOparetions;public User(String name) {this.name = name;}public abstract int menu();public void doIOparetion(int chioce, BookList bookList){this.iOparetions[chioce].work(bookList);}
}//User包
//NormalUser.java
package user;
import Operation.*;
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOparetions= new IOparetion[] {new ExitOparetion(),new FindOparetion(),new BorrowedOparetion(),new ReturnOparetion()};}@Overridepublic 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;}
}//User包
//Administrators.java
package user;
import Operation.*;
import java.util.Scanner;public class Administrators extends User {public Administrators(String name) {super(name);this.iOparetions = new IOparetion[]{new ExitOparetion(),new FindOparetion(),new AddOparetion(),new DelOparetion(),new ShowOparetion()};}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;}
}//Book包
//Book.java
package Book;public class Book {private String name;private String author;private int price;private String type;private boolean isLend;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 isLend() {return isLend;}public void setLend(boolean lend) {isLend = lend;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isLend==true?"已借出":"未借出")+'}';}
}//Book包
//BookList.java
package Book;public class BookList {private Book[] book=new Book[10];private int usedSize;public Book getBook(int pos) {return book[pos];}public void setBook(int pos,Book book) {this.book[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public BookList() {book[0]=new Book("西游记","吴承恩",19,"小说");book[1]=new Book("三国演义","罗贯中",36,"小说");book[2]=new Book("红楼梦","曹雪芹",13,"小说");this.usedSize=3;}public boolean isFull(){if(usedSize==book.length){return true;}return false;}
}//Oparetion包
//Ioparetion.java
package Operation;import Book.BookList;public interface IOparetion {void work(BookList bookList);
}//Oparetion包
//AddOparetion.java
package Operation;import Book.Book;
import Book.BookList;
import java.util.Scanner;public class AddOparetion implements IOparetion {@Overridepublic void work(BookList bookList) {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);if(bookList.isFull()){System.out.println("书架满了,借阅失败");return;}bookList.setBook(bookList.getUsedSize(), book);bookList.setUsedSize(bookList.getUsedSize()+1);System.out.println("添加成功");}
}//Oparetion包
//BorrowedOparetion.java
package Operation;import Book.BookList;
import java.util.Scanner;public class BorrowedOparetion implements IOparetion{@Overridepublic void work(BookList bookList) {System.out.println("请输入你要找的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();for(int i=0;i<bookList.getUsedSize();i++){if(name.equals(bookList.getBook(i).getName())){bookList.getBook(i).setLend(true);System.out.println("借阅成功");return;}}System.out.println("借阅失败");}}//Oparetion包
//DelOparetion.java
package Operation;import Book.BookList;
import java.util.Scanner;public class DelOparetion implements IOparetion{@Overridepublic void work(BookList bookList) {System.out.println("请输入你要删除的书籍名字");Scanner scanner=new Scanner(System.in);String s=scanner.nextLine();int pos=-1;int i=0;for (;i<bookList.getUsedSize();i++){if(s.equals(bookList.getBook(i))){pos=i;}if(i>=bookList.getUsedSize()){System.out.println("没有你要找的书");return;}}for(int j=i;i<bookList.getUsedSize()-1;i++){bookList.setBook(j,bookList.getBook(j+1));}bookList.setBook(bookList.getUsedSize(), null);bookList.setUsedSize(bookList.getUsedSize()-1);System.out.println("删除成功");}
}//Oparetion包
//ExitOparetion.java
package Operation;
import Book.BookList;public class ExitOparetion implements IOparetion {@Overridepublic void work(BookList bookList) {System.out.println("退出系统中....");for(int i=0;i<bookList.getUsedSize()-1;i++){bookList.setBook(i,null);}System.exit(0);}
}//Oparetion包
//FindOparetion.java
package Operation;import Book.BookList;
import java.util.Scanner;public class FindOparetion implements IOparetion{@Overridepublic void work(BookList bookList) {System.out.println("请输入你要找的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();for(int i=0;i<bookList.getUsedSize();i++){if(name.equals(bookList.getBook(i).getName())){System.out.println("找到了,下标为:"+i);System.out.println(bookList.getBook(i));return;}}System.out.println("没找到");}
}//Oparetion包
//ReturnOparetion.java
package Operation;import Book.BookList;
import java.util.Scanner;public class ReturnOparetion implements IOparetion{@Overridepublic void work(BookList bookList) {Scanner scanner=new Scanner(System.in);System.out.println("请输入你要归还的书名");String s=scanner.nextLine();for (int i = 0; i < bookList.getUsedSize()-1; i++) {if(s.equals(bookList.getBook(i).getName())){bookList.getBook(i).setLend(false);System.out.println("归还成功");return;}}System.out.println("归还失败,没有你要归还的书");}
}//Oparetion包
//ShowOparetion.java
package Operation;
import Book.BookList;public class ShowOparetion implements IOparetion{@Overridepublic void work(BookList bookList) {for(int i=0;i<bookList.getUsedSize();i++){System.out.println(bookList.getBook(i));}}}

 首先,我们需要打个框架出来,由于java是一门面向对象的编程,所以我们应该要多考虑对象,而不是过程。

我将它分为三个包:User、Book、operation包,其实对象有:书架、书、用户、管理员。

总体请看下图:

 

这里我主要讲解大致结构和细微的细节 ,因为方法的思路在数据结构讲解更加清晰

Main类 

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){NormalUser normalUser=new NormalUser(name);return normalUser;}else{Administrators administrators=new Administrators(name);return administrators;}}public static void main(String[] args) {BookList bookList=new BookList();User user=login();while (true){int ret=user.menu();user.doIOparetion(ret,bookList);}}
}

 上述代码中:

Scanner来new一个对象来输入,int一个choice来接收选1还是2,选择是管理人还是普通用户。

由于要返回一个对象,所以login的返回值是user类型的,user与管理员和普通用户是父子关系,在main中用user类型接收,属于向上转型(好处就是发生多态)

User类 

package user;
import Book.BookList;
import Operation.IOparetion;public abstract class User {protected String name;protected IOparetion[] iOparetions;public User(String name) {this.name = name;}public abstract int menu();public void doIOparetion(int chioce, BookList bookList){this.iOparetions[chioce].work(bookList);}
}

 上述代码中:

User作为父类,被管理员和普通用户继承,被abstract修饰主要是为了menu这个方法被继承,实现多态

IOparetion是一个接口,是为了被那些add和del等等方法实现的,还是实现多态,

它现在作为一个数组来接收,是为了存放这些方法,这样就不用一个个在用户或者管理员里面书写了,可以直接定义为一个类(这也是为什么方法可以另外书写的原因),这体现了面向对象的特点,大大缩短了工程量和分模块的简洁性(即使下次有人需要用,不需要再写,直接调用就好了)。

BookList类 

package Book;public class BookList {private Book[] book=new Book[10];private int usedSize;public Book getBook(int pos) {return book[pos];}public void setBook(int pos,Book book) {this.book[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public BookList() {book[0]=new Book("西游记","吴承恩",19,"小说");book[1]=new Book("三国演义","罗贯中",36,"小说");book[2]=new Book("红楼梦","曹雪芹",13,"小说");this.usedSize=3;}public boolean isFull(){if(usedSize==book.length){return true;}return false;}
}

 对于上述代码:

由于java是面向对象编程,所以对于一些信息不需要用户来知道内部是怎么实现的,所以用private修饰,这样的话需要set和get方法来获取,这样之后的代码都需要调用set和get来获取或者是赋值。

BookList是书架,所以里面是摆书的,所以用Book类型作为数组,来收取book。可以放很多本。

usedsize是有效书籍数,就是记录里面有多少本。

Book类 

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

对于上述代码:

Book是类,它代表的是一本书,所以你需要定义名字作者价格什么什么的。

也是利用封装,只把必要的信息给用户,所以用privat密封起来,更加安全一点,所以需要set和get方法。

这里的toString方法里面有个三目操作符,如果isLend被借出的话,就是true,就会打印已借出,否则为借出。 

NormalUser类 

package user;
import Operation.*;
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOparetions= new IOparetion[] {new ExitOparetion(),new FindOparetion(),new BorrowedOparetion(),new ReturnOparetion()};}@Overridepublic 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;}
}

对于上述代码:

如果继承了父类,使用构造方法时候需要先把父类的构造方法实现。

因为IOparetion是user里面的,user被普通用户继承,所以可以直接访问把他变成一个数组,这样就可以存方法了,不用在这普通用户这个类里一个一个方法写,直接脱离出来,非常充分体现了面向对象的特点!

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

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

相关文章

如何排查hpet导致的CPU高负载——《OceanBase诊断系列》之十

1. 前言 我在OceanBase问答社区协助用户排查了一个CPU占用率过高的问题&#xff0c;帖子原文是&#xff1a; 《刚刚新安装的OceanBase集群&#xff0c;没有任何数据&#xff0c;CPU占用非常高&#xff0c;这正常吗&#xff1f;》。从这个场景出发&#xff0c;来分享相关的诊断…

Rabbitmq-Windows 安装

第一步&#xff1a;下载并安装erlang &#xff11;.原因&#xff1a;RabbitMQ服务端代码是使用并发式语言Erlang编写的&#xff0c;安装Rabbit MQ的前提是安装Erlang &#xff12;.下载地址&#xff1a;http://www.erlang.org/downloads 3.双击&#xff0c;点next就可以 4.选…

Android 观察者模式(OBSERVER)应用详解

文章目录 1、观察者模式设计初衷1.1. 解耦对象之间的依赖关系1.2. 允许动态的依赖关系1.3. 自动通知和更新1.4 设计初衷的详细说明1. 对象之间的解耦2. 动态依赖关系3. 自动更新 2、实现细节2.1. Subject 接口和实现2.2. Observer 接口和实现2.3. 主类 3、主要角色4、关系示意图…

【minio】minio文件访问不到问题记录

问题描述&#xff1a; 项目上上传了logo&#xff0c;但是无法回写logo&#xff0c;但是文件minio路径已经返回&#xff0c;并且到minio服务器上也能下载文件&#xff1b; 解决方案&#xff1a; 1.排查Nginx的代理的minio是否正确 2.登录minio服务查一下文件路径policy是否设置访…

ubuntu下分屏工具tmux常用操作

参考&#xff1a;基于 Tmux 的多会话终端管理示例 | Linux 中国 - 知乎 安装 sudo apt-get install tmux Tmux 默认所有命令的前置命令都是 Ctrlb 创建会话&#xff1a;tmux new -s 会话名 查看 Tmux 会话清单: tmux ls #下面的-->表示然后 水平切割窗格:Ctrlb-->&…

PWA离线优先策略:提升用户体验的关键步骤

Progressive Web Apps (PWA) 的离线优先策略是通过Service Worker和Cache API实现的&#xff0c;它允许在没有网络连接时仍然可以访问网站的部分或全部内容。 2500G计算机入门到高级架构师开发资料超级大礼包免费送&#xff01; 1. 创建Service Worker注册文件&#xff08;se…

从零开始学Vue3--模板语法

Vue的核心是MVVM,也就是数据能够影响界面&#xff0c;界面也能影响数据&#xff0c;什么意思呢&#xff1f;比如有个输入框&#xff0c;它绑定的变量name,如果你改变了name的值&#xff0c;输入框显示的值就会变化&#xff0c;如果用户在输入框里面输东西,name对应的值也会变化…

AI预测福彩3D采取888=3策略+杀断组+杀和尾缩水测试5月24日预测第1弹

哈喽&#xff0c;各位亲爱的小伙伴&#xff0c;在发布本期预测结果之前&#xff0c;先对最近的这套算法测试做一下总结。 最近的一套算法采用了88723的容差策略&#xff0c;关于容差策略相信大家都比较清楚&#xff1a;容差可以最大限度的保证初始大底中包含中奖号码&#xff0…

揭秘Python:对象类型打印

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Python数据类型简介 在Python的世界中&#xff0c;了解你正在处理的数据类型是至关重要的。Python提供了多种内置数据类型&#xff0c;包括数字&#xff08;整数和浮点数&#xff09;、字符串、列表、元组、字典…

解决:error: failed to push some refs to ‘https://gitee.com/***/***.git‘(高效快速)

解决方案&#xff1a; git pull --rebase origin master 具体原因&#xff1a; 主要原因是gitee(github)中的README.md文件不在本地代码目录中 要执行git pull --rebase origin master命令将README.md拉到本地 然后就可以执行git push啦 写在最后&#xff1a; 要是问题得到…

服务开机自启

目录 1、启动脚本 1)新建sh脚本 2)日志备份 2、自启动Service 1)编写Service 1)含义: 3、调整启动脚本 1)替换start():

Leetcode 3152. Special Array II

Leetcode 3152. Special Array II 1. 解题思路2. 代码实现 题目链接&#xff1a;3152. Special Array II 1. 解题思路 这一题的话思路上就是分堆&#xff0c;使用贪婪算法找到每一个元素所在的最长special子序列&#xff0c;然后判断query的首尾元素是不是属于同一个special…

51-指针_野指针,指针运算

51-1 野指针 51-1-1 什么是野指针 概念&#xff1a;野指针就是指针指向的位置是不可知的&#xff08;随机的、不正确的、没有明确限制的) 没有初始化 int main() {int* p;//p没有初始化&#xff0c;就意味着没有明确的指向//一个局部变量不初始化的话&#xff0c;放的是随机…

MySQL 插入数据的时候自动忽略重复数据

MySQL中插入数据&#xff0c;如果插入的数据在表中已经存在&#xff08;主键或者唯一键已存在&#xff09;&#xff0c;使用insert into语法的时候&#xff0c;如果遇到重复数据&#xff0c;会直接报错&#xff0c;导致事务回滚&#xff0c;所有插入数据&#xff0c;全部失败。…

TCP/IP体系模型简介

一、TCP/IP 概念 TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff09;&#xff1a; 是一种面向连接的、可靠的传输层协议。通过三次握手建立连接&#xff0c;确保连接的可靠建立。对数据进行有序传输&#xff0c;并具有确认机制和重传机制来保证数据的完整…

SpringBoot多数据源启动出现循环依赖问题

在使用SpringBoot的项目中&#xff0c;如果是有使用多数据源&#xff0c;可能会存在启动时数据源循环依赖的报错&#xff0c;是因为使用了多数据源注入&#xff0c;和DataSourceAutoConfiguration数据源自动配置的DataSourceInitializerInvoker互相产生循环依赖导致。 这种错误…

03-01-Vue组件的定义和注册

前言 我们接着上一篇文章02-Vue实例的生命周期函数 来讲。 下一篇文章 03-02-Vue组件之间的传值 什么是组件 组件&#xff1a; 组件的出现&#xff0c;就是为了拆分Vue实例的代码量的&#xff0c;能够让我们以不同的组件&#xff0c;来划分不同的功能模块&#xff0c;将来我们…

Java_网络编程

网络编程 定义&#xff1a; 网络编程就是计算机跟计算机之间通过网络进行数据传输 常见的软件架构&#xff1a; 1.C/S&#xff08;Client/Server&#xff09;&#xff1a;客户端/服务器模式 2.B/S&#xff08;Browser/Server&#xff09;&#xff1a;浏览器/服务器模式 区别…

安全系列---入门

目录 xss注入问题Authenticator认证器 xss注入问题 现象&#xff1a;前端显示内容非预期原因&#xff1a;反射型注入和存储型注入&#xff0c;本质都是利用输入框输入一段js代码。解决&#xff1a;利用html的转义解析&#xff0c;当浏览器遇到HTML转义符时&#xff0c;它会将其…

深入理解MySQL:查询表的历史操作记录

摘要&#xff1a;在数据库管理中&#xff0c;了解如何查询表的历史操作记录对于追踪数据变更、审计数据以及恢复误操作至关重要。本文将深入探讨MySQL中查询表的历史操作记录的方法&#xff0c;并提供多个实例以帮助读者更好地理解和应用这一技术。 引言 在数据库管理中&#…