图书管理系统的简单实现

news2024/11/25 20:49:44

文章目录

  • 图书系统逻辑分析
  • 各种操作功能的实现
  • 完整代码

   个人主页

  JavaSE专栏

图书系统逻辑分析

该程序设置有三个包,user 包,book 包,operation包。

  • book包中包含对于书的一些信息和操作;
  • operation包中包含有对 书 的所有操作功能;
  • user包中包含用户的一些信息和操作
    在这里插入图片描述

 抽离整个图书管理系统的对象: 用户 、 书、 书架
 book包中包含对于书的一些信息和操作
 book包中存在有 Book类,BookList类


 Book类中,有图书的属性:图书名,作者,类型,价格,是否被借出。
 Book类中的成员变量都被 private 修饰,所以使用 Getter and Setter 来访问和设置 成员变量的值。Book类中也重写了 toString 方法,用于后序显示图书的操作,这里注意重写的toString方法中,关于 isBorrowed 的修改,使用 isBorrowed == true ? "已借出" : "未借出" 动态表示图书状态

package book;

public class Book {
    private String name;
    private String author;
    private String type;
    private float price;
    private boolean isBorrowed;

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

    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 float getPrice() {
        return price;
    }

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

    public boolean isBorrowed() {
        return isBorrowed;
    }

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

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

 BookList类中 定义books数组用来存储图书,初始化数组容量为10,后序添加图书操作中如果数组满了,再进行扩容;
 定义 usedSize表示数组中有效图书的数量;使用构造方法对数组books初始化,即每次创建一个bookList 对象books数组里面都是默认存储三本书,默认有效图书数量为3
 定义findBook方法,用来查找 pos下标位置的图书并返回,后序主要被操作图书的各种类所调用
 定义setBook方法,用来新增一本图书
 定义getUsedSize方法,用来得到数组中有效图书的数量,后序主要被操作图书的各种类所调用
 定义setUsedSize方法,用来更改数组中有效图书的数量,后序被 删除图书的类 (DeltOperation) 和 新增图书的类(AddOperation) 中所调用

package book;

import java.util.Arrays;

public class BookList {
    private Book[] books = new Book[10];//初始化数组容量为10
    private int usedSize;//书架上的有效书的数量
    //默认每次都是三本书
    public BookList() {
        books[0] = new Book("三国演义","罗贯中","小说",10);
        books[1] = new Book("西游记","吴承恩","小说",15);
        books[2] = new Book("红楼梦","曹雪芹","小说",20);
        usedSize = 3;
    }

    /**
     * 找到 pos 位置的书并返回
     * @param pos
     * @return
     */
    public Book findBook(int pos) {
        return books[pos];
    }

    /**
     * 在 pos 位置新增一本书
     * @param pos
     * @param book
     */
    public void setBook(int pos, Book book) {
        //如果满了,进行扩容
        if(usedSize == books.length) {
            books = Arrays.copyOf(books,2*books.length);
        }
        books[pos] = book;
        usedSize++;
    }

    /**
     * 获取书架上的有效书本的个数并返回
     * @return
     */
    public int getUsedSize() {
        return usedSize;
    }

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

}

operation包中包含有对 书 的所有操作功能
  operation包中定义有一个Ioperation接口,和AddOperation类,FindOperation类,BorrowedOperation类,ReturnOperation类,ShowOperation类,ExitOperation类,DeltOperation类。这些类都对应着增添图书功能,查找图书功能,借阅图书功能,归还图书功能,显示图书功能,退出图书系统功能,删除图书功能。
Ioperation接口中定义work(BookList bookList)方法(此方法是抽象方法),表示对图书的操作
让所有类实现Ioperation接口,按照需求重写work方法。

【这里使用接口的原因:后续会把用户操作菜单中的各种操作放入一个数组中,数组是相同元素的集合,把这些操作类都实现Ioperation接口,那么数组的元素类型就可以设置为Ioperation,满足了数组的定义。如果不使用接口,那么这些类就无法放入同一个数组中,因为每个元素的类型都不一样】

package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("AddOperation::");
    }
}
package operation;

import book.BookList;

import java.util.Scanner;

