图书管理系统(附源码)

前言:前面一起和小伙伴们学习了较为完整的Java语法体系,那么本篇将运用这些知识连串在一起实现图书管理系统


目录

一、总体设计

二、书籍与书架

书籍(Book)

书架(Booklist)

三、对图书的相关操作

IOperations接口

ShowOperation

FindOperation

BorrowOperation

ReturnOperation

AddOperation

DeleteOperation

ExitOperation 

三、用户

用户抽象类(User)

NormalUser

AdminUser

Main( 测试 )

注册方法:

main方法:


以面向对象的思想来实现 图书管理系统。

一、总体设计

系统设计框架图

系统设计思想:

用不同的包来分装不同的类别。共创建book包、user包和operation包。

1、book包

与书相关的有书本与书架,封装共同放入book包,体现了封装的设计思想。

 2、user包

user包中用户分为普通用户类与管理员类,共同继承User抽象类,不同的子类有不同的行为现象,这里体现了多态的设计思想

 3、operation包

定义IOperation接口并创建接口数组,再定义不同的图书业务如删除图书类、借阅图书类、归还图书类等等去实现IOperation接口并重写业务方法。并用接口数组间接实例化图书业务对象,通过数组下标来调用不同的图书业务类。

结构图:


二、书籍与书架

书籍(Book)

提供书籍相关信息:

  • 书名
  • 作者
  • 价格
  • 类型
  • 借出情况

对于成员变量及成员方法,不可盲目地设计其权限性为public,对于这种情况,最好使用private进行封装。

代码如下:(代码中也有适当注释)

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{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrowed==true)? " 已借出":" 未借出")+// ", isBorrowed=" + isBorrowed +//注意这里,借出情况信息不应该设置为ture or false//可以进行如68行修改'}';}
}

书架(Booklist)

书架用来存放书籍,书架可以被视为书籍数组,每一个元素都是一本书籍,提供:

  • 初始化书籍信息并封装
  • 记录存放数量并封装

代码如下:

package book;public class BookList {private Book [] books =new Book[10];private int count;//实际放的书本数public BookList() {this.books[0]=new Book("三国演义","罗贯中",20,"小说");this.books[1]=new Book("西游记","吴承恩",30,"小说");this.books[2]=new Book("红楼梦","曹雪芹",30,"笑说");this.count=3;}//拿书public Book getBooks(int pos) {return books[pos];}//设置书的位置public void setBooks(int pos,Book books) {this.books[pos] = books;}//作用找书public Book[] getBooks(){return books;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}}

三、对图书的相关操作

IOperations接口

ioperation接口的作用:

  • 被图书业务操作类实现
  • 创建IOperation接口数组,并用接口数组间接实例化图书业务对象,通过数组下标来调用不同的图书业务类。(User类中定义)

提供信息:

  • 定义含参 ( 书架 )的work方法
package ioperation;import book.BookList;public interface IOperations {void work(BookList bookList);
}

ShowOperation

ShowOperation内容及作用:

  • 重写接口方法
  • 打印书籍信息
package ioperation;import book.Book;
import book.BookList;public class ShowOperation implements IOperations {@Overridepublic void work(BookList bookList) {//记录书本数量int count= bookList.getCount();//遍历数组for (int i = 0; i < count; i++) {Book book =bookList.getBooks(i);// 这里不能直接打印booklist[i],因为 booklist是引用System.out.println(book);}}
}

FindOperation

FindOperation作用:

  • 在遍历书籍数组时利用equal方法核对书籍信息
package ioperation;
import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("查照图书----------");Scanner scanner=new Scanner(System.in);System.out.println("请输入你要查找的图书书名:");String name=scanner.nextLine();int count=bookList.getCount();for (int i = 0; i < count; i++) {Book book =bookList.getBooks(i);if (book.getName().equals(name)){System.out.println("找到该图书"+book);return;}}//若找到了图书在22行return返回则运行不到这里System.out.println("没有找到这本书");}
}

BorrowOperation

BorrowOperation作用

  • 找到需要借阅的书籍更改借阅状态
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class BorrowOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("借阅图书---------");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借阅的图书书名--");String name = scanner.nextLine();int count = bookList.getCount();for (int i = 0; i < count; i++) {Book book = bookList.getBooks(i);if (book.getName().equals(name)) {if (book.isBorrowed()) {System.out.println("这本书已被借出!");return;}//设置借阅情况book.setBorrowed(true);System.out.println("借阅成功!");return;}}System.out.println("没有你要借的这本书");}
}

