【JavaSE】图书管理系统

目录

  • 最终效果
  • book包
    • Book类
    • BookList类
  • user包
    • User类
    • AdmiUser类(管理员类)
    • NormalUser类(普通用户类)
  • opeeration包
    • IOperation接口
    • FindOpertion类(查找操作)
    • AddOpertion类(增加操作)
    • DeletOpertion类(删除操作)
    • BorrowOpertion类(借阅操作)
    • ReturnOpertion 类(归还操作)
    • ShowOpertion类(展示操作)
    • ExitOpertion类(退出操作)
  • Main类
  • 最终的关系图

在这里插入图片描述

最终效果

图书管理系统

book包

该包中有两个类,用来对书进行管理。

Book类

从开头视频可以看见,每本书有书名,作者,类型,价格,是否借出。我们将它们定义出来,并有快捷键获得get和set方法。
在生成一个构造方法,含书名,作者,类型,价格。
然后再快捷键重写Object的equals方法,重写toString方法。
注意:
因为直接重写的equals方法是对所有成员变量都进行对比,但是我们不需要对比借出状态(如果对比了那还怎么进行借阅和归还操作)。
还有toString方法我们要将借出的boolean类型转换为是否借出输出,就需要改为3目操作符( (this.isBorrowed)?", 已借出":", 未借出")

最终该类代码就是:

package book;

import java.util.Objects;
public class Book {
    private String name;
    private String author;
    private String type;
    private int price;
    private boolean isBorrowed;

    public Book(String name, String author, String type, int price) {
        this.name = name;
        this.author = author;
        this.type = type;
        this.price = price;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    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 String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return price == book.price && Objects.equals(name, book.name) && Objects.equals(author, book.author) && Objects.equals(type, book.type);
    }


    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", type='" + type + '\'' +
                ", price=" + price +
                ( (this.isBorrowed)?", 已借出":", 未借出")+
                '}';
    }
}

BookList类

在这个类中我们就将书给管理起来(简易顺序表),所以成员就用一个Book数组来存书,在用一个usedSize来表示存入书的数目,提供get和set方法。并在构造方法中初始化几本书。

BookList类最终代码:

package book;
public class BookList {
    private int usedSize;
    Book[] books = new Book[10];

    public int getUsedSize() {
        return usedSize;
    }

    public BookList() {
        this.books[0] = new Book("西游记","吴承恩","小说",66);
        this.books[1] = new Book("红楼梦","曹雪芹","小说",77);
        this.books[2] = new Book("三国演义","罗贯中","小说",88);
        this.books[3] = new Book("坤拳录","cxk","修仙秘籍",25);
        this.usedSize = 4;//在创建书架时直接默认存在3本书
    }

    public Book[] getBooks() {
        return books;
    }

    public void setBooks(Book[] books) {
        this.books = books;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
}

user包

该包用来管理使用者。含有3个类,抽象类User来作为管理员类和普通用户类的父类抽取共性。

User类

每一个管理员和普通用户都有名字,还有展示效果中选择了自己身份后会跳出菜单来让你选择操作。再用一个方法来表示调用的操作(因为我们将每一个操作封装为一个类来操作),用IOpertion数组来存入子类的操作。

User类最终代码:

package user;

import book.BookList;
import operation.IOperation;
public abstract class User {
    String name;
    IOperation[] iOperations;
    public abstract int menu();
    public abstract void doOpertion(int choice, BookList bookList);
    public User(String name) {
        this.name = name;
    }
}

AdmiUser类(管理员类)

该类继承User类并且将父类的抽象方法重写,在该方法中调用对应类的具体工作方法(自己实现的work方法)。并且在自己的构造方法中将IOpertion接口实现的数组初始化(根据提供的操作对应的数字,数字对应下标初始为对应操作实现的类)。

AdmiUser类最终代码:

package user;

import book.BookList;
import operation.*;

import java.util.Scanner;

import java.util.Scanner;
public class AdmiUser extends User  {
    public AdmiUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOpertion(),
                new FindOpertion(),
                new AddOpertion(),
                new DeletOpertion(),
                new ShowOpertion()
        };

    }
    @Override
    public void doOpertion(int choice, BookList bookList){
        this.iOperations[choice].work(bookList);
    }
    @Override
    public int menu() {
        int choice = -1;
        while(true) {
            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("-----------------------------");
            System.out.println("请输入您的操作");
            Scanner scanner = new Scanner(System.in);
            choice = scanner.nextInt();
            if(choice >=0 && choice <= 4){
                break;
            }else {
                System.out.println("输入错误");
            }
        }
        return choice;
    }
}