public class BorrowedOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
       System.out.println("BorrowedOperation::");
    }
}
package operation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
       System.out.println("DelOperation::");
    }
}
package operation;
import book.BookList;

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
    System.out.println("ExitOperation::");
    }
}
package operation;
import book.BookList;
import java.util.Scanner;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {System.out.println("FindOperation::");
    }
}

package operation;
import book.BookList;
import java.util.Scanner;

public class ReturnOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
    System.out.println("ReturnOperation::");
    }
}
package operation;
import book.Book;
import book.BookList;

public class ShowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
       System.out.println("ShowOperation::");
    }
}

user包中包含用户的一些信息和操作
 user包中有User类, AdiminUser类,NormalUser类,其中AdiminUser类 和 NormalUser类都继承了User类,为了满足选择不同的身份,进而打印出不同的menu菜单,我们在父类User里定义一个menu()方法,子类按照需求重写menu()方法
【注意】按照上述描述,可以把User设置成抽象类,把没有具体实现的menu方法设置为抽象方法

 打印出菜单后,可以把操作的功能放入一个数组中,但是不同用户会显示不同的操作功能,因此数组内容由身份决定,所以如何实现作为不同身份,操作不同的数组? -> 可以在父类User类中定义 array数组,
在子类的构造方法中初始化数组,填充不同的功能元素,这样在选择不同的身份时,在各自的构造方法中就完成了数组内容的初始化。此时的数组内容就会根据身份而创建。

不同身份的数组已经准备好,选择一个数字进行操作
应该这样调用类中的方法: array[choice].work(bookList)
所以可以在User类中定义 doWork(int choice,BookList bookList)方法,用来实现所选择的操作

//         User类
package users;

import book.BookList;
import operation.IOperation;

public abstract class User {
    protected String name;

    protected IOperation[] array;

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public void doWork(int input, BookList bookList) {
        array[input].work(bookList);
    }
}
//       AdiminUser类
package users;

import operation.*;

import java.util.Scanner;

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        array = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };

    }

    @Override
    public 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("❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int input = scanner.nextInt();
        return input;
    }
}
//        NormalUser类
package users;

import operation.*;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        array = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperation(),
                new ReturnOperation()
        };
    }

    @Override
    public 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("❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int input = scanner.nextInt();
        return input;
    }
}

创建 Main类 ,实现登录操作

import book.BookList;
import users.AdminUser;
import users.NormalUser;
import users.User;

import java.util.Scanner;

public class Main {
    public static User login() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        int choice = 0;
        do {
            System.out.println("请选择你的身份: 1:管理员  2:普通用户");
            choice = scanner.nextInt();
            if(choice == 1) {
                return new AdminUser(name);
            }else if(choice == 2){
                return new NormalUser(name);
            }else {
                System.out.println("选择错误,请重新选择(1 or 2)");
            }
        }while(choice != 1 || choice != 2);
        return null;
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();
        while(true) {
            int ret = user.menu();
            user.doWork(ret,bookList);
        }
    }
}

各种操作功能的实现

ShowOperation类 ------显示图书操作

package operation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            System.out.println(bookList.findBook(i));
        }
    }
}

FindOperation类 ------查找图书操作

package operation;

import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入图书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.findBook(i).getName().equals(name)) {
                System.out.println("成功找到该图书,信息如下:");
                System.out.println(bookList.findBook(i));
                return;
            }
        }
        System.out.println("该图书尚未添加...");
    }
}

AddOperation类 ------新增图书操作

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation 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("请输入价格:");
        float price = scanner.nextFloat();
        Book book = new Book(name,author,type,price);
        bookList.setBook(bookList.getUsedSize(), book);
        System.out.println("新增图书成功");
    }
}


DeltOperation类 ------删除图书操作

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class DelOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("请输入将要删除的图书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.findBook(i).getName().equals(name)) {
                for (int j = i+1; j < bookList.getUsedSize(); j++) {
                    Book tmp = bookList.findBook(j-1);
                    tmp = bookList.findBook(j);
                }
                bookList.setUsedSize(bookList.getUsedSize()-1);
                System.out.println("删除图书成功");
                return;
            }

        }
        System.out.println("该图书尚未添加...");
        return;
    }
}

BorrowedOperation类 ------借阅图书操作

package operation;

import book.BookList;

