零基础Java第十八期:图书管理系统

     

目录

一、package book 

1.1.  Book

1.2. BookList 

二、package user

2.1. User

2.2. NormalUser与AdminiUser 

三、Main

四、NormalUser与AdminiUser的菜单界面

五、package operation 

5.1.  设计管理员菜单

六、业务逻辑

七、完整代码


今天博主来带大家实现一个图书管理系统。今天的这期博客我们需要用的知识点有:java的基础语法、类和对象、继承与多态、抽象类接口。

       在这个系统里面,我们需要创建的对象有书、书架、管理员、普通用户。 这么多对象,我们就要使用包来进行分类。我们先创建三个包:book、user、operation。

一、package book 

1.1.  Book

package book;public class Book {private String title;//书籍名称private String author;//作者private int price;//价格private String type;//类型private boolean BeBorrowed;//是否被借出public Book(String title, String author, int price, String type, boolean beBorrowed) {this.title = title;this.author = author;this.price = price;this.type = type;BeBorrowed = beBorrowed;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}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 isBeBorrowed() {return BeBorrowed;}public void setBeBorrowed(boolean beBorrowed) {BeBorrowed = beBorrowed;}@Overridepublic String toString() {return "Book{" +"title='" + title + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", BeBorrowed=" + BeBorrowed +'}';}
}

     我们定义的成员变量如上代码所示,我们只需要创建成员变量,剩下的都可以用编译器帮我们生成。

1.2. BookList 

package book;public class BooList {private Book[] books;//存放书籍private static final int DEFAULT_SIZE = 10;private int usedSize; // 有效书籍的个数public BooList(Book[] books) {this.books = books;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}

       我们的书架要存储很多的书,那么我们就用一个数组来存储。我们利用SIZE来确定数组的长度。如果说,这个书架最多能放下10本书,而我们手上需要有三本书需要存放,那我们就定义一个有效书籍这个变量。

二、package user

2.1. User

package user;public abstract class User {public String name;public User(String name){this.name = name;}public abstract void menu();
}

      用户分为普通用户与管理员,后两者需要继承用户,我们就可以对用户这个类进行抽象化。我们在User类里面同时在写一个menu方法(且这个方法无具体表现)。

2.2. NormalUser与AdminiUser 

package user;public class NormalUser extends User{public NormalUser(String name) {super(name);}@Overridepublic void menu() {System.out.println("普通用户菜单");}
}package user;public class AdminiUser extends User{public AdminiUser(String name) {super(name);}@Overridepublic void menu() {System.out.println("管理员菜单");}
}

三、Main

      通过Main这个类,我们可以来进行一些操作,比如输入姓名,选择身份,查找图书等。我们在main方法之前,先写一个登录方法,因为我们的返回值是User的子类,所以把返回值类型void改成User。我们在这里可以先运行一下。

import user.AdminiUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User Login() {Scanner sca = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = sca.nextLine();System.out.println("请输入你的身份:1.管理员  2.普通用户");int choice = sca.nextInt();if(choice == 1){return new AdminiUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {User user = Login();user.menu();}
}

四、NormalUser与AdminiUser的菜单界面

    @Overridepublic 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("4.显示图书");System.out.println("0.退出系统");System.out.println("****************************");Scanner sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}

      我们需要根据用户的选择来确定对应的菜单,并返回我们的choice,此时我们要对重写的menu方法的返回值也要进行修改,把void也要改成int。同样地,User类里面的抽象方法的返回值也要改成int。普通用户的菜单也同理。

    @Overridepublic 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 sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}

五、package operation 

       下面就是要根据用户对菜单的功能进行分类。分类要按照我们Main里面的选择来确定这个人是管理员还是普通用户。也就是通过choice的值来调用那个菜单。

5.1.  设计管理员菜单

       首先我们先来设计查找或者是图书,就要在书架里面遍历数组来查找我们的图书。 那我们如何对这些功能进行分类呢?那么这些功能就得有一个统一的类型,所以说我们下一步就是要设计统一的类型。我们可以使用一个数组,并且这个数组还得是最高的类型。那我们就可以新建一个接口IOperation。我们利用数组的下标来进行对功能的选择。普通用户的菜单也同理。

    public AdminiUser(String name) {super(name);this.iOperations = new IOperation[] {new ExitSystem(),new FindBook(),new AddBook(),new DeleteBook(),new DisplayBook()};}

        当我们选择用户并进入菜单界面之后,我们就需要调用方法来对我们的功能进行实现。下面的方法通过调用就可以帮助我们实现时调用管理员还是普通用户。因为我们已经在BooList类里面实现了一个数组,所以我们直接可以把Book类换成BooList类,当然因为两个对象在不同包里面,我们就需要在每个功能里面导入"import book.BooList;"。

