JAVA实现图书管理系统(初阶)

一.抽象出对象:

1.要有书架,图书,用户(包括普通用户,管理员用户)。根据这些我们可以建立几个包,来把繁杂的代码分开,再通过一个类来把这些,对象整合起来实现系统。说到整合,肯定缺不了,相关接口,我们再定义一个,放接口,和扩展这个接口的方法。

如图:

二.构思:

1.先在书架类上,初始化好默认书籍,其他构造方法(如:getBook,setBook(在具体的下标,放书和返回书)),具体,在写实现接口的方法时,来增加。

public class BookList {//组合的方式,初始化书架private Book[] books = new Book[10];private int usedSize;//实际放的,书的个数//初始化书架(放书)public BookList() {this.books[0] = new Book("三国演义", "罗贯中", 12, "小说");this.books[1] = new Book("红楼梦", "曹雪芹", 13, "小说");this.books[2] = new Book("西游记", "吴承恩", 14, "小说");this.usedSize = 3;}//返回一本,pos(要找的书)下标的书public Book getBook(int pos) {return books[pos];}//插入一本书的方法(相当于,要初始化好,书架原来已有的书)public void setBook(int pos, Book books) {this.books[pos] = books;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book[] getBooks() {return books;}public void setBooks(Book[] books) {this.books = books;}
}

2.在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*/'}';}
}

3.在User类中,定义好name和,相关构造方法,以及接口命名的数组,为后面,到达调用,扩展了接口的类,里的方法,做铺垫。

public abstract class User {protected String name;//定义,接口命名,类型的数组,后续配合,// 【return new AdminUser(name);】就可以看出,再加上接口调用的方法,就知道,操作了哪一个方法protected IOperation[] iOperations;//要根据子类,来初始化,父类成员变量public User(String name) {this.name = name;}public abstract int menu();//这里封装一个方法,提供给,Main调用。public void DoIOperation(int choice, BookList bookList) {//这里,iOperations数组,里有我们要的对象,通过,数组里的对象,调用接口里的方法iOperations[choice].work(bookList);}
}

4.管理员类中(AdminUser)和普通用户类中(NormalUser)继承了user类,初始化好系统菜单,相关构造方法。(这个构造方法很关键,用接口作为数组相当于实例化了,扩展了接口的类,的方法,达到调用系统具体方法的作用 

public class NormalUser extends User{public NormalUser(String name) {super(name);//通过【return new AdminUser(name);】,再加上实现接口的方法,就知道,操作了哪一个方法//登录界面,选择了哪个,角色(NormalUser)或者(AdminUser),this就是哪个的引用this.iOperations = new IOperation[] {//这些对象都实现了,iOperations接口,所以不会报错//下面相当于实例化了,扩展了接口的类,的方法,达到调用系统具体方法的作用new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation(),};}public int menu() {System.out.println("欢迎" + this.name + "使用图书系统");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;}}

5.在Main类中写好,登录界面,及整合一下,如何实例化对象,来操作系统。

 public static void main(String[] args) {//实例化书架BookList bookList = new BookList();//通过返回值,向上转型,确定用户//这里的user是,返回的(AdminUser),或者(NormalUser)User user = login();while (true) {//然后,通过返回信息,调用恰当的菜单int choice = user.menu();//发生了,动态绑定/*** 根据choice,返回值看看,调用了哪个方法** 1.哪个对象?* 答:User user = login();** 2.哪个方法?-》进一步,还要确定,当前对象,包含了这些方法*答:在构造方法【return new AdminUser(name)】运行时,会初始化好,对应的操作对象。** 注意:后面通过父类对象,调用方法,(int choice = user.menu();),通过choice判断* 调用了,哪个方法 ,接下来就要对,父类,进行操作*/user.DoIOperation(choice, bookList);}}}

6.初始化好,接口和,菜单里操作系统的work方法(实现了这个接口的,类就是,每个操作系统的方法)

public interface IOperation {//这个接口,有操作书架的方法,在其他类实现,就可以,操作性的区分,不同用户的方法public void work(BookList bookList);
}

7.接下来就是实现了,接口的每一个类每个操作系统的方法

以下是管理员菜单方法:

(1).查找图书:

public class FindOperation implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("查找图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的图书");String name = scanner.nextLine();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("没有你要找的书...");}
}

(2).新增图书:

public class AddOperation implements IOperation{@Overridepublic void work(BookList bookList) {//1.判断书架(数组)是否满了int currentSize = bookList.getUsedSize();if (currentSize == bookList.getBooks().length) {System.out.println("该书架满了,不能放了");return;}//2.构建对象Scanner scanner = new Scanner(System.in);System.out.println("请输入新增的书名");String name = scanner.nextLine();System.out.println("请输入新增的作者");String author = scanner.nextLine();System.out.println("请输入新增的价格");int price = scanner.nextInt();System.out.println("请输入新增的类型");String type = scanner.next();Book newBook = new Book(name, author, price, type);//3.判断书架是否,已经存在这本书for (int i = 0; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {System.out.println("书已经存在了,不用再添加了");return;}}//插入图书bookList.setBook(currentSize, newBook);bookList.setUsedSize(currentSize+1);}
}

(3).删除图书:

public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的图书");String name = scanner.nextLine();int pos = 0;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("没有找到你要删除的图书");}//开始删除for (int j = pos; j < currentSize-1; j++) {//思路:bookList[j] = bookList[j+1];//先找到j+1,那个位置,然后覆盖Book book = bookList.getBook(j+1);bookList.setBook(j, book);}//更新下标bookList.setUsedSize(currentSize-1);System.out.println("删除成功");}
}

(4).显示图书:

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);}}}

(5).退出系统:

public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");System.exit(0);}
}

以下是普通用户菜单方法:

(1).退出系统和查找图书,是普通人员和管理员的共同方法

(2)归还图书:

public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要归还的图书");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {//看看isBorrowed返回,ture(已借出),还是false(未借出)if (book.isBorrowed()) {book.setBorrowed(false);return;}}}System.out.println("错误,没有你要归还的图书");}
}

(3)借阅图书:

public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");int currentSize = bookList.getUsedSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借阅的图书");String name = scanner.nextLine();for (int i = 0; i < currentSize; i++) {//遍历,书架,已初始化的书Book book = bookList.getBook(i);if (book.getName().equals(name)) {//看看isBorrowed返回,ture(已借出),还是false(未借出)if (book.isBorrowed()) {System.out.println("该书已经被借出");return;}book.setBorrowed(true);//置为借出System.out.println("借阅成功");return;}}System.out.println("没有找到你要借阅的那本书");}
}

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

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

相关文章

[数组查找]2.图解二分查找及其代码实现

二分查找 二分查找也是一种在数组中查找数据的算法。和线性查找不同&#xff0c;它只能查找已经排好序的数据。二分查找通过比较数组中间的数据与目标数据的大小&#xff0c;可以得知目标数据是在数组的左边还是右边。因此&#xff0c;比较一次就可以把查找范围缩小一半。重复执…

嵌入式进阶——舵机控制PWM

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 舵机信号线代码示例初始化PWM初始化UART打印日志初始化外部中断Extimain函数 舵机最早用于船舶上实现转向功能,由于可以通过程序连…

MySQL中, 自增主键和UUID作为主键有什么区别?

首先我们来看看, 存储自增主键和uuid的数据类型 我们知道, mysql中作为主键的通常是int类型的数据, 这个 数据从第一条记录开始, 从1开始主键往后递增, 例如我有100条数据, 那么根据主键排序后, 里面的记录从上往下一次就是1, 2, 3 ... 100, 但是UUID就不一样了, UUID是根据特殊…

打卡信奥刷题(21)用Scratch图形化工具信奥P7071 [CSP-J2020] 优秀的拆分

使用2进制进行拆分是比较好的解决方案&#xff0c;毕竟对于大家来说二进制转换是非常熟的&#xff0c;如果不会可以参考打卡信奥刷题&#xff08;19&#xff09;用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 &#xff0c;输出的时候再转换一下输出&#xff0c;…

M功能-支付平台(三)

target&#xff1a;离开柬埔寨倒计时-221day 前言 今天周六&#xff0c;但是在柬埔寨还是工作日&#xff0c;想着国内的朋友开始休周末就羡慕呀&#xff0c;记不清在这边过了多少个周六了&#xff0c;多到我已经习惯了。而且今天技术部还停电了&#xff0c;真的是热的受不了呀…

ASP.NET 代码审计

ASP.NET 官方文档 名词解释 IIS&#xff08;Internet Information Services&#xff09; IIS 是微软开发的一款 Web 服务器软件&#xff0c;用于在 Windows 服务器上托管和提供Web应用程序和服务。它支持 HTTP、HTTPS、FTP、SMTP 等多种协议&#xff0c;主要用于&#xff1a…

基于混合Transformer-CNN模型的多分辨率学习方法的解剖学标志检测

文章目录 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model摘要方法实验结果 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model 摘要 精确定位…

跨域计算芯片,一把被忽视的汽车降本尖刀

作者 |王博 编辑 |德新 2019年前后&#xff0c;「中央运算单元区域控制」的架构被提出。基于这一趋势&#xff0c;从板级的多芯片&#xff0c;到板级的单芯片&#xff0c;集成度越来越高&#xff0c;跨域计算芯片随之来到聚光灯下。 跨域计算芯片的特点是&#xff0c;与专为智…

牛客网刷题 | BC97 回文对称数

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 今天牛牛学到了回文…

锁相环的一些学习笔记--(1)

下图两组1.2.3可以对应起来&#xff1b; 一些分析&#xff1a; 1.根据这个可知最后vco_voltage停在0.5v 参考资料&#xff1a; 1. Matlab https://www.bilibili.com/video/BV1bR4y1Z7Xg/?spm_id_from333.1296.top_right_bar_window_history.content.click&vd_source555…

如何将Windows PC变成Wi-Fi热点?这里提供详细步骤

序言 Windows 10和Windows 11都有内置功能,可以将你的笔记本电脑(或台式机)变成无线热点,允许其他设备连接到它并共享你的互联网连接。以下是操作指南。 由于Windows中隐藏的虚拟Wi-Fi适配器功能,你甚至可以在连接到另一个Wi-Fi网络或无线路由器时创建Wi-Fi热点,通过另…

鲁教版七年级数学上册-笔记

文章目录 第一章 三角形1 认识三角形2 图形的全等3 探索三角形全等的条件4 三角形的尺规作图5 利用三角形全等测距离 第二章 轴对称1 轴对称现象2 探索轴对称的性质4 利用轴对称进行设计 第三章 勾股定理1 探索勾股定理2 一定是直角三角形吗3 勾股定理的应用举例 第四章 实数1 …

Kafka 安装教程和基本操作

一、简介 Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于 zookeeper 协调的分布式日志系统&#xff08;也可以当做 MQ 系统&#xff09;&#xff0c;常见可以用于 web/nginx 日志、访问日志&#xff0c;消息服务等等…

基于YOLO算法实现网球运动实时分析(附源码)

大家好&#xff0c;我是小F&#xff5e; 今天给大家介绍一个计算机视觉实战的项目。 该项目使用YOLO算法检测球员和网球&#xff0c;并利用cnn提取球场关键点。 进而分析视频中的网球运动员&#xff0c;测量他们的速度、击球速度和击球次数。 使用win10电脑&#xff0c;Python …

【源码】java + uniapp交易所源代码/带搭建教程java交易所/完整源代码

java uniapp交易所源代码/带搭建教程java交易所/完整源代码 带简洁教程&#xff0c;未测 java uniapp交易所源代码/带搭建教程java交易所/完整源代码 - 吾爱资源网

【古董技术】ms-dos应用程序的结构

序 制定一个MS-DOS应用程序计划需要认真分析程序的大小。这种分析可以帮助程序员确定MS-DOS支持的两种程序风格中哪一种最适合该应用程序。.EXE程序结构为大型程序提供了好处&#xff0c;因为所有.EXE文件之前都有额外的512字节&#xff08;或更多&#xff09;的文件头。另一方…

C++第十七弹---string使用(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、标准库中的string类 1.1、string类的常用接口说明 1.1.1、string类对象的修改操作 1.1.2、string类对象非成员函数重载 总结 1、标准库中的…

牛客热题:有效括号

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;有效括号题目链接方法一&#x…

Mycat+Mysql搭建数据集群实现数据分片存储

前言 MyCAT介绍 * 一个彻底开源的,面向企业应用开发的“大数据库集群”; * 支持事务、ACID、可以替代MySQL的加强版数据库; * 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群; * 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL; * 一个新颖…

2024.5.1学习记录

1、代码随想录&#xff1a;贪心刷题 2、react 高级使用( hoc render、props、函数组件、serState 传送门等) 3、游山玩水