ReturnOperation

ReturnOperation内容及作用:

  • 找到需要归还的书籍更改借阅状态
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class ReturnOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("归还图书--------");Scanner scanner=new Scanner(System.in);System.out.println("请输入你要归还的书:");String name= scanner.nextLine();int count= bookList.getCount();for (int i = 0; i < count; i++) {Book book = bookList.getBooks(i);if(book.getName().equals(name)){//检测前提当前是否被借出if(book.isBorrowed()){System.out.println("归还成功!");//设置为未借出book.setBorrowed(false);return;}System.out.println("没有你归还的书,归还失败!");}}}
}

AddOperation

AddOperation作用:

  • 新增书籍
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class AddOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("新增图书-------");//判满int count=bookList.getCount();if(count==bookList.getBooks().length){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 newbook=new Book(name,author,price,type);for (int i = 0; i < count; i++) {Book book = bookList.getBooks(i);if (book.getName().equals(name)) {System.out.println("已存在该图书!");return;}}//放入新书bookList.setBooks(count,newbook);//书本数量加1bookList.setCount(count+1);System.out.println("新增图书成功!");}}

DeleteOperation

DeleteOperation相对复杂一点

删除步骤:

  • 遍历书籍数组记录要删除书本的下标
  • 后一个下标的书籍信息依次覆盖当前下标书籍信息,达到删除目的

代码如下:

package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;public class DeleOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("删除图书------");Scanner scanner=new Scanner(System.in);System.out.println("请输入你要删除的图书书名:");String name=scanner.nextLine();int count=bookList.getCount();int pos = 0;int i = 0;//找到书for (; i < count; i++) {Book book = bookList.getBooks(i);if (book.getName().equals(name)) {pos = i;break;}}if(i==count){System.out.println("没有你要删除的书!");return;}for (int j = pos; j < count-1; j++) {//拿下标为j+1书Book book = bookList.getBooks(j+1);//放入j位置bookList.setBooks(j,book);}//书本数量减1bookList.setBooks(count-1,null);bookList.setCount(count-1);System.out.println("删除成功!");}}

ExitOperation 

ExitOperation 内容:

  • System.exit(0) 退出系统
package ioperation;
import book.BookList;public class ExitOperation implements IOperations {@Overridepublic void work(BookList bookList) {System.out.println("退出系统--------");System.exit(0);}
}

三、用户

用户分为普通用户类与管理员类。

User

创建User抽象类来抽取普通用户类与管理员类的共性,不同的子类有不同的行为现象,这里体现了多态的设计思想。因为User类为抽象类,其访问限定符应设置为protected。

User内容(共性的抽取)

  • 定义用户名
  • 定义接口数组
  • 定义doIoperation方法

doIoperation方法说明:

  • 传参数图书业务号码及书架
  • 通过对数组下标来访问对应业务
package use;
import book.BookList;
import ioperation.IOperations;public abstract class User {protected String name;//定义接口数组public IOperations[] ioperations;public User(String name) {this.name = name;}//抽取共性菜单protected abstract int menu();public void doIoperation(int choice, BookList bookList){ioperations[choice].work(bookList);}
}

NormalUser

NormalUser继承User类

  • 在构造方法中初始化操作数组,并间接实例化操作业务等类的对象
  • 打印菜单并返回用户业务数字
package use;
import ioperation.*;
import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.ioperations=new IOperations[]{new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}@Overrideprotected int menu() {System.out.println("-----------------------");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);return scanner.nextInt();}
}