public interface IOperation {void work(BooList books);
}public void doOperation(int choice, BooList books){IOperation iOperation = this.iOperations[choice];iOperation.work(books);}

 下面我们就可以给成员变量赋值了。

public BooList() {this.books = new Book[DEFAULT_SIZE];this.books[0] = new Book("骆驼祥子","老舍",26,"小说",false);this.books[1] = new Book("雷雨","曹禺",24,"戏剧",true);this.books[2] = new Book("再别康桥","徐志摩",19,"诗歌",false);this.books[3] = new Book("五猖会","鲁迅",21,"散文",false);
}

六、业务逻辑

      我们基本的框架已经搭建好了,下面我们该实现我们的业务逻辑。下面我们分别实现查找、借阅、归还的业务。 

public class FindBook implements IOperation{@Overridepublic void work(BooList booList) {System.out.println("查找图书...");Scanner sca = new Scanner(System.in);String name = sca.nextLine();1.先确定  当前数组当中 有效的书籍个数int currentSize = booList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = booList.getBook(i);if(book.getTitle().equals(name)) {System.out.println("找到这本书籍了,书籍内容如下:");System.out.println(book);return;}}System.out.println("没有你要找的书籍。");}
}
public class ExitSystem implements IOperation{@Overridepublic void work(BooList books) {System.out.println("退出系统...");int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {
//            books[i] = null;books.setBooks(i,null);}System.exit(0);}
}
public class BorrowBook implements IOperation{@Overridepublic void work(BooList books) {System.out.println("借阅图书...");System.out.println("请输入你要借阅的图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//1.先遍历数组 查找是否存在要借阅的图书int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = books.getBook(i);if(book.getTitle().equals(name)) {//2.如果存在 检查 是否已经被借出if (book.isBeBorrowed()) {System.out.println("这本书已经被借出了!");} else {//3. 如果没有借出 可以借book.setBeBorrowed(true);System.out.println(book);System.out.println("借阅成功!!");}return;}}//4.如果不存在 则不能借阅System.out.println("没有你要找的这本书,无法借阅!!");}
}

七、完整代码

import book.BooList;
import user.AdminiUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User Login() {Scanner sca = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = sca.nextLine();System.out.println("请输入你的身份:1.管理员  2.普通用户");int choice = sca.nextInt();if(choice == 1){return new AdminiUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {BooList booList = new BooList();User user = Login();int choice = user.menu();user.doOperation(choice,booList);}
}

package book;public class Book {private String title;//书籍名称private String author;//作者private int price;//价格private String type;//类型private boolean BeBorrowed;//是否被借出public Book(String title, String author, int price, String type, boolean beBorrowed) {this.title = title;this.author = author;this.price = price;this.type = type;BeBorrowed = beBorrowed;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}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 isBeBorrowed() {return BeBorrowed;}public void setBeBorrowed(boolean beBorrowed) {BeBorrowed = beBorrowed;}@Overridepublic String toString() {return "Book{" +"title='" + title + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", BeBorrowed=" + BeBorrowed +'}';}public boolean beBorrowed(){return isBeBorrowed();}
}
package book;public class BooList {private Book[] books;//存放书籍private static final int DEFAULT_SIZE = 10;private int usedSize; // 有效书籍的个数public BooList() {this.books = new Book[DEFAULT_SIZE];this.books[0] = new Book("骆驼祥子","老舍",26,"小说",false);this.books[1] = new Book("雷雨","曹禺",24,"戏剧",true);this.books[2] = new Book("再别康桥","徐志摩",19,"诗歌",false);this.books[3] = new Book("五猖会","鲁迅",21,"散文",false);this.usedSize = 3;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public Book getBook(int pos){return books[pos];}public void setBooks(int pos,Book book) {books[pos] = book;}
}
package user;import book.BooList;
import book.Book;
import operation.IOperation;public abstract class User {public String name;public IOperation[] iOperations;public User(String name){this.name = name;}public abstract int menu();public void doOperation(int choice, BooList books){
//       return this.iOperations[choice];IOperation iOperation = this.iOperations[choice];iOperation.work(books);}
}
package user;import operation.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOperations = new IOperation[]{new ExitSystem(),new FindBook(),new BorrowBook(),new ReturnBook()};}@Overridepublic 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 sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}
}
package user;import book.Book;
import operation.*;import java.util.Scanner;public class AdminiUser extends User{public AdminiUser(String name) {super(name);this.iOperations = new IOperation[] {new ExitSystem(),new FindBook(),new AddBook(),new DeleteBook(),new DisplayBook()};}@Overridepublic 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("4.显示图书");System.out.println("0.退出系统");System.out.println("****************************");Scanner sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}
}
package operation;import book.BooList;
import book.Book;public interface IOperation {void work(BooList books);
}
package operation;
import book.BooList;
import book.Book;public class AddBook implements IOperation{@Overridepublic void work(BooList books){System.out.println("新增图书...");}
}
package operation;
import book.BooList;
import book.Book;import java.util.Scanner;public class BorrowBook implements IOperation{@Overridepublic void work(BooList books) {System.out.println("借阅图书...");System.out.println("请输入你要借阅的图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//1.先遍历数组 查找是否存在要借阅的图书int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = books.getBook(i);if(book.getTitle().equals(name)) {//2.如果存在 检查 是否已经被借出if (book.isBeBorrowed()) {System.out.println("这本书已经被借出了!");} else {//3. 如果没有借出 可以借book.setBeBorrowed(true);System.out.println(book);System.out.println("借阅成功!!");}return;}}//4.如果不存在 则不能借阅System.out.println("没有你要找的这本书,无法借阅!!");}
}
package operation;
import book.BooList;
import book.Book;public class ExitSystem implements IOperation{@Overridepublic void work(BooList books) {System.out.println("退出系统...");int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {
//            books[i] = null;books.setBooks(i,null);}System.exit(0);}
}

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

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

相关文章

系统架构师考试极限18天备考复盘(2024年11月)

前言 写下这篇复盘笔记的时候还没有出成绩。目前泽崽还是在读研究生&#xff0c;在经过 大概2周多个全日 的极限备考之后&#xff0c;于11月10日参加了软考的系统架构师考试&#xff08;高级&#xff09;。目前对于“基础知识-案例分析-论文”的估分预期大概是&#xff1a;55-…

Unity肢体控制(关节控制)

前面的基础搭建网上自己搜&#xff0c;我这个任务模型网上也有&#xff0c;可以去官网看看更多模型&#xff0c;这里只讲述有模型如何驱动肢体的操作方式 第一步&#xff1a;创建脚本 第二步&#xff1a;创建Rig Builder 建空容器 加部件&#xff08;Rig&#xff09;,加了之后…

用pandoc工具实现ipynb,md,word,pdf之间的转化

Pandoc 是一个强大的工具&#xff0c;可以实现多种文件格式之间的转换&#xff0c;包括 Jupyter Notebook (.ipynb)、Markdown (.md)、Word (.docx)、PDF 等格式。以下是具体的实现方法&#xff1a; 1. 安装 Pandoc 确保已安装 Pandoc&#xff1a; Linux: sudo apt install p…

二叉树遍历的非递归实现和复杂度分析

一&#xff0c;用栈实现二叉树先序遍历 1&#xff0c;原理 我用自己的口水话解释一下&#xff1a;准备一个栈&#xff0c;从根节点开始&#xff0c;先判断栈是否为空&#xff0c;如果否&#xff0c;就弹出一个元素&#xff0c;对弹出元素进行自定义处理&#xff0c;再将它的左…

【数据结构】什么是链栈?

在数据结构中&#xff0c;链栈&#xff08;Linked Stack&#xff09;是基于链表实现的一种栈结构&#xff0c;它在许多计算任务中有着广泛应用。对于初学者&#xff0c;理解链栈的概念、操作方式以及应用场景可以帮助我们更好地掌握数据结构的相关知识。在本篇文章中&#xff0…

Spring Boot编程训练系统:从概念到实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

redis序列化数据查询

可以看到是HashMap&#xff0c;那么是序列化的数据 那么我们来获得反序列化数据 import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import redis.clients.jedis.Jedis;public class RedisDeserializeDemo {public static…

PostgreSQL物化视图详解

物化视图简介 物化视图的产生背景与概念 产生背景 随着数据库规模的增大和查询复杂性的提高&#xff0c;数据库查询的性能问题变得越来越突出。为了优化查询性能&#xff0c;数据库系统引入了物化视图&#xff08;Materialized View&#xff09;的概念。物化视图是一种预先计…

球差控制操作数【ZEMAX操作数】

在光学设计中&#xff0c;对于球差的控制是必要的&#xff0c;那么在zemax中如何控制球差的大小&#xff0c;理解球差&#xff0c;以及使用相应操作数控制球差&#xff1b; 在这篇中主要写如何使用zemax操作数去控制或者消除球差&#xff0c;对球差进行简单的描述&#xff0c;之…

使用 FastAPI 和 Tortoise ORM 构建高效的异步应用:完整指南

在现代 Web 开发中&#xff0c;选择合适的框架和工具对构建高效的应用至关重要。FastAPI 作为一个快速、现代的 Web 框架&#xff0c;以其异步特性和对 Python 类型提示的支持而备受欢迎。而 Tortoise ORM 则是一个适用于异步应用的轻量级 ORM&#xff0c;特别适合与 FastAPI 结…

学习threejs,使用TWEEN插件实现动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PLYLoader PLY模型加…

sql中in()方法查询参数过多处理小记

Springboot 多线程分批切割处理 大数据量List集合 &#xff0c;实用示例 Java使用多线程批次查询大量数据(Callable返回数据)方式 问题背景 业务要求对未完工的几十万甚至百万工单进行发短信提醒以及消息通知。所以每次查询需要将这海量数据查询出来。如果使用单线程&#xf…

前端 JS 实用操作总结

目录 1、重构解构 1、数组解构 2、对象解构 3、...展开 2、箭头函数 1、简写 2、this指向 3、没有arguments 4、普通函数this的指向 3、数组实用方法 1、map和filter 2、find 3、reduce 1、重构解构 1、数组解构 const arr ["唐僧", "孙悟空&quo…

传奇996_19——龙岭总结

功能&#xff1a; 切割 切割属性&#xff1a; 即人物属性&#xff0c;可以设置临时属性或者永久属性&#xff0c;龙岭使用的是临时属性&#xff0c;所谓临时就是存在有效期&#xff0c;龙岭设置的有效期是123456789秒&#xff0c;即1428.89802天。 龙岭写法&#xff08;倒叙…

从0开始学习--Day26--聚类算法

无监督学习(Unsupervised learning and introduction) 监督学习问题的样本 无监督学习样本 如图&#xff0c;可以看到两者的区别在于无监督学习的样本是没有标签的&#xff0c;换言之就是无监督学习不会赋予主观上的判断&#xff0c;需要算法自己去探寻区别&#xff0c;第二张…

pytest在conftest.py中实现用例执行失败进行截图并附到allure测试报告

conftest.py文件简介 conftest.py文件用于定义共享设置、夹具和钩子函数。 可以跨.py文件调用&#xff0c;有多个.py文件调用时&#xff0c;可让conftest.py只调用了一次fixture&#xff0c;或调用多次fixture&#xff1b; conftest.py与运行的用例要在同一个pakage下&#xf…

矩阵数组转置

#include<stdio.h> int main() {int arr1[3][4];//三行四列变成四行三列int arr2[4][3];for(int i0;i<3;i)//三行{for(int j0;j<4;j)//四列{scanf("%d",&arr1[i][j]);//录入}}for(int i0;i<3;i)//转置{for(int j0;j<4;j){arr2[j][i]arr1[i][j]…

GNN初探

测试了下网上找的一篇代码&#xff0c;运行成功~ # import sys # print(sys.path)import torch import torch.nn.functional as F from torch_geometric.nn import GCNConv from torch_geometric.datasets import Planetoid# 加载并预处理Cora数据集 dataset_path ./dataset/…

利用正则表达式批量修改文件名

首先&#xff0c; 我们需要稍微学习一下正则表达式的使用方式&#xff0c;可以看这里&#xff1a;Notepad正则表达式使用方法_notepad正则匹配-CSDN博客 经过初步学习之后&#xff0c;比较重要的内容我做如下转载&#xff1a; 元字符是正则表达式的基本构成单位&#xff0c;它们…

rust高级特征

文章目录 不安全的rust解引用裸指针裸指针与引用和智能指针的区别裸指针使用解引用运算符 *&#xff0c;这需要一个 unsafe 块调用不安全函数或方法在不安全的代码之上构建一个安全的抽象层 使用 extern 函数调用外部代码rust调用C语言函数rust接口被C语言程序调用 访问或修改可…