简易图书管理系统(面向对象思想)
目录
前言
1.整体思路
2.Book包
2.1Book类
2.2BookList类
3.user包
3.1User类
3.2NormalUser类
3.3AdminUser类
4.operation
4.1IOPeration接口
4.2ExitOperation类
4.3FindOperation类
4.4ShowOperation类
4.5AddOperation类
4.6DelOperation类
4.7BorrowOperation类
4.8ReturnOperation类
5.Text类
前言
该图书管理系统充分展示面向对象思想,是类与对象,封装,继承,多态,抽象类,接口等知识的融合体现。
若有不了解的内容,可以查看本博主的曾写的相关内容。
面向对象程序三大特性一:封装(超详细)_WHabcwu的博客-CSDN博客
面向对象程序三大特性一:多态(超详细)_WHabcwu的博客-CSDN博客
面向对象程序三大特性一:多态(超详细)_WHabcwu的博客-CSDN博客
抽象类的顶级理解_WHabcwu的博客-CSDN博客
接口的顶级理解_WHabcwu的博客-CSDN博客
需求:登录的用户分为普通用户和管理员,实现界面目录的需求(均用姓名索引)。
普通用户登录后界面:

管理员用户登录后界面:

图书管理系统已有图书如下:

1.整体思路
面向对象思想解决问题主要分为这3步:
- 找出其中的所有的对象
- 实现所有的对象
- 完成对象之间的交互
在图书管理系统中我们可以想到这几个对象:书,用户(普通用户和管理员),存放书的书架。
操作太多这里推荐新建将所有的操作都单独封装成一个类。
分为三个包进行实现:
book包里面实现书类和书架类
operation包里实现我们的操作类
user包里实现普通用户类与管理员类

其中所有的操作都实现名为IOperation的接口。便于统一管理(多态的体现)
普通用户和管理员都继承用户User这个父类。
实现所有类如下:

2.Book包
2.1Book类
在这个类实现的是我们图书该有的属性,与相应的构造方法,以及为了方便我们打印而重写的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 void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", "+(isBorrowed==false?"未被借出":"已被借出")+'}';}
}
2.2BookList类
我们需要存放很多Book的数组,操作的数组,加入图书管理系统已有图书。
public class BookList {private Book books[]=new Book[100];private int useSize;public BookList() {this.books[0] = new Book("三国演义","罗贯中",10,"小说");this.books[1] = new Book("西游记","吴承恩",9,"小说");this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");this.useSize = 3;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}public Book getbook(int pose){return books[pose];}public void setbook(int pose,Book book){books[pose]=book;}public Book[] getBooks() {return books;}
}
3.user包
3.1User类
这里的User类是作为NormalUser类与AdminUser类的父类,是一个抽象类。
package user;import book.BookList;
import operation.IOperation;public abstract class User {protected String name;IOperation iOperations[];public User(String name) {this.name = name;}public abstract int menu();public void doOperation(int choice, BookList bookList){iOperations[choice].work(bookList);}}
3.2NormalUser类
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(),new ShowOperation()};}@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 scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}}
3.3AdminUser类
package user;import operation.*;import java.util.Scanner;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.operation
4.1IOPeration接口
会有一个work的抽象方法,参数类型为BookList的
package operation;import book.BookList;public interface IOperation {
void work(BookList bookList);
}
4.2ExitOperation类
用于退出该系统
package operation;import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");}
}
4.3FindOperation类
用于查找图书
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {int size=bookList.getUseSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查询的书名");String name=scanner.nextLine();for (int i = 0; i < size; i++) {Book book = bookList.getbook(i);if(book.getName().equals(name)){System.out.println("找到这本书,信息如下");System.out.println(book);return;}}System.out.println("查无此书");}
}
4.4ShowOperation类
用于展示所有图书
package operation;import book.Book;
import book.BookList;public class ShowOperation implements IOperation {@Overridepublic void work(BookList bookList) {int size=bookList.getUseSize();for (int i = 0; i < size; i++) {Book book = bookList.getbook(i);System.out.println(book);}}
}
4.5AddOperation类
用于添加图书
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation {@Overridepublic void work(BookList bookList) {int size=bookList.getUseSize();if(size==bookList.getBooks().length){System.out.println("书架已满,无法添加图书");return;}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);for (int i = 0; i < size; i++) {if(bookList.getbook(i).getName().equals(name)){System.out.println("该书已有,不再存入");return;}}bookList.setbook(size,book);bookList.setUseSize(size+1);}}
4.6DelOperation类
用于删除图书
package operation;import book.BookList;
import java.util.Scanner;public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner scanner=new Scanner(System.in);System.out.println("请输入要删除书的书名");String name=scanner.nextLine();int size = bookList.getUseSize();int i=0;for (i = 0; i < size; i++) {if(bookList.getbook(i).getName().equals(name)){break;}}if(i==size){System.out.println("你要删除的书不存在");return;}int j=0;for ( j = i; j <size-1; j++) {bookList.setbook(j,bookList.getbook(j+1));}bookList.setbook(j,null);bookList.setUseSize(size-1);System.out.println("删除成功");}
}
4.7BorrowOperation类
package operation;import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner scanner=new Scanner(System.in);System.out.println("请输入要借阅书的书名");int size=bookList.getUseSize();String name=scanner.nextLine();for (int i = 0; i < size; i++) {if(bookList.getbook(i).getName().equals(name)){bookList.getbook(i).setBorrowed(true);System.out.println("成功借出");return;}}System.out.println("你要借的书不存在");}
}
4.8ReturnOperation类
package operation;import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {Scanner scanner=new Scanner(System.in);System.out.println("请输入要还的书的书名");int size=bookList.getUseSize();String name=scanner.nextLine();for (int i = 0; i < size; i++) {if(bookList.getbook(i).getName().equals(name)){bookList.getbook(i).setBorrowed(false);System.out.println("成功归还");return;}}System.out.println("你要还的书不存在");}
}
5.Text类
import java.util.Scanner;import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;public class Text {
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){return new AdminUser(name);}else {return new NormalUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();User user=login();int choice=-1;do{choice=user.menu();user.doOperation(choice,bookList);}while (choice!=0);}
}
以上为我个人的小分享,如有问题,欢迎讨论!!!
都看到这了,不如关注一下,给个免费的赞 ![]()