import java.util.Scanner;

public class BorrowedOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入图书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.findBook(i).getName().equals(name)) {
                if(bookList.findBook(i).isBorrowed()) {
                    System.out.println("该图书已被借出...");
                    return;
                }
                bookList.findBook(i).setBorrowed(true);
                System.out.println("借阅图书成功");
                return;
            }
        }
        System.out.println("该图书尚未添加...");
    }
}

ReturnOperation类 ------归还图书操作

package operation;

import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入图书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.findBook(i).getName().equals(name)) {
                if(!bookList.findBook(i).isBorrowed()) {
                    System.out.println("该图书未被借出...");
                    return;
                }
                bookList.findBook(i).setBorrowed(false);
                System.out.println("归还图书成功");
                return;
            }
        }
        System.out.println("该图书尚未添加...");
    }
}

ExitOperation类 ------退出系统操作

package operation;

import book.BookList;

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出程序...");
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            bookList.setBook(i,null);
        }
        System.exit(0);
    }
}

完整代码

---------完整代码请点击 本人码云链接---------




在这里插入图片描述


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

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

相关文章

‘perl‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

‘perl’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 明明已经根据教程安装了perl环境,但是在cmd中依赖报该错误,本章教程提供解决办法。 一、激活perl环境 state shell ActiveState-Perl-5.36.0此时输入perl -v 是可以直接输出perl版本号的。 二、找到perl的执…

想进体制内?到底有哪些路可走?原来有这么多方法

在如今的就业大环境下&#xff0c;体制内工作越来越受到大家的青睐。那么&#xff0c;体制内为何如此受欢迎呢&#xff1f; 一、体制内为何备受青睐 体制内工作首先给人一种强烈的稳定感和安全感。一旦进入体制&#xff0c;你不用时刻担心失业的风险&#xff0c;能够拥有一份长…

安康旅游网站:SpringBoot设计与实现详解

目 录 目 录 I 摘 要 III Abstract IV 第一章 绪论 1 1.1 研究现状 1 1.2 设计原则 1 1.3 研究内容 2 第二章 相关技术简介 1 2.1 JSP技术 1 2.2 Java技术 2 2.3 MYSQL数据库 2 2.4 B/S结构 3 2.5 Spring Boot框架 4 第三章 系统分析 5 3.1可行性分析 5 3.1.1技术可行性 5 3.1.…

阿里云项目启动OOM问题解决

问题描述 随着项目业务的增长&#xff0c;系统启动时内存紧张&#xff0c;每次第一次启动的时候就会出现oom第二次或者第n的时候&#xff0c;就启动成功了。 带着这个疑问&#xff0c;我就在阿里云上提交了工单&#xff0c;咨询为什么第一次提交失败但是后面却能提交成功尼&a…

开挖 Domain - 前奏

WPF App 主机配置 Microsot.Extension.Hosting 一键启动&#xff08;配置文件、依赖注入&#xff0c;日志&#xff09; // App.xaml.cs 中定义 IHost private readonly IHost _host Host.CreateDefaultBuilder().ConfigureAppConfiguration(c > {_ c.SetBasePath(Envi…

基于NERF技术重建学习笔记

NeRF&#xff08;Neural Radiance Fields&#xff09;是一种用于3D场景重建的神经网络模型&#xff0c;能够从2D图像生成逼真的3D渲染效果。它将场景表征为一个连续的5D函数&#xff0c;利用了体积渲染和神经网络的结合&#xff0c;通过学习光线穿过空间时的颜色和密度来重建场…

邮件营销的目的详解:促进销售与业绩增长!

邮件营销的目的效果评估&#xff1f;发不同类型营销邮件的目的&#xff1f; 邮件营销作为一种高效且成本低廉的营销手段&#xff0c;被广泛应用于各行各业。邮件营销的目的不仅仅是简单的信息传递&#xff0c;更是为了促进销售与业绩增长。MailBing将深入探讨邮件营销的目的&a…

01 springboot-整合日志(logback-config.xml)

logback-config.xml 是一个用于配置 Logback 日志框架的 XML 文件&#xff0c;通常位于项目的 classpath 下的根目录或者 src/main/resources 目录下。 Logback 提供了丰富的配置选项&#xff0c;可以满足各种不同的日志需求。需要根据具体情况进行配置。 项目创建&#xff0…

SWOT分析法:企业决策的全方位视角

SWOT分析是商业领域中广泛采用的一种战略规划工具&#xff0c;它通过评估企业的优势&#xff08;Strengths&#xff09;、劣势&#xff08;Weaknesses&#xff09;、机会&#xff08;Opportunities&#xff09;和威胁&#xff08;Threats&#xff09;四个关键维度&#xff0c;帮…

[数据集][目标检测]电力场景输电线路巡检检测数据集VOC+YOLO格式8667张50类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8667 标注数量(xml文件个数)&#xff1a;8667 标注数量(txt文件个数)&#xff1a;8667 标注…

如何迁移 GitLab 服务器:完整指南

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

Kaggle竞赛——灾难推文分类(Disaster Tweets)

目录 1. 准备工作2. 资源导入3. 数据处理4. 绘制词云图5. 数据可视化5.1 词数和字符数可视化5.2 元特征可视化5.3 类别可视化 6. 词元分析6.1 一元语法统计6.2 多元语法统计 7. 命名实体识别8. 推文主题提取9. 构建模型9.1 数据划分与封装9.2 模型训练与验证 10. 模型评估11. 测…

LinkedList和链表之刷题课(下)

1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…

精益思维在新能源汽车研发中的应用体现

近年来&#xff0c;新能源汽车作为绿色出行的重要载体&#xff0c;其研发与生产模式正经历着深刻的变革。精益思维&#xff0c;这一源自制造业的管理理念&#xff0c;正逐步渗透并深刻影响着新能源汽车的研发过程&#xff0c;不仅提升了产品质量与生产效率&#xff0c;还促进了…

CV2通过一组轮廓点扣取图片

代码如下&#xff1a; import cv2 import numpy as np# 读取原始图像 original_image cv2.imread(img.png)# 定义一组轮廓点&#xff08;这里只是示例&#xff0c;你需要根据实际情况替换&#xff09; points np.array([[50, 100], [100, 200], [200, 150], [200, 50], [160…

论文引用收录证明有什么用?

论文收录引用证明通常用于申请学位、职称评定、科研项目申请等需要证明研究成果的场合&#xff0c;当科研工作者需要查询其学术论文在指定数据库中的被收录和被引用情况时&#xff0c;可以委托一级科技查新咨询单位进行检索&#xff0c;并出具加盖公章的检索证明&#xff0c;以…

QT 机器视觉 (3. 虚拟相机SDK、测试工具)

本专栏从实际需求场景出发详细还原、分别介绍大型工业化场景、专业实验室场景、自动化生产线场景、各种视觉检测物体场景介绍本专栏应用场景 更适合涉及到视觉相关工作者、包括但不限于一线操作人员、现场实施人员、项目相关维护人员&#xff0c;希望了解2D、3D相机视觉相关操作…

分布式ID生成策略

文章目录 分布式ID必要性1.UUID2.基于DB的自增主键方案3.数据库多主模式4.号段模式5.Redis6.Zookeeper7.ETCD8.雪花算法9.百度(Uidgenerator)10.美团(Leaf)11.滴滴(TinyID) 分布式ID必要性 业务量小于500W的时候单独一个mysql即可提供服务&#xff0c;再大点的时候就进行读写分…

视频智能分析平台LiteAIServer烟火识别软件引领烟火检测与识别的智能新纪元

随着人工智能技术的飞速进步&#xff0c;视频智能分析技术正以前所未有的深度和广度渗透至安全防护、环境监测等多个关键领域。其中&#xff0c;烟火识别软件LiteAIServer凭借其卓越的烟火检测与识别算法&#xff0c;成为了业界瞩目的焦点。 一、烟火检测&#xff1a;守护公共安…

汽车及零配件企业海量文件数据如何管

汽车行业特点 汽车行业是工业企业皇冠上的一颗明珠&#xff0c;在国民经济中占据着举足轻重的地位。汽车行业具备技术密集、创新速度快、供应链复杂等特点&#xff0c;具体体现为&#xff1a; 技术密集&#xff1a;汽车行业是技术密集型行业&#xff0c;覆盖机械、电子、软件、…