零基础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.xdnf.cn/news/16960.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【每日题解】3239. 最少翻转次数使二进制矩阵回文 I

给你一个 m x n 的二进制矩阵 grid 。 如果矩阵中一行或者一列从前往后与从后往前读是一样的&#xff0c;那么我们称这一行或者这一列是 回文 的。 你可以将 grid 中任意格子的值 翻转 &#xff0c;也就是将格子里的值从 0 变成 1 &#xff0c;或者从 1 变成 0 。 请你返回 …

vue面试题9|[2024-11-15]

问题1&#xff1a;scoped原理 1.作用&#xff1a;让样式在本组件中生效&#xff0c;不影响其他组件 2.原理&#xff1a;给节点新增自定义属性&#xff0c;然后css根据属性选择器添加样式。 问题2&#xff1a;让css只在当前组件生效 <style scoped> 问题3&#xff1a;scss…

2024新版pycharm如何切换anaconda虚拟环境

2024新版pycharm如何切换anaconda虚拟环境 不得不说这界面改的真不错&#xff0c;看着很舒服。 回归正题&#xff0c; 导入项目后点击文件>设置&#xff0c;找到解释器。 添加解释器>添加本地解释器 以前是选择conda环境&#xff0c;现在直接就是Virtualenv 环境 看…

Codeforces Round 987 (Div. 2)(前四道)

A. Penchick and Modern Monument 翻译&#xff1a; 在繁华大都市马尼拉的摩天大楼中&#xff0c;菲律宾最新的 Noiph 购物中心刚刚竣工&#xff01;建筑管理方 Penchick 订购了一座由 n 根支柱组成的先进纪念碑。 纪念碑支柱的高度可以用一个由 n 个正整数组成的数组 h 来表示…

探索AI驱动的企业知识库:提升管理效率的新利器

对于企业而言&#xff0c;如何高效管理知识、提升团队协作、加速决策过程&#xff0c;已成为生存与发展的关键。而人工智能(AI)的迅速发展为解决这些问题提供了新的思路和工具。越来越多的企业开始构建AI驱动的知识库&#xff0c;以实现信息的智能管理与利用。本文将深入探讨AI…

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中&#xff0c;我们通常会将某些常见组件进行二次封装&#xff0c;以便更好地实现特定的业务需求。然而&#xff0c;在封装 Table 组件时&#xff0c;遇到一个问题&#xff1a;Table 内部暴露的方法&#xff0c;在封装之后的组件获取不到。 代码展示为&#xff1a; …

【Framework系列】UnityEditor调用外部程序详解

需求介绍 之前Framework系列有介绍过导表配置工具&#xff0c;感兴趣的小伙伴可以看一看之前的文章《【Framework系列】Excel转Json&#xff0c;配置表、导表工具介绍》。由于导表工具和Unity是两个工程&#xff0c;导表工具不在Unity工程之内&#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…

ui->tableView升序

亮点 //设置可排序ui->tableView->setSortingEnabled(true);ui->tableView->sortByColumn(0,Qt::AscendingOrder); //排序void Widget::initTable() {//设置焦点策略:ui->tableView->setFocusPolicy(Qt::NoFocus);//显示网格线:ui->tableView->se…

Dubbo源码解析-服务导出(四)

一、服务导出 当我们在某个接口的实现类上加上DubboService后&#xff0c;就表示定义了一个Dubbo服务&#xff0c;应用启动时Dubbo只要扫描到了DubboService&#xff0c;就会解析对应的类&#xff0c;得到服务相关的配置信息&#xff0c;比如&#xff1a; 1. 服务的类型&…

NPOI 实现Excel模板导出

记录一下使用NPOI实现定制的Excel导出模板&#xff0c;已下实现需求及主要逻辑 所需Json数据 对应参数 List<PurQuoteExportDataCrInput> listData [{"ItemName": "电缆VV3*162*10","Spec": "电缆VV3*162*10","Uom":…

CVSS4与CVSS3的不同

CVSS最近出版了新的版本CVSS4.0&#xff0c;新的版本与3.1版本有什么不同吗&#xff1f; 它会带来哪些影响&#xff1f;本片文章主要目的是介绍3.1与4.0版本之间有什么不同&#xff0c;以及会带来什么变化。 再进入比较之前&#xff0c;先简单介绍一下什么是CVSS。 CVSS&…

【返璞归真】-标准化

在第一个维度数值很大、第二个维度数值很小的情况下&#xff0c;为了让聚类和回归等统计方法更有效地处理数据&#xff0c;需要对数据进行预处理&#xff0c;主要考虑以下几方面&#xff1a; 1. 数据标准化或归一化 由于两个维度的数值量级差异很大&#xff0c;直接使用这些数…

linux文件切割

切割&#xff0c;每个文件切割3.5G split -b 3358m file.tar.gz yourfile_part_ 合并 cat yourfile_part_* > test.tar.gz 比对md5sum值&#xff0c;一致

超详细:索引介绍(易懂!)

索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 索引的作用就相当于书的目录。打个比方: 我们在查字典的时候&#xff0c;如果没有目录&#xff0c;那我们就只能一页一页的去找我们需要查的那个字&#xff0c;速度很慢。如果…

智能化护士排班系统的设计与实现(文末附源码)

自动排班-护士(分白班|夜班) 当服务器启动时检测需要自动排班,自动开始排班的算法执行 获得本周的所有日期,例如2023-01-29.....2023-02-04依次对每个科室&#xff0c;从第一天开始,逐天进行排班&#xff0c;分别设置两个二个数组&#xff0c;day[7];night[7]分别记忆一周内每…

C语言指针初步(1)

本期重点&#xff1a;指针的性质、本质和作用 指针是C语言变量的一种&#xff0c;总的来说&#xff0c;它和int或者char之类的变量类型没有什么显著的区别&#xff0c;唯一的重点在于&#xff0c;指针实际上是地址。可以说指针就是地址&#xff0c;它是一个专门用于存放地址的变…

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

Java项目:校园宿舍管理系统(优质版)(Springboot3+Maven+Mybatis Plus+Vue3+ Element Plus+Mysql)

项目介绍 : Springboot3MavenMybatis PlusVue3 Element PlusMysql 开发的前后端分离的校园宿舍管理系统 项目演示: https://www.bilibili.com/video/BV16UmoYWEVR/ 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#x…