AdminUser

AdminUserr继承User类

  • 在构造方法中初始化操作数组,并间接实例化操作业务等类的对象
  • 打印菜单并返回用户选择的图书业务数字
package use;
import ioperation.*;
import java.util.Scanner;public class AdminUser extends User{public AdminUser(String name) {super(name);this.ioperations=new IOperations[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DeleOperation(),new ShowOperation()};}@Overrideprotected int menu() {System.out.println("-----------------------");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 scanner=new Scanner(System.in);return scanner.nextInt();}}

Main( 测试 )

Main为测试类包含

注册方法:

  • 根据选择不同实例化不同用户对象并返回(在实例化的同时已经调用了该用户类的构造方法,也就是已经初始化好了用户的图书业务权限)
  • 返回类型为User,这里采用了向上转型

main方法:

  • 实例化书架
  • 调用Login方法获得用户身份(这里转型有疑惑的建议看多态性第五条转型问题)
  • 进入循环可以实现一次运行多次选择业务
  • 用choice接受用户需要办理的图书业务对应数字
  • 调用user的doIoperation方法完成图书操作
package use;
import book.BookList;
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 if (choice == 2) {return new NormalUser(name);}return null;}public static void main(String[] args) {BookList booklist = new BookList();User user = Login();while (true) {int choice = user.menu();user.doIoperation(choice, booklist);}}
}

写作不易,求路过的朋友们给个三连与关注。有写的不对的地方,欢迎大佬们在评论区指出错误并指导。

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

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

相关文章

已解决问题 | 该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的

在Chrome浏览器中&#xff0c;如果你看到“该扩展程序未列在 Chrome 网上应用店中&#xff0c;并可能是在您不知情的情况下添加的”这样的提示&#xff0c;通常是因为该扩展程序没有通过Chrome网上应用店进行安装。以下是解决这个问题的步骤&#xff1a; 解决办法&#xff1a;…

kali/ubuntu安装vulhub

无须更换源&#xff0c;安装docker-compose apt install docker.io docker -vdocker-compose #提示没有&#xff0c;输入y安装mkdir -p /etc/docker vi /etc/docker/daemon.json #更换dockerhub国内源┌──(root㉿kali)-[/home/kali/vulhub-master/tomcat/CVE-2017-12615] …

dledger原理源码分析系列(三)-选主

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的选主 关键词 Raft Openmessaging 心跳/选…

Linux安装redis教程(超级详细,新手必看)

环境&#xff1a; Centos 7.9 一、安装准备工作 1.配置gcc 安装redis前需要配置gcc&#xff1a; yum install gcc如果配置gcc出现依赖包问题&#xff0c;可以到主页查看帖子解决&#xff1a;https://blog.csdn.net/m0_59117906/article/details/134451622?spm1001.2014.300…

这四款软件很好用,可以提升工作、学习效率

TableConvert TableConvert是一个基于Web的在线表格转换工具&#xff0c;能够将多种格式的表格数据进行快速转换。它支持将Excel、URL、HTML、JSON、CSV等格式转换为Markdown表、CSV/TSV、XML、YAML、插入SQL、HTML、Excel和LaTeX等格式。用户只需将表格数据粘贴到编辑器&#…

本教程将指导如何通过 Vue 组件和后端 API 交互

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

CJSON库

目录 一、介绍 1、JSON是什么 2、为什么使用CJSON 3、JSON格式 二、使用CJSON构造JSON 1、创建对象 2、添加字段 3、转换格式 4、释放对象 三、使用CJSON解析JSON 1、解析数据 2、 获取字段 3、释放对象 一、介绍 1、JSON是什么 JSON是什么呢&#xff1f;JSON全称…

折半查找详解

一&#xff1a;折半查找概念 折半查找&#xff08;也称为二分查找&#xff09;是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是目标值&#xff0c;则搜索过程结束&#xff1b;如果目标值大于或小于中间元素&#x…

