java项目——图书管理系统

文章目录

  • 前言
  • 图书管理系统
    • 整体框架:
    • 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.mzph.cn/news/843073.shtml

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

相关文章

从华为云OBS到AWS云上S3:迁移及相关事项

随着云计算的快速发展&#xff0c;企业越来越倾向于将数据存储和管理移到云端。华为云的对象存储服务&#xff08;OBS&#xff09;和亚马逊云服务&#xff08;AWS&#xff09;上的简单存储服务&#xff08;S3&#xff09;是两个备受欢迎的选择。对于那些考虑从华为云OBS迁移到A…

安全攻防三

一、IDS: 当黑客绕过了防火墙&#xff0c;你该如何发现&#xff1f; IDS &#xff08;Intrusion Detection System&#xff0c;入侵检测系统&#xff09; NIDS 内网中检测网络流量攻击 黑客如果已经进去内网&#xff0c;防火墙就没办法保护了 NIDS部署在交换机和路由器这些路…

从零开始实现自己的串口调试助手(1) - ui界面搭建

UI 界面搭建 ui界面整体演示 ui对象拆分 更多的细节就不方便展开了&#xff0c;下面有提示完成ui设计的提示 在创建工程前 记得把编码改为utf-8 ui设计技巧: ctrl 鼠标左键实现拖动实现复制粘贴 groupBox &#xff1a; 带标题的文本框 栅格布局 -- 只有一个控件的时候会铺满…

vue系列之 插槽(Slot) 详解

插槽在vue中是一种很常见的写法&#xff0c;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式。一共有三种分类&#xff1a;默认插槽、具名插槽、作用域插槽&#xff0c;下面一一结合案例详细说明。原创不易&#xff0c;需要的小伙伴 收藏关注 哦…

基于Vue的自定义服务说明弹窗组件的设计与实现

基于Vue的自定义服务说明弹窗组件的设计与实现 摘要 随着技术的不断发展&#xff0c;前端开发面临着越来越高的复杂性和不断变化的需求。传统开发方式往往将整个系统构建为整块应用&#xff0c;这导致对系统的任何微小改动都可能触发整体的逻辑变更&#xff0c;从而增加了开发…

B站pink老师HTML5基础(一)

文章目录 一、网页1.什么是网页2.什么是HTML二、常用浏览器 三、Web标准四、HTML标签1.HTML基本结构标签 五、快捷键六、常用标签1.标题标签2.段落和换行标签3.文本格式化标签4.div标签和span标签5.图像标签6.图像路径7.超链接标签8.特殊字符 一、网页 1.什么是网页 2.什么是H…

什么是领导力?如何提高领导能力?

什么是领导能力&#xff1f; 简单来说&#xff0c;领导力就是通过自身的影响力&#xff0c;让他人服从自己的想法行动&#xff0c;在一个组织和集体中&#xff0c;领导力的作用十分重要。对于一个公司的管理层来说&#xff0c;领导能力是不可或缺的一部分&#xff0c;公司存在…

黑马python-面向对象程序设计

1.定义类 class 类名&#xff1a; 代码 ….. 注意&#xff1a;类名要满足标识符命名规则&#xff0c;同时遵循大驼峰命名习惯 2.self&#xff1a; self指调用该函数的对象 3.创建对象 对象名类&#xff08;&#xff09; 4.添加获取对象属性 对象名.属性名值 5._init_()方法&…

Hadoop+Spark大数据技术 实验8 Spark SQL结构化

9.2 创建DataFrame对象的方式 val dfUsers spark.read.load("/usr/local/spark/examples/src/main/resources/users.parquet") dfUsers: org.apache.spark.sql.DataFrame [name: string, favorite_color: string ... 1 more field] dfUsers.show() -----------…

李飞飞亲自撰文:大模型不存在主观感觉能力,多少亿参数都不行

