JAVA实现图书管理系统(思路,和完整代码)

因为文件过多每个文件之间的关系如下(每个文件中都只有一个类):

因为JAVA属于面向对象编程的语言,所以我们想要实现图书管理系统就得分以下几步:

  • 找出其中的所有的对象
  • 实现所有的对象
  • 完成对象之间的交互

在图书管理系统中我们可以想到这几个对象用户(用户还可以分为普通用户管理员),还得有存放书的书架

找出对象之后我们将它们分别放在两个包中(一个放书和书架,另一个放普通用户和管理员)。

我们可以在书架类中创建一个书的数组,这样就相当于把书放在了书架中。

package book;public class BookList {public Book[] books;//书架public int numBooks;//书架实际存放的书的本书
}

此时你还可以将书类中的属性都用private修饰因为后面我们的所有操作都是针对书架(如果用private修饰就需要对每个属性都实现get 和 set 方法)。

书类包含以下属性:

String name;

String author;

int money;

String type;

boolean isBorrow;

以下方法:

public Book(){};
public Book(String name, String author, int money, String kind) {}
public String getName() {}public void setName(String name) {}public String getAuthor() {}public void setAuthor(String author) {}public int getMoney() {}public void setMoney(int money) {}public String getType() {}public void setType(String kind) {}public boolean getBorrow() {}public void setBorrow(boolean borrow) {}@Override
public String toString() {return  "name='" + name + '\'' +", author='" + author + '\'' +", money=" + money +", kind='" + type + '\'' +", 状态:"+(isBorrow == false ? "未被借出" : "已被借出");
}

此处重写toString是为了可以直接使用System.out.println();输出book

因为普通用户和管理员都属于用户所以可与使用继承让 普通用户管理员继承用户这个父类。

管理员权限:                                                        普通用户权限:

                                                 

 

这样我们就可以利用多态的思想,创建一个用户类,由于引用的对象不同调用相同的方法结果也不相同。

可是现在又有一个新问题就是管理员和普通用户所打印出来的菜单是不同的,所以就不能在父类中实现,所以父类就不能是一个普通的父类,它必须是一个抽象类

因为用户的操作太多而且有重复方法所以这里推荐新建一个包将其全部放入新的包中,并将所有的操作都单独封装成一个类。

操作属于用户所以写成如下格式:

//用户类
abstract public class User {protected String name;protected Work[] work;//存放用户所有的操作public int counst; //work中的元素个数}
//管理员
public class AdvancedUser extends User{public AdvancedUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};this.counst = 5;}}
//普通用户
public class NormalUser extends User {public NormalUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new RetOperation(),};this.counst = 4;}}

 这样就可以用数组来调用方法

public void operation(int choice, BookList bookList){work[choice].work(bookList);}

完整代码:

package main;import book.BookList;
import user.AdvancedUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User login(){Scanner in = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = in.nextLine();System.out.println("请选择你的身份:1.管理员    0.普通用户");if (in.nextInt() == 1){return new AdvancedUser(name);}else {return new NormalUser(name);}}public static void main(String[] args) {BookList bookList = new BookList();User user = login();while(true){int choice;do{choice = user.menu();}while(choice < 0 || choice >= user.counst);user.operation(choice, bookList);}}
}
package book;public class Book {private String name;private String author;private int money;private String type;private boolean isBorrow;public Book(){};public Book(String name, String author, int money, String kind) {this.name = name;this.author = author;this.money = money;this.type = kind;}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 getMoney() {return money;}public void setMoney(int money) {this.money = money;}public String getType() {return type;}public void setType(String kind) {this.type = kind;}public boolean getBorrow() {return isBorrow;}public void setBorrow(boolean borrow) {isBorrow = borrow;}@Overridepublic String toString() {return  "name='" + name + '\'' +", author='" + author + '\'' +", money=" + money +", kind='" + type + '\'' +", 状态:"+(isBorrow == false ? "未被借出" : "已被借出");}
}
package book;public class BookList {public Book[] books;//书架public int numBooks;//书架实际存放的书的本书public BookList() {this.books = new Book[10];//默认书架存放两本书this.books[0] = new Book("西游记","吴承恩",39,"小说");this.books[1] = new Book("红楼梦","曹雪芹",39,"小说");this.numBooks = 2;}}

 

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation extends Work{@Overridepublic void work(BookList bookList) {Scanner in = new Scanner(System.in);bookList.books[bookList.numBooks] = new Book();System.out.print("请输入书名:");bookList.books[bookList.numBooks].setName(in.nextLine());System.out.print("请输入作者:");bookList.books[bookList.numBooks].setAuthor(in.nextLine());System.out.print("请输入所属书类:");bookList.books[bookList.numBooks].setType(in.nextLine());System.out.print("请输入书价:");bookList.books[bookList.numBooks].setMoney(in.nextInt());bookList.numBooks++;}
}

 

package operation;import book.BookList;import java.util.Scanner;public class BorrowOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())) {if (bookList.books[i].getBorrow() == false){System.out.println("借阅成功");bookList.books[i].setBorrow(true);return;}else{System.out.println("该书已被借出");return;}}}System.out.println("未收录该书");}
}
package operation;import book.BookList;import java.util.Scanner;public class DelOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())){int j = 0;for (j = i; j < numBooks-1; j++) {bookList.books[j] = bookList.books[j + 1];}bookList.books[j] = null;bookList.numBooks--;return;}}}
}
package operation;import book.BookList;public class ExitOperation extends Work{@Overridepublic void work(BookList bookList) {System.exit(0);}
}

 

