java项目——图书管理系统

news/2024/7/20 17:28:10/文章来源:https://blog.csdn.net/2301_77993957/article/details/139268517

文章目录

  • 前言
  • 图书管理系统
    • 整体框架:
    • book包
    • user包
    • Main包:
    • iooperation包
    • 总结:


前言

针对这些天所学的javaSE的知识,用一个小项目来实践一下。


图书管理系统

整体框架:

采取面向对象的思想实现此项目,首先分析出此项目中涉及的对象有哪些:
有用户,书籍,业务操作!
用户又分为普通用户与管理员。
书籍相关的对象又分为书籍与书架。
操作又分为七种不同的功能操作。
在这里插入图片描述
在这里插入图片描述

book包

在这里插入图片描述
有关书的类均创建在book包中,有书籍与书架两个类:
书籍Book类
书籍类中有4种属性,均设置成private修饰,封装起来,用getter和setter方法进行获取与修改!

package book;public class Book {private   String name;  //书籍的名称private  double price;  //书籍的价格private   String author; //书籍的作者private boolean state; //书籍当前的状态 -是否可借出public Book(String name, double price, String author) {this.name = name;this.price = price;this.author = author;this.state = true;  //默认均为true,表示可借出}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", price=" + price +", author='" + author + '\'' +((state == true)?",状态:未借出":",状态:已借出")+'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public boolean getState() {return state;}public void setState(boolean state) {this.state = state;}
}

书架类BookList:

在书架类中,有一个Book类型的数组,用于表示书架,书架的空间为5
属性number表示当前书架上书的数目。
用getter和setter来获取与设置number的信息。

package book;public class BookList {//书架的本质应该是一个数组public   Book [] books = new Book[5];   private  int number = 3;//初始化放入三本书//通过构造方法,初始化放入三本书  public BookList() {this.books[0] = new Book("红楼梦",10.5,"曹雪芹");this.books[1] = new Book("西游记",15,"吴承恩");this.books[2] = new Book("三国演义",15.2,"罗贯中");}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}
}

user包

在这里插入图片描述
user包中有user抽象类,有普通用户类NormalUser,有管理员类AdminUser.
user抽象类:
user抽象类中有属性,用户的名字
有接口数组:即可以用于存放实现菜单中功能的业务实现类
有一个menu抽象方法,对于管理员与普通用户进行不同的重写。
选择操作的抽象方法,可以参考普通用户类与管理员类AdminUser理解!