近日&#xff0c;李飞飞连同斯坦福大学以人为本人工智能研究所 HAI 联合主任 John Etchemendy 教授联合撰写了一篇文章&#xff0c;文章对 AI 到底有没有感觉能力&#xff08;sentient&#xff09;进行了深入探讨。 「空间智能是人工智能拼图中的关键一环。」知名「AI 教母」李…

【数据结构】P1 数据结构是什么、算法怎样度量

1.1 基本概念与术语 数据&#xff1a; 数据是信息的载体&#xff0c;是所有能被计算机识别以及处理的符号。数据元素&#xff1a; 数据元素是数据基本单位&#xff0c;由若干 数据项 组成&#xff0c;数据项是构成数据元素最小的单位。 e . g . e.g. e.g. 数据元素如一条学生记…

Leetcode 2028

思路&#xff1a;1-6之间的的n个数组合起来要变成sum_t mean*(rolls.size()n) - sum(rolls) ; 那么可以先假设每个数都是sum_t / n 其中这个数必须要在1 - 6 之间否者无法分配。 然后可以得出n * (sum_t / n ) < sum ; 需要对余数mod进行调整&#xff0c;为了减少调整的次…

接口测试及接口测试常用的工具详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息…

深入了解 CSS 预处理器 Sass

今天我们来深入探讨一下 CSS 预处理器 Sass。我们将学习什么是 Sass,如何使用它,以及它是如何工作的。 什么是 Sass? Sass 是 syntactically awesome style sheets 的缩写,是一种 CSS 预处理器。它是 CSS 的扩展,为基础 CSS 增加了更多的功能和优雅。普通的 CSS 代码很容…

sklearn监督学习--k近邻算法

sklearn监督学习 一、分类与回归二、泛化、过拟合与欠拟合三、k近邻算法四、分析KNeighborsClassifier五、k近邻算法用于回归优点、缺点和参数 一、分类与回归 监督学习是最常用也是最成功的机器学习类型之一。监督机器学习问题主要有两种&#xff0c;分别叫做分类与回归。分类…

IDEA项目通过 tomcat运行报错: 404 请求的资源不可用

SpringBootVue项目 IDEA运行 Tomcat&#xff0c;自动打开网页报错 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/WarehouseManagerApi_war/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/9.0.89 但是运行访问 …

【接口测试_04课_Jsonpath断言、接口关联及加密处理】

一、Jasonpath的应用 JsonPath工具网站&#xff1a;JSONPath解析器 - 一个工具箱 - 好用的在线工具都在这里&#xff01; 1、JSONPath的手写与获取 手写JSONPath 1、 $ &#xff08;英文美元符号&#xff09;代表外层的{} . &#xff08;英文句号&#xff09;表示当前…

卷积神经网络-奥特曼识别

数据集 四种奥特曼图片_数据集-飞桨AI Studio星河社区 (baidu.com) 中间的隐藏层 已经使用参数的空间 Conv2D卷积层 ReLU激活层 MaxPool2D最大池化层 AdaptiveAvgPool2D自适应的平均池化 Linear全链接层 Dropout放置过拟合&#xff0c;随机丢弃神经元 -----------------…

echarts快速入门

之前只看过&#xff0c;没写过&#xff0c;来了个新需求了解下echarts功能 官网&#xff1a;https://echarts.apache.org/handbook/zh/get-started 官方参数文档&#xff1a;https://echarts.apache.org/zh/option.html#title 其实大部分问题&#xff0c;去官方参数文档里面都…

【项目教程】FFmpeg+SDL2实现视频播放器

一、前言 学习ffmpeg和sdl&#xff0c;并编写一个视频播放器&#xff0c;是一个很好的音视频开发项目。 虽然关于视频播放器的原理已经有很多人在博客中进行了讲解&#xff0c;但是很多人不提供视频和代码&#xff0c;这也是我写这篇博客的主要原因。 二、在视频播放器中&am…