package operation;import book.BookList;import java.util.Scanner;public class FindOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())) {System.out.println(bookList.books[i]);return;}}System.out.println("未收录该书");}
}
package operation;import book.BookList;import java.util.Scanner;public class RetOperation extends Work{@Overridepublic void work(BookList bookList) {int numBooks = bookList.numBooks;Scanner in = new Scanner(System.in);System.out.print("请输入书名:");String name = in.nextLine();for (int i = 0; i < numBooks; i++) {if (name.equals(bookList.books[i].getName())) {if (bookList.books[i].getBorrow()){System.out.println("归还成功");bookList.books[i].setBorrow(false);return;}else{System.out.println("该书未被借出");return;}}}System.out.println("未收录该书");}
}
package operation;import book.BookList;public class ShowOperation extends Work{@Overridepublic void work(BookList bookList) {for (int i = 0; i < bookList.numBooks; i++) {System.out.println(bookList.books[i]);}}
}
package operation;import book.BookList;abstract public class Work {abstract public void work(BookList bookList);
}
package user;import operation.*;import java.util.Scanner;public class AdvancedUser extends User{public AdvancedUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};this.counst = 5;}@Overridepublic int menu() {System.out.println("###########################");System.out.println(" Hello " + "AdvancedUser:" + this.name);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 in = new Scanner(System.in);return in.nextInt();}
}

 

package user;import operation.*;import java.util.Scanner;public class NormalUser extends User {public NormalUser(String name){this.name = name;this.work = new Work[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new RetOperation(),};this.counst = 4;}@Overridepublic int menu() {System.out.println("###########################");System.out.println(" Hello " + "NormalUser:" + this.name);System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("###########################");System.out.println("请选择你的操作:");Scanner in = new Scanner(System.in);return in.nextInt();}
}
package user;import book.BookList;
import operation.Work;abstract public class User {protected String name;protected Work[] work;//存放用户所有的操作public int counst; //work中的元素个数abstract public int menu();public void operation(int choice, BookList bookList){work[choice].work(bookList);}
}

运行结果:

 

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

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

相关文章

网络安全 Day30-运维安全项目-堡垒机部署

运维安全项目-堡垒机部署 1. 运维安全项目-架构概述2. 运维安全项目之堡垒机2.1 堡垒机概述2.2 堡垒机选型2.3 环境准备2.4 部署Teleport堡垒机2.4.1 下载与部署2.4.2 启动2.4.3 浏览器访问teleport2.4.4 进行配置2.4.5 安装teleport客户端 2.5 teleport连接服务器 1. 运维安全…

【个人记录】CentOS7 编译安装最新版本Git

说明 使用yum install git安装的git版本是1.8&#xff0c;并不是最新版本&#xff0c;使用gitlab-runner托管时候会拉项目失败&#xff0c;这里使用编译源码方式安装最新版本的git。 基础环境安装 echo "nameserver 8.8.8.8" >> /etc/resolv.conf curl -o /…

算法通关村——二分查找在拓展中的应用

1. 山脉数组的峰顶索引 山脉数组的峰顶索引 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3 存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < … arr[i-1] < arr[i] arr[i] > arr[i1] >…

React Dva项目 简单引入models中的所有JS文件

我们前面接触的 Dva项目 models目录下的文件还要一个一个引入 其实体验并不是很好 而且如果项目很大那就比较麻烦了 我们可以在 models 下创建一个 index.js 文件 编写代码如下 const context require.context("./", false, /\.js$/); export default context.key…

Linux目录结构

/bin&#xff1a; bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a; 这里存放的是启动 Linux 时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev &#xff1a; dev 是 Device(设备) 的缩写, 该目录下存放的…

【LeetCode】数据结构题解(10)[有效的括号]

有效的括号 &#x1f609; 1.题目来源&#x1f440;2.题目描述&#x1f914;3.解题思路&#x1f973;4.代码展示 &#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1…

为什么我们需要加快推进数字孪生技术?

数字孪生技术以其强大的潜力和应用前景&#xff0c;引起了各行各业的广泛关注和热切期待。那么&#xff0c;究竟为什么要加快推进数字孪生技术呢&#xff1f; 首先&#xff0c;数字孪生技术能够实现现实世界与虚拟世界的无缝连接&#xff0c;为各行业带来了前所未有的创新机遇…