相关文章:
简易图书管理系统(面向对象思想)
目录 前言 1.整体思路 2.Book包 2.1Book类 2.2BookList类 3.user包 3.1User类 3.2NormalUser类 3.3AdminUser类 4.operation 4.1IOPeration接口 4.2ExitOperation类 4.3FindOperation类 4.4ShowOperation类 4.5AddOperation类 4.6DelOperation类 4.7BorrowOpera…...
C++ 函数模板与类模板
C最重要的特性之一就是代码重用,为了实现代码重用,代码必须具有通用性。通用代码应不受数据类型的影响,并且可以自动适应数据类型的变化。这种程序设计类型称为参数化程序设计。模板是C支持参数化程序设计的工具,通过它可以实现参…...
Tailwind CSS:简洁高效的工具,提升前端开发体验
112. Tailwind CSS:简洁高效的工具,提升前端开发体验 1. 什么是Tailwind CSS? Tailwind CSS是由Adam Wathan、Jonathan Reinink、David Hemphill和Steve Schoger等人共同创建的一种现代CSS框架。与传统的CSS框架不同,Tailwind CS…...
NR CSI(六) CSI reporting using PUCCH
之前NR CSI(二) the workflow of CSI report有对CSI report的相关流程进行介绍,而这篇主要看下CSI reporting over PUCCH的相关规定。 CSI report在PUCCH上传输的场景如上表红色字体,有三种场景,具体的对应的是Periodic 和Semi-Persistent CS…...
论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》
题目:基于Transformer的无监督心电图(ECG)信号异常检测 摘要 异常检测是数据处理中的一个基本问题,它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易,然而ÿ…...
5G上行干扰规避的参数策略
LNR干扰避让 1. 干扰避让特性 D1/D2干扰避让:干扰与非干扰带宽独立测量,避免部分频带受干扰拉低整个带宽MCS,基于测量结果, 用户级自适应调度60/80/100M,躲避干扰频带。 窄带干扰避让:避免部分带宽的干扰对…...
CTF流量题解tcp1
用流量工具进行分析。发现消息长度有点异常。右键TCP跟踪。 ....mos.-mos-.-.mos-.-mos..-.mos..-mos-. 摩斯密码生成-网页工具 (adminun.com)...
Django快速入门
文章目录 一、安装1.创建虚拟环境(virtualenv和virtualenvwrapper)2. 安装django 二、改解释器三、创建一个Django项目四、项目目录项目同名文件夹/settings.py 五、测试服务器启动六、数据迁移七、创建应用八、基本视图1. 返回响应 response2. 渲染模板…...
Python “牵手” 淘宝商品详情数据获取方法,淘宝API申请指南
淘宝详情接口 API 是淘宝开放平台提供的一种 API 接口,它可以帮助开发者获取淘宝商品的详细信息,包括商品的标题、描述、图片等信息。在淘宝电商平台的开发中,淘宝详情接口 API 是非常常用的 API,因此本文将详细介绍淘宝详情接口 …...
OpenScene
paper:OpenScene: 3D Scene Understanding with Open Vocabularies code: https://github.com/pengsongyou/openscene 摘要:传统的3D场景理解方法依赖于带标签的3D数据集,在有监督的情况下为单个任务训练模型。我们提出了OpenScene,一种替代性的方法,模型预测CLIP特征空…...
HDFS中的Trash垃圾桶回收机制
Trash垃圾桶回收机制 文件系统垃圾桶背景功能概述Trash Checkpoint Trash功能开启关闭HDFS集群修改core-site.xml删除文件到trash删除文件跳过从trash中恢复文件清空trash 文件系统垃圾桶背景 回收站(垃圾桶)是windows操作系统里的一个系统文件夹&#…...
segment-anything使用说明
文章目录 一. segment-anything介绍二. 官网Demo使用说明三. 安装教程四. python调用生成掩码教程五. python调用SAM分割后转labelme数据集 一. segment-anything介绍 Segment Anything Model(SAM)根据点或框等输入提示生成高质量的对象遮罩,…...
在魔塔社区搭建通义千问-7B(Qwen-7B)流程
复制以下语句 python3 -m venv myvenvsource myvenv/bin/activatepip install modelscope pip install transformers_stream_generator pip install transformers pip install tiktoken pip install accelerate pip install bitsandbytestouch run.py vi run.py复制下面代码粘…...
Redis 加入服务列表自启动
1、下载reids windows版本,选择zip格式下载 2、解压zip,并进入路径; 3、命令提示符(cmd) 进入解压后的路径后,输入指令:redis-server --service-install redis.windows.conf; 4、如…...
MyCat管理及监控——zookeeper及MyCat-web安装
1.MyCat管理 2.MyCat-eye 3.zookeeper安装 第一步:解压 第二部: 切换目录,创建data文件夹 第三步:修改zookeeper配置文件 这样zookeeper安装及配置就完成了 4.MyCat-web安装 注意mycat-web要与zookeeper关联,…...
基于spring boot的餐饮管理系统java酒店饭店菜谱 jsp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于spring boot的餐饮管理系统j 系统1权限ÿ…...
JVM分析工具JProfiler介绍及安装
目录 一、什么是JProfiler? 二、JProfiler 功能结构 1、分析代理 2、记录数据 3、快照 三、安装 一、什么是JProfiler? JProfiler是一个专业的工具,用于分析运行中的JVM内部发生的事情。当您的生产系统出现问题时,您可以…...
Nginx使用多个.conf文件配置虚拟主机server
使用 Nginx 配置多个虚拟机 server 服务。通常做法可以直接在 nginx.conf 文件中添加即可,如下事例: # nginx.confworker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/octet-stream…...
nginx编译以及通过自定义生成证书配置https
1. 环境准备 1.1 软件安装 nginx安装编译安装以及配置https,需要gcc-c pcre-devel openssl openssl-devel软件。因此需要先安装相关软件。 yum -y install gcc-c pcre-devel openssl openssl-devel wgetopenssl/openssl-devel:主要用于nginx编译的htt…...
OpenAI 已为 GPT-5 申请商标,GPT-4 发布不到半年,GPT-5 就要来了吗?
据美国专利商标局(USPTO)信息显示,OpenAI已经在7月18日申请注册了“GPT-5”商标。 在这份新商标申请中,OpenAI将“GPT-5”描述为一种“用于使用语言模型的可下载计算机软件”。 继GPT-4发布之后,它预计将成为OpenAI下一…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