package user;import book.BookList;
import iooperation.IOperation;public  abstract  class User {protected   String name;   //用户的名字                                          !IOperation [] iOperations;    //操作接口数组//定义一个menu抽象方法public  abstract int  menu();    //菜单的抽象方法public User(String name) {this.name = name;}public   abstract   void dooperation(int choice, BookList bookList);  //选择操作方法!}

普通用户类NormalUser:
在本类中,构造方法为iOperation数组进行了初始化,针对呈现给普通用户的菜单,赋值了对应的业务实现类对象。

对于dooperation方法,在接收了用户输入的choice值后,便针对选定的书架,iOperations数组中相应的实现类对象!

menu方法如代码中所示:

package user;import book.BookList;
import iooperation.*;import java.util.Scanner;public class NormalUser extends User {public NormalUser(String name) {super(name);//创建一个接口数组:this.iOperations = new IOperation[]{new SearchOperation(),   //搜寻功能的实现类——多写一行是为了菜单中选项与数组下标一致,//便于调用相应的实现类对象。new SearchOperation(),   //搜寻功能的实现类对象new BorrowOperation(),   //借阅功能的实现类对象new ReturnOperation(),   //归还功能的实现类对象new ExitOperation()      //退出功能的实现类对象};}public void dooperation(int choice, BookList bookList){//根据choice,调用相应的业务类对象this.iOperations[choice].work(bookList);}public int  menu(){System.out.println("*****************************");System.out.println("******普通用户菜单*******");System.out.println("******1. 查找图书**********");System.out.println("******2. 借阅图书***********");System.out.println("******3. 归还图书**********");System.out.println("******4. 退出系统**********");System.out.println("*****************************");System.out.println("请选择你要执行的操作!");//用于接收从键盘上输入的数字,并返回!return   new Scanner(System.in).nextInt();}
}

管理员类AdminUser:
本类中亦根据菜单中功能,为iOperations进行了相应的初始化。

对于dooperation的实现与普通用户类相同,均用于接收相应的choice值,而调用
iOperations中相应的实现类对象!

package user;import book.BookList;
import iooperation.*;import java.util.Scanner;public class AdminUser extends User {public AdminUser(String name) {super(name);this.iOperations = new IOperation[]{new SearchOperation(), //用于使数组的下标与菜单选项值一致new SearchOperation(),  //搜寻功能实现类对象new AddOpearation(),    //新增图书功能实现类对象new DeleteOperation(),  //删除图书功能实现类对象new ShowOperation(),    //展示图书功能实现类对象new ExitOperation()     //退出系统功能实现类对象};}@Overridepublic void dooperation(int choice, BookList bookList) {this.iOperations[choice].work(bookList);}public int  menu() {System.out.println("**欢迎" + super.name + "****");System.out.println("******管理员菜单*******");System.out.println("*****1. 查找图书**********");System.out.println("*****2. 新增图书************");System.out.println("*****3. 删除图书***********");System.out.println("*****4. 显示图书***********");System.out.println("*****5. 退出系统***********");System.out.println("请选择你要执行的操作!");return   new Scanner(System.in).nextInt();}
}

Main包:

Main包中用于放置测试类:
下面中代码的内容体现了本项目大体框架的实现:

首先:针对系统的登录,创建一个静态方法。
其次:在main方法中,先实例一个书架对象,
然后新建一个User 引用 接收从登录方法中传来的用户对象。
然后用choice局部变量接收用户针对菜单 选择的功能选项。
最后,调用dooperation方法,传入实参bookList1与choice,实现对应的功能!

package Main;import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Test {public static User Login() {System.out.println("请输入你的名字:");String name = new Scanner(System.in).next();System.out.println("请输入你的身份:1. 管理员   2. 普通用户");int choice = new Scanner(System.in).nextInt();if (choice == 1) {return new AdminUser(name);} else {return new NormalUser(name);}}public static void main(String[] args) {//先创建一个书架BookList bookList1 = new BookList();//接收登录后返回的对象值:while (true) {User user = Login();int choice = user.menu();//调用相应的业务类对象user.dooperation(choice, bookList1);}}
}

iooperation包

在这里插入图片描述
本包是业务功能实现包,具有一个操作接口与七个业务实现类。
IOperation接口:

本接口中只有一个抽象方法work,参数为书架对象,其余七个实现类均实现本接口。

package iooperation;import book.BookList;public interface IOperation {void work(BookList bookList);
}

AddOperation类:
此类实现新增图书功能:

package iooperation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOpearation implements IOperation {public void work(BookList bookList){System.out.println("请输入您要添加的图书的信息");System.out.println("请输入书籍的名字:");String name  = new Scanner(System.in).next();//先判断书架上是否已经有此书籍,如果有则拒绝添加!!!for (int i = 0; i < bookList.getNumber(); i++) {if (bookList.books[i].getName().equals(name)) {System.out.println("已有这本书的存档,添加失败!!!");return;}}System.out.println("请输入书籍的价格:");double price2 = new Scanner(System.in).nextDouble();System.out.println("请输入书籍的作者:");String author2 = new Scanner(System.in).next();Book book = new Book(name,price2,author2);//将新的书籍的信息赋值到书架的后面int currency = bookList.getNumber();  //获取当前书架上书籍的数目//需要先判断书架上是否还有空间!!if(currency==5){System.out.println("书架上的书籍已经满了,不能再添加新的书籍!!");}else {bookList.books[currency]  = book;//然后书籍的数目加1bookList.setNumber(currency+1);System.out.println("添加书籍成功!!!");}}
}

BorrowOperation类:
本类用于实现借阅功能:

package iooperation;import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation {public void work(BookList bookList){//借阅图书System.out.println("请输入你要借阅的图书名称:");String name = new Scanner(System.in).next();for (int i = 0; i < bookList.getNumber(); i++) {if (bookList.books[i].getName().equals(name)) {//如果要借阅的图书存在,则判断其是否被借出。if(bookList.books[i].getState()== true){//说明此书可借阅!!!System.out.println("借阅成功!!!");bookList.books[i].setState(false);return;}else {System.out.println("此书已被借出,借阅失败!!!");return;}}}System.out.println("不存在你所要借阅的图书!!!");}
}

DeleteOperation类:
本类用于实现删除图书功能!

package iooperation;import book.BookList;import java.util.Scanner;public class DeleteOperation implements IOperation {//删除图书//在顺序表中删除一条数据,在被删除的数据的位置之后的所有数据往后移动一位!!!public void work(BookList bookList){System.out.println("请输入你要删除的图书名字:");String name = new Scanner(System.in).next();//先查找这本书,看其是否存在在书架上!for (int i = 0; i < bookList.getNumber(); i++) {//如果书架上的书与要查找的书的书名相同!!if(bookList.books[i].getName().equals(name)){//当书架上存在这本书,将这本书之后的所有书籍往前挪动一位,如果是此书是书架上最后一本书籍,则不用动//number-1即可(因为我们是根据数组下标操作书架!!!)int currency = bookList.getNumber();for (int j = i; j < currency-1 ; j++) {bookList.books[j] = bookList.books[j+1];}//移动完之后System.out.println("删除成功!!!");bookList.setNumber(currency-1);return;}}System.out.println("未查找到您要删除的书籍!!!");}}

ExitOperation类:
本类用于实现退出系统功能!

package iooperation;import book.BookList;public class ExitOperation implements IOperation {public void work(BookList bookList){//退出系统:status==0!!!System.exit(0);}
}

ReturnOperation 类:
本类用于实现归还图书功能!

package iooperation;import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOperation {public void work(BookList bookList) {//归还图书//首先搜索的书籍,判断要归还的书籍是否有存档!System.out.println("请输入你要归还的图书名称:");String name = new Scanner(System.in).next();for (int i = 0; i < bookList.getNumber(); i++) {if (bookList.books[i].getName().equals(name)) {//如果借阅的图书有存档,且并未被借出if (bookList.books[i].getState() == false) {System.out.println("归还图书成功!!!");bookList.books[i].setState(true);return;} else {System.out.println("该图书并未借出,归还失败!!!");return;}}}System.out.println("归还失败,并无此书的存档!!!");}
}

SearchOperation类:
本类用于实现查找图书功能!

package iooperation;import book.BookList;import java.util.Scanner;public class SearchOperation  implements IOperation  {//进行查找public void work(BookList bookList){System.out.println("请输入您要查找的图书名称:");String name = new Scanner(System.in).next();for (int i = 0; i < bookList.getNumber(); i++) {//如果书架上的书与要查找的书的书名相同!!if(bookList.books[i].getName().equals(name)){//当找到所查找的书籍时,直接将书籍的全部信息打印出来!!!//  System.out.println("查找到"+bookname+"这本书");System.out.println(bookList.books[i].toString());return;}}System.out.println("未查找到您所指向的书籍!!!");}
}

ShowOperation类:
本类用于展示书架上所有书籍的功能!

package iooperation;import book.BookList;public class ShowOperation implements IOperation {//显示书架上的所有图书:public void work(BookList bookList){// 将所有的书籍均遍历出来for (int i = 0; i < bookList.getNumber(); i++) {System.out.println(bookList.books[i].toString());}}

总结:

在最开始写此项目时,我是创建了两个类(普通用户类菜单相关一个,管理员相关一个)根据接受到的choice值,用switch语句来调用相应的实现类对象,
但是这并不是面向对象的思想,是面向过程的思想,
应该尽量的将属于一个对象的东西封装到一个类中去,比如专属于普通用户的菜单,专属于普通用户的业务实现类对象数组,用户对象可以调用自己的方法实现功能(如dooperation方法)等。

在实现方法时,尽量的不要超出其应该的功能范围,比如在实现Login方法时,之前便添加了将登录后返回值加工的代码,这不利于代码的可读性与结构的梳理,应该遵循高内聚,低耦合的思想!

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

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

相关文章

企业如何正确地利用LLM大模型?

大型语言模型 (LLM) 不值得信任。就是这样。 考虑到它们先进的 AI 能力以及当今强大的基础模型的普遍知识&#xff0c;这似乎是一件令人惊讶的事情。然而&#xff0c;问题的关键在于 LLM 无法解释其输出。你不能信任 LLM 的结果&#xff0c;不是因为它不准确&#xff0c;而是因…

超市进销存|基于SprinBoot+vue的超市进销存系统(源码+数据库+文档)

超市进销存系统 目录 基于SprinBootvue的超市进销存系统 一、前言 二、系统设计 三、系统功能设计 1 登录注册 2 管理员功能模块 3员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#x…

golang中的md5、sha256数据加密文件md5/sha256值计算步骤和运行内存图解

在go语言中对数据计算一个md5&#xff0c;或sha256和其他语言 如java, php中的使用方式稍有不同&#xff0c; 那就是要加密的数据必须通过流的形式写入到你创建的Hash对象中。 Hash数据加密步骤 1. 先使用对应的加密算法包中的New函数创建一个Hash对象&#xff0c;(这个也就是…

手搓单链表(无哨兵位)(C语言)

目录 SLT.h SLT.c SLTtest.c 测试示例 单链表优劣分析 SLT.h #pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h>typedef int SLTDataType;typedef struct SListNode {SLTDataType data;struct SListNode* next; }SLTNode;//打印…

Hololens 2 新建自定义按钮

官方链接地址 1、创建Cube 2、添加PressableButton脚本&#xff0c;并点击AddNearin… 3、把Cube拖入到MovingButtonVisuals变量中 4、点击NearInteractionTouchable组件&#xff08;这个组件是添加和上一个脚本绑定的&#xff0c;自动添加上来的&#xff09;上的Fix… 5、…

linux系统常用压缩和解压命令

文章目录 Ubuntu 系统中的文件压缩与解压指南一、常用的压缩和解压工具二、tar 工具三、gzip 工具四、bzip2 工具五、zip 和 unzip 工具六、7z 工具乱码批量解压脚本七、总结 Ubuntu 系统中的文件压缩与解压指南 在 Ubuntu 系统中&#xff0c;文件压缩与解压是日常操作中非常常…

《Effective Objective-C 2.0》读书笔记——对象、消息、运行期

目录 第二章&#xff1a;对象、消息、运行期第6条&#xff1a;理解“属性”这一概念第7条&#xff1a;在对象内部尽量直接访问实例变量第8条&#xff1a;理解“对象等同性”这一概念第9条&#xff1a;以“类族模式”隐藏实现细节第10条&#xff1a;在既有类中使用关联对象存放自…

RSC英国皇家化学学会文献查找下载

英国皇家化学学会(Royal Society of Chemistry&#xff0c;简称RSC)是以促进全球化学领域研究发展与传播为宗旨的国际权威学术机构&#xff0c;是化学信息的一个重要宣传机关和出版商。RSC出版的期刊是化学领域的核心期刊&#xff0c;大部分被SCI和MEDLINE收录&#xff0c;如An…

堆排序和Topk问题

堆排序 堆排序即利用堆的思想来进行排序&#xff0c; 总共分为两个步骤&#xff1a; 1. 建堆 升序&#xff1a;建大堆&#xff1b; 降序&#xff1a;建小堆 2 .利用堆删除思想来进行排序 利用堆删除思想来进行排序 建堆和堆删除中都用到了向下调整&#xff0c;因此掌握了…

260 基于matlab的工业乙醇发酵GUI仿真

基于matlab的工业乙醇发酵GUI仿真。首先对经典的流加半经验半理论模型进行动态和稳态仿真&#xff0c;考虑实际情况密&#xff0c;逐步将温度&#xff0c;气体排放等因素考虑到模型中去&#xff0c;进行综合性仿真。结合GUI技术&#xff0c;以动力学模型为核心&#xff0c;制作…

【组合数学 放球问题 虚拟点 小于等于转小于】1621. 大小为 K 的不重叠线段的数目

本文涉及知识点 放球问题 组合数学汇总 本题难道分&#xff1a;2198 LeetCode1621. 大小为 K 的不重叠线段的数目 给你一维空间的 n 个点&#xff0c;其中第 i 个点&#xff08;编号从 0 到 n-1&#xff09;位于 x i 处&#xff0c;请你找到 恰好 k 个不重叠 线段且每个线段…

VUE3+TS+elementplus+Django+MySQL实现从数据库读取数据,显示在前端界面上

一、前言 前面通过VUE3和elementplus创建了一个table&#xff0c;VUE3TSelementplus创建table&#xff0c;纯前端的table&#xff0c;以及使用VUE3TSelementplus创建一个增加按钮&#xff0c;使用前端的静态数据&#xff0c;显示在表格中。今天通过从后端获取数据来显示在表格…

大数据开发面试题【Kafka篇】

83、介绍下Kafka&#xff0c;Kafka的作用?Kafka的组件?适用场景? kafka是一个高吞吐量、可扩展的分布式消息传递系统&#xff0c;在处理实时流式数据&#xff0c;并能够保证持久性和容错性 可用于数据管道、流分析和数据继承和关键任务应用&#xff08;发布/订阅模式&#…

【Python】 Django 框架如何支持百万级日访问量

基本原理 Django 是一个高级的 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。Django 遵循 MVC&#xff08;模型-视图-控制器&#xff09;设计模式&#xff0c;允许开发者通过编写更少的代码来构建高质量的 Web 应用程序。Django 自带了许多内置功能&#xf…

学习笔记——STM32F103V3版本——HC-05模块控制数码管

一.硬件 1.HC-05模块 2.数码管 3.连接硬件 二.在keil5中的代码 main.c代码&#xff1a; #include "stm32f10x.h" #include "buletooth.h" #include "led.h" #include "sys.h" #include "usart.h" #include "delay.…

目标检测数据集 - 工地工人安全设备佩戴检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;工地工人安全设备佩戴检测数据集&#xff0c;真实场景数据生成增强后高质量图片数据&#xff0c;涉及场景丰富&#xff0c;比如楼宇建筑工地工人作业数据、道路建筑工地工人作业数据、室内工地工人作业数据、露天挖掘场景工人作业数据、工地工人自拍摆拍…

SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)

角色菜单 相关组件方法效果图MySQL代码实现资源菜单树组件实现权限树方法js这里我先主要实现权限树的整体实现方法&#xff0c;如果是直接查看使用的话可以只看这里&#xff01; 后端代码Controlle层代码Service代码及实现类代码Service代码ServiceImpl代码 resourceMapper 代码…

斯坦福大学ALOHA家务机器人团队发布了最新研究成果—YAY Robot语言交互式操作系统

ALOHA YAY 演示视频-智能佳 斯坦福的ALOHA家务机器人团队&#xff0c;发布了最新研究成果—Yell At Your Robot&#xff08;简称YAY&#xff09;&#xff0c;有了它&#xff0c;机器人的“翻车”动作&#xff0c;只要喊句话就能纠正了&#xff01; 标ALOHA2协作平台题 而且机器…

破解微信校验难题,Xinstall助你轻松实现Universal Link功能!

在移动互联网时代&#xff0c;App的推广和运营离不开各种技术手段的支持。其中&#xff0c;Universal Link作为连接App和网页的重要桥梁&#xff0c;被广大开发者所青睐。然而&#xff0c;很多开发者在使用Universal Link时遇到了微信校验不通过的问题&#xff0c;这不仅影响了…

数据库语法树优化

目录 一、σ、π、⋈ 1.选择σ 2.投影π 3.连接⋈ 二、 构建语法树 ① 解读sql语句 ② 写出关系代数表达式 ③ 画出语法树 三、优化语法树 四、练习 语法树优化方法 一、σ、π、⋈ 1.选择σ 选择就是在关系R中选择满足给定条件的诸元组。 通过条件SdeptIS选择出系别…