vue SKU已知sku.tree算出sku.list类目值和id

已知sku.tree算出sku.list类目值和id <van-skuref"sku"v-model"showBase":close-on-click-overlay"closeOnClickOverlay":goods"skuData.goods_info":goods-id"skuData.goods_id":hide-stock"skuData.sku.hide_stoc…

css在线代码生成器

这里收集了许多有意思的css效果在线代码生成器适合每一位前端开发者 布局&#xff0c;效果类&#xff1a; 网格生成器https://cssgrid-generator.netlify.app/ CSS Grid Generator可帮助开发人员使用CSS Grid创建复杂的网格布局。网格布局是创建Web页面的灵活和响应式设计的强…

分布式应用:Zabbix自定义监控模板

目录 一、理论 1.zabbix监控模板 2.在客户端创建自定义 key 3.在 Web 页面创建自定义监控项模板 4.设置邮件报警 二、实验 1.在客户端创建自定义 key 2.在 Web 页面创建自定义监控项模板 3.设置邮件报警 三、问题 1.查看动作发送邮件失败 四、总结 一、理论 1.zab…

Django Rest_Framework(二)

文章目录 1. http请求响应1.1. 请求与响应1.1.1 Request1.1.1.1 常用属性1&#xff09;.data2&#xff09;.query_params3&#xff09;request._request 基本使用 1.1.2 Response1.1.2.1 构造方式1.1.2.2 response对象的属性1&#xff09;.data2&#xff09;.status_code3&…

Python中的PDF文本提取:使用fitz和wxPython库(带进度条)

引言&#xff1a; 处理大量PDF文档的文本提取任务可能是一项繁琐的工作。本文将介绍一个使用Python编写的工具&#xff0c;可通过简单的操作一键提取大量PDF文档中的文本内容&#xff0c;极大地提高工作效率。 import wx import pathlib import fitzclass PDFExtractor(wx.Fr…

[Vulnhub] matrix-breakout-2-morpheus

目录 <1> 信息收集 <2> getshell <3> Privilege Escalation&#xff08;提权&#xff09; <1> 信息收集 nmap -sP 192.168.236.0/24 扫描一下靶机ip 靶机ip: 192.168.236.154 nmap -A -p 1-65535 192.168.236.154 扫描一下靶机开放哪些服务 开放…

IMV8.0

一、背景内容 经历了多个版本&#xff0c;基础内容在前面&#xff0c;可以使用之前的基础环境&#xff1a; v1&#xff1a; https://blog.csdn.net/wtt234/article/details/132139454 v2&#xff1a; https://blog.csdn.net/wtt234/article/details/132144907 v3&#xff1a; h…

无涯教程-Lua - nested语句函数

Lua编程语言允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。 nested loops - 语法 Lua中嵌套for循环语句的语法如下- for init,max/min value, increment dofor init,max/min value, incrementdostatement(s)endstatement(s) end Lua编程语言中的…

使用TDOSCommand调用Powershell脚本对进程进行操作

列出当前运行的进程&#xff1a; varPowerShellPath, ScriptPath, CommandLine: string; beginMemo6.Clear;PowerShellPath : powershell.exe ; // 假设 PowerShell 可执行文件在系统环境变量中// 构造命令行参数CommandLine : Get-Process | Select-Object Name,Id;// 设置命…

Python-OpenCV 图像的基础操作

图像的基础操作 获取图像的像素值并修改获取图像的属性信息图像的ROI区域图像通道的拆分及合并图像扩边填充图像上的算术运算图像的加法图像的混合图像的位运算 获取图像的像素值并修改 首先读入一副图像&#xff1a; import numpy as np import cv2# 1.获取并修改像素值 # 读…

国内大模型在局部能力上已超ChatGPT

中文大模型正在后来居上&#xff0c;也必须后来居上。 数科星球原创 作者丨苑晶 编辑丨大兔 从GPT3.5彻底出圈后&#xff0c;大模型的影响力开始蜚声国际。一段时间内&#xff0c;国内科技公司可谓被ChatGPT按在地上打&#xff0c;毫无还手之力。 彼时&#xff0c;很多企业…

STM32 低功耗学习

STM32 电源系统结构介绍 电源系统&#xff1a;VDDA供电区域、VDD供电区域、1.8V供电区域、后备供电区域。 器件的工作电压&#xff08;VDD&#xff09;2.0~3.6V 为了提高转换精度&#xff0c;给模拟外设独立供电。电压调节器为1.8V供电区域供电&#xff0c;且1.8V供电区域是电…

【基于IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建逻辑回归鸢尾花分类预测模型】

逻辑回归进行鸢尾花分类的案例 背景说明&#xff1a; 基于IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建逻辑回归鸢尾花分类预测模型&#xff0c;这是一个分类模型案例&#xff0c;通过该案例&#xff0c;可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBui…