简易版 图书管理系统

news/2024/4/30 4:06:54/文章来源:https://blog.csdn.net/weixin_67807492/article/details/127939657

目录

1. Book包

1.1 Book类

1.2 BookList类

2. User包

2.1 User抽象类

2.2 AdminUser类

2.3  NormalUser类

3. Operate包

3.1 MyOperate接口

3.2  AddOperation类

3.3  DelOperation类

 3.4 ExitOperation

 3.5  FindOperation类

 3.6 ShowOperation类

 3.7 BorrowedOperation类

3.8 ReturnOperation类

4. Main类


本章作为一个练习,对于前面学过的那些语法进行一个整合运用。

语法方面主要包括:封装就、继承、多态、抽象类和接口。

首先,我们将整个系统分为4个包,

分别是Book类用于封装书和书架的具体信息。

Main包也就是封装主类,用于对整个系统的具体操作。

Operate包用于封装具体的操作。

User包用于管理用户信息。

我们一个包一个包来讲解。

1. Book包

Book包分为两类,分别是书和书架。

1.1 Book类

该类主要是对书的一些基本信息进行封装,并且提供Getting和Setting方法。

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 boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book.Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", isBorrowed=" + isBorrowed +//", isBorrowed=" + isBorrowed +(isBorrowed  ? "  已经被借出" : "  未被借出") +'}';}
}

1.2 BookList类

书架的创建:

包括了初始化,以及对一些书籍的基本操作。

package Book;public class BookList {private Book[] books = new Book[10];//创建书架private int usedSize;//记录书架上书的数量public BookList() {//初始化3本书books[0] = new Book("我们仨","杨绛",89,"文学");books[1] = new Book("明朝那些事","当年明月",78,"历史");books[2] = new Book("红楼梦","曹雪芹",49,"小说");this.usedSize = 3;}public Book[] getBooks() {return books;}public void setBooks(int pos,Book book) {books[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book getBook(int pos) {return this.books[pos];}//重写setBook方法作用于设置图书(增删)public void setBook(Book book) {this.books[usedSize] = book;}public void setBook(int pos,Book book) {this.books[pos] = book;}
}

2. User包

User包被分为三类,其中User类是抽象类,用于管理人员类和普通用户类继承。

AdminUser是管理类,NormalUser类是普通用户类。

2.1 User抽象类

因为对于不同的用户而言,他们的访问权限是不同的,所以需要将菜单抽象出来以示区分。

另外就是基本信息。

package User;import Book.BookList;
import Operate.MyOperate;//抽象出menu()菜单方法
public abstract class User {//protected是访问权限,改为更大的也可以protected String name;protected MyOperate[] myOperate;//等会到Operate包再讲//用户信息public User(String name) {this.name = name;}public abstract int menu();//作用于main方法中对不同的用户进行区分public void doWork(int choice, BookList bookList) {this.myOperate[choice].work(bookList);}
}

2.2 AdminUser类

这里开辟的MyOperate数组是对管理人员的访问权限开辟空间,其中功能包括 退出,查找,增加,删除,显示

package User;import Operate.*;import java.util.Scanner;public class AdminUser extends User {//管理人员所拥有的访问权限public AdminUser(String name) {super(name);this.myOperate = new MyOperate[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation(),};}//管理人员拥有的权限public int menu() {System.out.println("*****************************************");System.out.println("hello"+ name +"欢迎来到图书小小练习");System.out.println("1:查找图书");System.out.println("2:新增图书");System.out.println("3:删除图书");System.out.println("4:显示图书");System.out.println("0:退出系统");Scanner scanner = new Scanner(System.in);int choice  = scanner.nextInt();return choice;}
}

2.3  NormalUser类

这里开辟的MyOperate数组是对普通用户的访问权限开辟空间,其中功能包括 退出,查找,借书,还书

package User;import Operate.*;import java.util.Scanner;public class NormalUser extends User {//普通用户所拥有的访问权限public NormalUser(String name) {super(name);this.myOperate = new MyOperate[]{new ExitOperation(),new FindOperation(),new BorrowedOperate(),new ReturnOperation(),};}//普通用户拥有的权限@Overridepublic int menu() {System.out.println("****************************");System.out.println("hello "+name+" 欢迎来到图书小练习");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. Operate包

Operate的各个操作,增、删、查、借书、还书、退出。

我们 Operate包 将普通用户和管理员用户的具体实现操作类全写在Operate包 中。

3.1 MyOperate接口

MyOperate接口只设计好了各个Operation规范(方法)

package Operate;import Book.BookList;public interface MyOperate {public void work(BookList bookList);
}

3.2  AddOperation类

本类用于添加书籍得基本信息,并且做了基本的判断。

package Operate;import Book.Book;
import Book.BookList;import java.util.Scanner;public class AddOperation implements MyOperate {@Overridepublic void work(BookList bookList) {System.out.println("新增图书");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);//得到此时书架上书的数量int currentSize = bookList.getUsedSize();//遍历,查找是否想添加的书已经存在了//默认添加在最后面for (int i = 0; i < currentSize; i++) {Book tmp = bookList.getBook(i);if(tmp.getName().equals(name)) {System.out.println("已经存在这本书了,不能再放入了!");return;//如果存在即退出}}//如果不存在即添加bookList.setBook(book);//每添加一本书下表向后移bookList.setUsedSize(currentSize + 1);}
}

3.3  DelOperation类

先上代码:

package Operate;import Book.Book;
import Book.BookList;import java.util.Scanner;public class DelOperation implements MyOperate {@Overridepublic void work(BookList bookList) {System.out.println("删除图书!");System.out.println("请输入你要删除图书的名字:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//得到当前下标int currentSize = bookList.getUsedSize();int index = -1;//遍历,tmp.getName().equals(name)为真即表示书架存在该书//否则则该书不存在for (int i = 0; i < currentSize; i++) {Book tmp = bookList.getBook(i);if (tmp.getName().equals(name)) {index = i;break;}}//图示说明for (int j = index; j < currentSize - 1; j++) {Book book = bookList.getBook(j+1);bookList.setBook(j,book);}bookList.setUsedSize(currentSize - 1);//删除对象,把最后一个设置为bullbookList.setBook(currentSize - 1, null);}
}

图示:

 假设currentSize 在这里,我们想要删掉该书,那么我们就将currentSize + 1 赋值给currentSize;

接着currentSize向后走:

 重复上述操作:

知道最后一个:

直接将最后一个删除,毕竟每删除一个都需要将 书架上的书减少一本:

这样也解释了为什么之前需要重写setBook()方法。

 3.4 ExitOperation

该类就只提供一个方法:exit()

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

 为什么exit()方法中的参数是0,因为我们正常退出是就是0:

 3.5  FindOperation类

FindOperation类实现很简单,只需要提供书名再进行遍历,当然也可以根据价格、作者进行遍历。

package Operate;import Book.Book;
import Book.BookList;import java.util.Scanner;public class FindOperation implements MyOperate{@Overridepublic void work(BookList bookList) {System.out.println("查找图书!");System.out.println("请输入书名!");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//获取当前图书在书架得下标int currentSize = bookList.getUsedSize();//遍历for (int i = 0; i < currentSize; i++) {//System.out.println(bookList[i]);Book book = bookList.getBook(i);if (book.getName().equals(name)) {System.out.println("找到了这本书");System.out.println(book.toString());return;}}System.out.println("没有找到"+name);}
}

 3.6 ShowOperation类

遍历获取通过Getting方法打印即可。

package Operate;import Book.Book;
import Book.BookList;public class ShowOperation implements MyOperate {@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);}}
}

以上便是管理员访问得全部权限,当然有需要还可以自己添加所需要的方法。

后面得便是普通用户特有的权限,普通用户也有FindOperation、ShowOperation。

 3.7 BorrowedOperation类

方法的逻辑很简单,只需稍加注意

package Operate;import Book.Book;
import Book.BookList;import java.util.Scanner;public class BorrowedOperate implements MyOperate {@Overridepublic void work(BookList bookList) {System.out.println("借阅图书!");System.out.println("请输入你要借阅的图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//获取int currentSize = bookList.getUsedSize();//遍历for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);//不仅需要判断书是否存在书架上,并且还需要判断是否已经借出if (book.getName().equals(name) &&book.isBorrowed() == false) {book.setBorrowed(true);System.out.println("借阅成功");return;}}}
}

3.8 ReturnOperation类

逻辑于BorrowedOperation类相似

package Operate;import Book.Book;
import Book.BookList;import java.util.Scanner;public class ReturnOperation implements MyOperate {@Overridepublic void work(BookList bookList) {System.out.println("归还图书!");System.out.println("请输入你要归还的图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int currentSize = bookList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = bookList.getBook(i);if (book.getName().equals(name) &&book.isBorrowed()) {book.setBorrowed(false);System.out.println("归还成功");return;}}}
}

4. Main类

 Main类中只有一个类,主类,整个程序的入口。

上代码:

package Main;import Book.BookList;
import User.AdminUser;
import User.User;
import User.NormalUser;
import java.util.Scanner;public class Main {//提供一个静态方法用于创建身份,是判断管理员还是普通用户public static User login() {System.out.println("请输入你的姓名");Scanner scanner = new Scanner(System.in);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();while (true) {int choice = user.menu();user.doWork(choice,bookList);}}
}

这里发生了一个向上转型:

 主方法的内容非常简单:

1. 创建一个书架;

2.通过登录方法确认用户信息;

3.一个死循环,不停的使用“权限”,知道用户输入0退出。

这里就体现了面向对象的思想,所有的过程全部封装完成,只对外提供了公开的方法。

本章的思路都非常简单,只是有些地方需要稍加注意,本章的目的便是体验面向对象的思想。

案例演示:

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

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

相关文章

QT 发布文章遇到问题解决方案

提供了两种可以发布 Qt 程序的方案&#xff0c;建议使用第二种直接生成对应的文件&#xff0c;直接打包就可以 1. 手动复制需要的文件到运行目录下 我们写完 QT 程序当然是要发布或者发给其他需要用到的人&#xff0c;由于找不到Qt6Core.dll,无法继续执行代码,打开 realease …

菜小白聊聊开源和开源协议

最近想入linux的深坑&#xff0c;于是开启了马哥sre课程的探险之旅。在了解到Linux是一款自由和开放源码的类UNIX操作系统的历史时&#xff0c;深深被开源精神所折服。也强烈感受到了开源精神的伟大。也正是因为有了开放源码的精神&#xff0c;才有了国产百花齐放的android系统…

java计算机毕业设计ssm金华学校社团管理系统

项目介绍 随着计算机信息技术的迅猛发展,互联网技术大规模应用到各行各业,传统的管理系统也逐渐精细化。高校作为教书育人的场所,各种管理也更应该智能化,特别是计算机信息专业更是最早接触信息技术,为高校各部门开发必要的系统是很有意义的事情。本金华学校社团管理系统对社团…

wireshark提取视频数据之RTP包中提取H264和H265

wireshark提取视频数据之RTP包中提取H264和H265 文章目录wireshark提取视频数据之RTP包中提取H264和H2651 背景2 提取前工作3 H264视频从RTP包中提取步骤4 H265视频从RTP包中提取步骤5 后记1 背景 在流媒体相关问题分析时&#xff0c;抓包分析是非常重要的手段&#xff0c;比如…

数据结构---串(整个部分)

串基本概念&#xff1a;串是由零个或者多个字符组成的有限序列&#xff0c;一半记作Sa1,a2,a3,a4.......&#xff08;n>0&#xff0c;串的长度&#xff09; 1.S 串的名字 n 串当中字符串的个数&#xff0c;称为串的长度。 串的常用术语 1.空串&#xff08;null stri…

七夕,程序员教你5个表白代码,2分钟学会,牢牢主抓她的心

七夕。一个有人欢喜有人愁的节日&#xff0c;虽然对一些单身人士不太友好&#xff0c;但还有不少人都在等这个节日进行表白。毕竟这个日子的成功率会高一些。 情人节少不了送花送礼物&#xff0c;作为一个程序员&#xff0c;当然不会在送什么礼物上给你指点一二&#xff0c;但…

掌控安全学院SOL注入靶场

掌控安全学院SOL注入靶场靶场地址Pass-01 显错注入Pass-02Pass-03Pass-04Pass-05 POST注入Pass-06Pass-07 Head注入Pass-08Pass-09Pass-10 布尔盲注Pass-11Pass-12Pass-13 延时注入Pass-14Pass-15 宽字节注入Pass-16Pass-17总结靶场地址 http://inject2.lab.aqlab.cn Pass-01…

Java实现图书管理系统

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaSE基础 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 今天给大家带来的是用Java实现的图书管理系统。 目录 需求 图书类 创建图书类 创建书架 Operation IOperation接口 添加图书AddOperation…

【考研复试】计算机专业考研复试英语常见问题三(个人选择/学业规划篇)

相关链接&#xff1a; 【考研复试】计算机专业考研复试英语常见问题一&#xff08;家庭/家乡/学校篇&#xff09;【考研复试】计算机专业考研复试英语常见问题二&#xff08;研究方向/前沿技术/本科毕设篇&#xff09;【考研复试】计算机专业考研复试英语常见问题三&#xff0…

kubernetes集群基于kubeadm部署以及常见问题解决

文章目录集群类型主机规划环境初始化检查操作系统版本关闭防火墙设置主机名主机名解析时间同步关闭 SELinux关闭 swap 分区将桥接的IPv4流量传递到iptables的链开启ipvs安装容器运行时&#xff08;Docker&#xff09;卸载Docker旧版本&#xff1a;安装 gcc 相关安装Docker设置阿…

一个Adapter+recycleview实现多种布局,区分布局中

文章目录&#x1f353;&#x1f353;简述&#x1f353;&#x1f353;效果图&#x1f353;&#x1f353;代码&#x1f96d;&#x1f96d;AllAdapter.java&#x1f96d;&#x1f96d; FuritAdapter3.java&#x1f96d;&#x1f96d;MainActivity.java(主函数)&#x1f96d;&#…

【全网热点】打造全网最全爱心代码仓库【火速领取爱心】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【代码实践】 目录&#x1f319;正文&#x1f30f;部分效果在线演示&#x1f30f;部分效果截屏&#x1f338;文末祝…

个人设计web前端大作业 基于html5制作美食菜谱网页设计作业代码

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Linux的前世今生

14天学习训练营导师课程&#xff1a; 互联网老辛《 符合学习规律的超详细linux实战快速入门》 努力是为了不平庸~ 学习有些时候是枯燥的&#xff0c;但收获的快乐是加倍的&#xff0c;欢迎记录下你的那些努力时刻&#xff08;学习知识点/题解/项目实操/遇到的bug/等等&#xf…

2022年深度学习最新研究成果

一、开源深度学习编译器 二、 开源深度学习加速器 三、AITemplate引擎 四、微型机器学习框架 参考文献&#xff1a;https://arxiv.org/pdf/1510.00149.pdf 五、Contrastive Learning 对比学习综述 六、Diffusion Model 扩散模型综述 Diffusion Models: A Comprehensive Surv…

Java面向对象中阶(七)

面向对象中阶 1、包 2、访问修饰符 3、封装 4、继承 5、方法重写(override) 6、多态 7、Object类的常用方法 8、断点调试 1、包 包的本质&#xff1a; 实际上就是创建不同的文件夹来保存类文件 包的三大作用&#xff1a; 区分相同名字的类当类很多时&#xff0c;可以…

【freeRTOS】操作系统之六-低功耗模式

六&#xff0c;低功耗模式 本章节为大家讲解 FreeRTOS 本身支持的低功耗模式 tickless 实现方法&#xff0c;tickless 低功耗机制是当前小型 RTOS 所采用的通用低功耗方法&#xff0c;比如 embOS&#xff0c;RTX 和 uCOS-III&#xff08;类似方法&#xff09;都有这种机制。ti…

原来背后都是商业利益,看到网易和暴雪的解约之后,原来是要定以后的KPI,坐地起价,但是一个时代已经结束了,都留在了记忆之中

1&#xff0c;大瓜新闻&#xff0c;2023年1月暴雪游戏中国将不会续约&#xff1f;&#xff1f; 2&#xff0c;原因是主要坐地起价&#xff0c;提高分成设置KPI 还好网易有自研游戏&#xff0c;估计早知道会有现在这样的情况。 提前做好了准备。还记得有个公司叫 九城吗&#x…

创建自己的函数库

创建自己的函数库前言一、什么是STM32标准函数库1.定义&#xff1a;2.作用&#xff1a;3.对比&#xff1a;二、构建库函数1.修改寄存器地址封装2.定义访问的结构体指针和引脚3.创建封装函数3.1创建拉低引脚函数3.2创建引脚初始化函数总结前言 回顾一下&#xff0c;前面点亮led…

堆 (带图详解)

文章目录1.堆的基本概念1. 概念2.性质1.必须为完全二叉树2.满足大堆/小堆成立的条件3.存储方式1.逻辑结构2.物理结构4. 孩子与父亲之间下标的关系2.堆的基本实现1.push——插入1.代码2. 情况分析情况1情况23. 向上调整算法1.过程分析2. 临界条件的判断2. pop—— 删除1.代码2. …