NormalUser类(普通用户类)

在该类中与管理员类实现一致,只是在设计实现自己的操作时改一下就好。

NormalUser类最终代码:

package user;

import book.BookList;
import operation.*;

import java.util.Scanner;
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOpertion(),
                new FindOpertion(),
                new BorrowOpertion(),
                new ReturnOpertion(),
                new ShowOpertion()
        };
    }

    @Override
    public int menu() {
        int choice = -1;
        while(true) {
            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("-----------------------------");
            System.out.println("请输入您的操作");
            Scanner scanner = new Scanner(System.in);
            choice = scanner.nextInt();
            if(choice >=0 && choice <= 4){
                break;
            }else {
                System.out.println("输入错误");
            }
        }
        return choice;
    }

    @Override
    public void doOpertion(int choice, BookList bookList) {
        this.iOperations[choice].work(bookList);
    }
}

opeeration包

在改包中实现具体的操作,对书的增加,删除,借阅,归还,查找,展示,退出程序。这7个类在加上接口。

IOperation接口

这个接口就抽取一个work的共性方法。
最终代码:

package operation;

import book.BookList;

public interface IOperation {
    void work(BookList bookList);
}

FindOpertion类(查找操作)

在该类中实现IOpertion接口,实现work方法,
先将要查找的书用临时变量存起来,然后遍历书架已有的书看是否有这本书,有就打印。

FindOpertion类最终代码:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入要查找书的书名:");
        Scanner scanner = new Scanner(System.in);
        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 book = new Book(name,author,type,price);

        //看这本书是否已经存在
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.getBooks()[i].equals(book)){
                System.out.println(bookList.getBooks()[i].toString());
                return;
            }
        }

        System.out.println("没有该书");
    }
}

AddOpertion类(增加操作)

该操作与查找操作实现一致,只是在找到后就告诉已经有这本书了,没找到就添加,并将usedSize加1.

AddOpertion类最终代码

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入要添加书的书名:");
        Scanner scanner = new Scanner(System.in);
        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 book = new Book(name,author,type,price);

        //看这本书是否已经存在
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.getBooks()[i].equals(book)){
                System.out.println("该书已经存在");
                return;
            }
        }
        //存入
        bookList.getBooks()[bookList.getUsedSize()] = book;
        bookList.setUsedSize(bookList.getUsedSize() + 1);
        System.out.println("添加成功");
    }
}

DeletOpertion类(删除操作)

该操作与查找操作实现一致,只是在找到后记录这个下标,并且再用一个循环(注意结束条件)用后面的书覆盖前面的,将usedSize减1,没找到就输出没有该书。

DeletOpertion类最终代码

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DeletOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入要删除书的书名:");
        Scanner scanner = new Scanner(System.in);
        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 book = new Book(name,author,type,price);

        //看这本书是否已经存在,记住位置
        int now = -1;
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.getBooks()[i].equals(book)){
                now = i;
                break;
            }
        }
        //覆盖
        if(now != -1){
            for (int i = now; i < bookList.getUsedSize() - 1; i++) {
                bookList.getBooks()[i] = bookList.getBooks()[i+1];
            }
            bookList.setUsedSize(bookList.getUsedSize() - 1);
            System.out.println("删除成功");
        }else{
            System.out.println("没有该书");
        }
    }
}

BorrowOpertion类(借阅操作)

该操作与查找操作实现一致,只是在找到(这里的找到指有这本书并且状态是未借出)后就将这本书的状态改为已借出(将isBorrowed改为true),有但是已被借出就输出该书已被借出,没找到就输出没有。

BorrowOpertion类最终代码:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入要借阅书的书名:");
        Scanner scanner = new Scanner(System.in);
        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 book = new Book(name,author,type,price);

        //看这本书是否有并未被借出,有就改状态
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.getBooks()[i].equals(book)
            && !bookList.getBooks()[i].isBorrowed()){

                bookList.getBooks()[i].setBorrowed(true);
                System.out.println("借阅成功");
                return;

            } else if (bookList.getBooks()[i].equals(book)
                    && bookList.getBooks()[i].isBorrowed()) {
                System.out.println("该书以被借出");
                return;
            }
        }
        System.out.println("没有该书");
    }
}

ReturnOpertion 类(归还操作)

该操作与查找操作实现一致,只是在找到(这里的找到指有这本书并且状态是已借出)后就将这本书的状态改为未借出(将isBorrowed改为false),有但是未被借出就输出该书未被借出,没找到就输出没有。