SSM网上旅游信息管理系统-计算机毕业设计源码06975

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

微信小程序毕业设计-垃圾分类系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

Mathematica训练课(46)-- 一些常用的画图函数

在前面的课程中&#xff0c;我们已经梳理了Plot的画图用法&#xff0c;今天就详细梳理一下其他的画图函数用法&#xff1b; 1. 画一条直线 2. Circle(圆) 3. Disk&#xff08;圆盘&#xff09; 4. 画出一个矩形 5. 箭头

大数据可视化实验(六)——ECharts与pyecharts数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1、ECharts可视化制作.. 1 1&#xff09;使用ECharts绘制折线图显示一周的天气变换。... 1 2&#xff09;使用ECharts绘制柱状图显示商品销量的变化。... 4 2、pyecharts可视化制作.. 7 1&#xff09;使用…

【知识学习】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一个强大的可视化Shader编辑工具&#xff0c;它允许用户通过拖拽和连接节点的方式来创建Shader&#xff0c;而不是通过传统的编写代码的方式。Shader Graph使得Shader的创建过程更加直观和易于理解&#xff0c;特别是对于那些不熟悉Shader语言编程的美…

【OpenREALM学习笔记:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 图中红色框为头文件中所涉及到的函数、变量和结构体 核心函数 PoseEstimation::process() 其核心作用为执行位姿估计的处理流程&#xff0c;并返回是否在此循环中进行了任何处理。 在这个函数中判断并完成地理坐标的初始化或这地理坐标的更新。 这里需要…

QTreeView第一列自适应

通过setStretchLastSection(bool stretch)可以设置最后一列自适应,对于QTreeView,stretch默认为true。但有时候我们需要设置第一列自适应,比如文件浏览器,共有名称、大小和修改日期三列,大小和日期的宽度几乎是固定的,但名称却可长可短,此时我们希望在窗口大小变化时,第…

IDEA中Maven配置依赖和排除依赖

目录 依赖配置 添加依赖的几种方式&#xff1a; 1.利用中央仓库搜索的依赖坐标 2.利用IDEA工具搜索依赖 3.熟练上手maven后&#xff0c;快速导入依赖 排除依赖 依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖&#xff1a; 例如&am…

Go-知识测试-工作机制

Go-知识测试-工作机制 生成test的maintest的main如何启动case单元测试 runTeststRunnertesting.T.Run 示例测试 runExamplesrunExampleprocessRunResult 性能测试 runBenchmarksrunNtesting.B.Run 在 Go 语言的源码中&#xff0c;go test 命令的实现主要在 src/cmd/go/internal…

零基础快速上手HarmonyOS ArkTS开发4---从简单的页面开始

接着上一次零基础快速上手HarmonyOS ArkTS开发3---应用程序框架的继续往下。 常用基础组件&#xff1a; 概述&#xff1a; 关于组件的一些基础概念就里就不多说了&#xff0c;官方有很详细的说明&#xff0c;而在HarmonyOS按功能分有如下几大类组件&#xff1a;基础组件、容…

安卓短视频去水印v1.7 简洁好用

各大平台视频无水印提取&#xff0c;登录即永久会员&#xff01; 无水印提取&#xff0c;图片无水印提取 视频旋转&#xff0c;倒放&#xff0c;转gif等功能 链接&#xff1a;https://pan.baidu.com/s/1buoJmAvSFBiRkBmHc7Nn5w?pwd2fu4 提取码&#xff1a;2fu4

Lr、LrC软件下载安装 Adobe Lightroom专业摄影后期处理软件安装包分享

Adobe Lightroom它不仅为摄影师们提供了一个强大的照片管理平台&#xff0c;更以其出色的后期处理功能&#xff0c;成为了摄影爱好者们争相追捧的必备工具。 在这款软件中&#xff0c;摄影师们可以轻松地管理自己的照片库&#xff0c;无论是按拍摄日期、主题还是其他自定义标签…