ReturnOpertion 类最终代码:

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入要归还书的书名:");
        Scanner scanner = new Scanner(System.in);
        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 book = new Book(name,author,type,price);
        //看这本书是否有并未被借出
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.getBooks()[i].equals(book)
                    && !bookList.getBooks()[i].isBorrowed()){

                System.out.println("该书并未被借出");
                return;

            } else if (bookList.getBooks()[i].equals(book)
                    && bookList.getBooks()[i].isBorrowed()) {
                bookList.getBooks()[i].setBorrowed(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("没有该书");
    }
}

ShowOpertion类(展示操作)

该类就只需遍历并输出就行。

package operation;

import book.BookList;

public class ShowOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            System.out.println(bookList.getBooks()[i].toString());
        }
    }
}

ExitOpertion类(退出操作)

直接调用退出函数就行

package operation;

import book.BookList;

public class ExitOpertion implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出成功");
        System.exit(0);
    }
}

Main类

在该类中写一个login函数来确定身份向上转型给User.
main主函数将操作串起来:

import book.BookList;
import user.AdmiUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {

    //使用这个函数来确定访问者身份
    private 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 AdmiUser(name);
        } else if (choice == 2) {
            return new NormalUser(name);
        }else {
            System.out.println("输入错误");
            return null;
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();

        User user = login();
        while( user == null){
            user = login();
        }//使用循环保证输入身份正确

        while (true){
        int choice = user.menu();
        user.doOpertion(choice,bookList);
        }
    }
}

最终的关系图

在这里插入图片描述

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

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

相关文章

关于解决双屏幕鼠标移动方向问题

1.点开设置》系统》屏幕 2.分清屏幕标识&#xff0c;一般笔记本为1 3.点击要移动的屏幕&#xff0c;然后按住鼠标左键不方进行移动 感谢您的浏览&#xff0c;希望可以帮到您&#xff01;

探索多模态预训练:MAnTiS、ActionCLIP、CPT与CoOp的Prompt技巧

上一篇博文整理了 预训练新范式&#xff08;Prompt-tuning&#xff0c;Prefix-tuning&#xff0c;P-tuning&#xff09; &#xff0c;主要是围绕NLP上的成果&#xff0c;具体的概念本文也不做过多赘述。本篇文章将主要整理几篇有代表性的Prompt方法在多模态领域中的应用。 Mult…

unity使用 MQTT复现plant simulate仿真

unity使用 MQTT复现plant simulate仿真 一、plant simulate端配置 1、plant simulate MQTT组件配置,该组件在类库的信息流类目下,端口不变,填写ip即可; 2、设备配置界面,在控件入口和出口处各挂一个脚本,当物料出入该设备时会分别触发执行这两个脚本,粘贴如下代码; E…

视频怎么压缩变小?最佳视频压缩器

即使在云存储和廉价硬盘空间时代&#xff0c;大视频文件使用起来仍然不方便。无论是存储、发送到电子邮件帐户还是刻录到 DVD&#xff0c;拥有最好的免费压缩软件可以确保您快速缩小文件大小&#xff0c;而不必担心视频质量下降。继续阅读以探索一些顶级最佳 免费视频压缩器选项…

小红书矩阵管理系统:多账号运营的智能解决方案

随着社交媒体的多元化发展&#xff0c;内容创作者和品牌商越来越需要一个能够高效管理多个账号的系统。小红书作为国内领先的生活分享平台&#xff0c;其矩阵管理系统应运而生&#xff0c;为用户带来了多账号发布、批量剪辑视频以及一键分发的便捷功能。本文将详细介绍小红书矩…

必看!微信小程序必备证书!

微信小程序必备SSL证书。在日益增长的数字经济中&#xff0c;微信小程序已成为商家与消费者之间重要的交互平台。由于其便捷性和广泛的用户基础&#xff0c;越来越多的企业选择通过小程序来提供服务。然而&#xff0c;在开发和部署微信小程序时&#xff0c;确保数据安全是一个不…

数据结构笔记之树常考性质6

总结&#xff1a; 具有n个结点的m叉树的最小高度可以通过计算并向下取整得到。高度最小时的情况是所有结点都有m个孩子。

计算机前端面试题总结-暑期实习(答案补充2)

目录 技术方面 二、js 1.js数据类型 1&#xff09;值类型(基本类型) 2&#xff09;引用数据类型&#xff08;对象类型&#xff09; ​编辑 2.判断数据类型是否为数组类型 1&#xff09;Array.isArray() 2&#xff09;instanceof操作符 3&#xff09; Object.prototyp…

飞猪惹怒12306,一张火车票让第三方平台耍尽手段……

小柴已经记不清铁路12306是多少次发出提醒&#xff0c;似乎每一次出行高峰&#xff0c;都会提醒一次。 比如一再强调&#xff0c;购买加速包、付费成为会员就能优先出票&#xff0c;找朋友助力砍一刀&#xff0c;就能获得更高的出票概率……都是假的。‍‍ 因为&#xff0c;铁…

PostgreSQL 中如何处理数据的并发更新冲突解决?

文章目录 一、并发更新冲突的场景二、PostgreSQL 中的并发控制机制&#xff08;一&#xff09; 封锁机制&#xff08;二&#xff09; 事务隔离级别 三、并发更新冲突的解决方法&#xff08;一&#xff09; 重试机制&#xff08;二&#xff09; 使用乐观并发控制&#xff08;三&…

使用机器学习 最近邻算法(Nearest Neighbors)进行点云分析

使用 NearestNeighbors 进行点云分析 在数据分析和机器学习领域&#xff0c;最近邻算法&#xff08;Nearest Neighbors&#xff09;是一种常用的非参数方法。它广泛应用于分类、回归和聚类分析等任务。下面将介绍如何使用 scikit-learn 库中的 NearestNeighbors 类来进行点云数…

打开excel时弹出stdole32.tlb

问题描述 打开excel时弹出stdole32.tlb 如下图&#xff1a; 解决方法 打开 Microsoft Excel 并收到关于 stdole32.tlb 的错误提示时&#xff0c;通常意味着与 Excel 相关的某个组件或类型库可能已损坏或不兼容。 stdole32.tlb 是一个用于存储自动化对象定义的类型库&#x…

【解读大模型(LLM)的token】

文末有福利&#xff01; 当人们谈论大型语言模型的大小时&#xff0c;参数会让我们了解神经网络的结构有多复杂&#xff0c;而token的大小会让我们知道有多少数据用于训练参数。 正像陆奇博士所说的那样&#xff0c;大型语言模型为从文本生成到问题回答的各种任务提供了令人印象…

2024年的设计理念革新:快速获取设计趋势的资源集合!

随着2024年第三季度开始&#xff0c;今年的设计趋势也逐渐出现。与2023 年设计相比&#xff0c;趋势变化空间不大&#xff0c;大部分是在 2023 年度设计趋势的延伸和发展。即使趋势不会一直改变&#xff0c;了解趋势对设计师来说仍然非常重要。接下来&#xff0c;本文将与你分享…

拥抱应用创新,拒绝无谓的模型竞争

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何查询并下载韩国签证

登录大韩民国签证门户网站&#xff08;https://www.visa.go.kr&#xff09;&#xff0c;点击“查询/签发”- “办理进度查询及打印”。 2) 输入护照号码、英文姓名及出生日期后点击查询。 3) 若签证通过&#xff0c;办理状态信息栏下面会显示签证信息。 4&#xff09;点击“签证…

大数据信用评分太低,是什么原因引起的?

在大数据时代&#xff0c;个人的大数据信用评分变得尤为重要。它不仅影响着我们能否顺利地获得贷款、信用卡等金融服务&#xff0c;还在很多方面影响着我们的日常生活。那么&#xff0c;哪些原因可能会导致我们的大数据信用评分降低呢?本文将对此进行详细的总结&#xff0c;一…

防火墙安全策略用户认证综合实验

实验拓扑&#xff1a; 实验要求&#xff1a; 1&#xff1a;DMz区内的服务器&#xff0c;办公区仅能在办公时间内(9:00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2&#xff1a;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3&#xff1a;办公…

ARM_Linux驱动开发——字符设备驱动开发(上)

目录 一、Linux驱动开发思维 二、Linux驱动开发分类 三、“ ARM_Linux驱动开发——字符设备驱动开发 ” 字符设备驱动简介 前言 在分享Linux驱动开发之前&#xff0c;我想带大家首先回顾一下裸机驱动开发和Linux驱动开发的区别。 1、运行环境和操作系统&#xff1a; 裸机驱…

【无需公网IP】在树莓派上搭建Web站点

目录 1.概述 2.使用 Raspberry Pi Imager 安装 Raspberry Pi OS 3.设置 Apache Web 服务器 3.1测试 web 站点 3.2安装静态样例站点 3.3将web站点发布到公网 3.4安装 Cpolar 3.5cpolar进行token认证 3.6生成cpolar随机域名网址 3.7生成cpolar二级子域名 3.8将参数保存…