Java_实现图书管理系统

news2024/11/25 21:52:45

目录

前言

框架核心思想

框架的实现

书类和书架类的实现

功能接口实现

功能的声明

父类用户和子类管理员,子类普通用户

Main方法


前言

java图书管理系统的详细解析;从思考到实现,一步步带你学会图书管理系统.

框架核心思想

下图只是一个图书管理系统的初步思考,有个大概就行,不必深究

框架的实现

书类和书架类的实现

首先我们实现书类 

public class Book{
    private String name;//书名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean lend;//是否借出,false表示未借阅,true表示已借阅

	//构造方法
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
		//不用对lend进行初始化,因为默认就是false
    }
}

 实现书架类

public class BookList{
    private Book[] book;//书架,存放书的数组
    private int number;//图书种类个数

    public BookList() {
        this.book = new Book[10];
        //new  Book类存到 数组中
        this.book[0] = new Book("三国演义","罗贯中",33,"名著");
        this.book[1] = new Book("西游记","吴承恩",33,"名著");
        this.book[2] = new Book("红楼梦","曹雪芹",33,"名著");
        this.number = 3;
    }
}

功能接口实现

我们首先应该创建一个接口,让所有功能应用这个接口

然后我们创建一个该接口类型的数组A,接收功能(类似子类继承父类的向上转型)

例如:管理员权限的话  在管理员类中的数组A 就存储 添加,删除,修改,显示等功能

而普通用户权限的话 就在普通用户类中的数组A存储 查找,借阅,归还等功能

 接口实现

public abstract interface IOperation {
    abstract void work(BookList bookList);//让实现这个接口的功能都重写这个方法
    //里面的参数是书架,功能肯定都是对书架进行增,删,查,改等功能
}

功能的声明

根据功能接口实现,我们需要重写 work ,以及主要功能的实现也都是在work中进行的

这里只是对功能的声明,没有实现功能,我们先对功能声明完,创建好框架后最后再对系统进行实现

添加图书功能

public class AddOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("添加图书");
    }
}

借阅图书功能

public class BorrowOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
    }
}

退出系统功能

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
    }
}

以此类推, FindOperation 查找功能,ListAllBooks 展示图书,ReturnOperation 归还图书

RmoveOperation 删除图书, UpdateOperation 修改图书

父类用户和子类管理员,子类普通用户

作为父类的 用户类

public abstract class User {
    protected String name;
    protected IOperation[] iOperations;//可以存放功能的接口数组
    public User(String name) {//构造方法,不过本项目中,输入的姓名没有任何作用
        this.name = name;
    }
    public abstract int menu();//菜单,管理员 和 普通用户的不一样,所以都重写

    public void doOperation(int input, BookList bookList) {//实现功能
        iOperations[input].work(bookList);//input是下标,用下标来访问功能数组中的功能
    }
}

 作为子类的 管理员

//管理员
public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);//把用户名传到父类
        super.iOperations = new IOperation[]{//存储管理员权限的功能
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new RmoveOperation(),
                new ListAllBooks(),
                new UpdateOperation()
        };
    }
    @Override
    public int menu() {
        System.out.println("*****************");
        System.out.println("1. 查找图书");
        System.out.println("2. 新增图书");
        System.out.println("3. 删除图书");
        System.out.println("4. 显示图书");
        System.out.println("5. 修改图书");
        System.out.println("0. 退出系统");
        System.out.println("*****************");
        Scanner scanner = new Scanner(System.in);
        while(true) {
            int input = scanner.nextInt();
            if (input > 5 || input < 0) {
                System.out.println("输入错误,请重新输入!");
                continue;
            }
            return input;
        }
    }
}

作为子类的 普通用户

//普通用户
public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        super.iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }
    @Override
    public 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);
        while(true) {
            int input = scanner.nextInt();
            if (input > 3 || input < 0) {
                System.out.println("输入错误,请重新输入!");
                continue;
            }
            return input;
        }
    }
}

Main方法

首先是让用户输入是管理员或是普通用户,所以我们需要返回类型为User的输入方法,这样可以返回管理员或是普通用户

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 input = scanner.nextInt();
        if (input == 1) {
            return new AdminUser(name);

        }else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();//先初始化书架
        //根据用户输入的身份 来分别实现
        User user = login();//用普通用户和管理员的共同的父类(向上转型),来接收(因为不知道那个)

        while(true) {
            int input = user.menu();//会打印相应的菜单,并返回输入的指令
            user.doOperation(input,bookList);//根据指令来进行相应功能的实现
        }
    }
}

功能实现的铺垫

首先我们需要给 图书类 和 书架类 添加一些 get 和 set的方法(没有get 和 set 就无法获取和更改 类中的值,扩展:一般类中 都是用 get 和 set的方法来获取和更改成员变量的,这样更加安全)

实际程序的开发中,我们是每写一个功能,想到了需要什么,再去相应的类写get或set的

这里是为了更直观地观察,便直接全部写出

图书类 的添加

public class Book{
    private String name;//书名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean lend;//是否借出

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

//===============
//添加部分↓↓↓

    @Override
    public String toString() {//toString的重写,是为了打印图书的时候,按照我们自己的格式来打印
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", " + (lend == true ? "已借出" : "未借出") +
                '}';
    }

    public String getName() {//获取书名,在展示图书功能中需要用到
        return name;
    }

    public void setLend(boolean lend) {//更改借阅情况,在用户借出书或归还书后需要用到
        this.lend = lend;
    }

    public boolean getLend() {//获取借阅情况,在判断图书是否借出时需要用到
        return lend;
    }
}

书架类 的 添加

public class BookList{
    private Book[] book;//书架
    private int number;//图书种类个数

    public BookList() {
        this.book = new Book[10];
        //new 一个 Book类存到 数组中
        this.book[0] = new Book("三国演义","罗贯中",33,"名著");
        this.book[1] = new Book("西游记","吴承恩",33,"名著");
        this.book[2] = new Book("红楼梦","曹雪芹",33,"名著");
        this.number = 3;
    }

//===============
//添加部分↓↓↓

    public Book getBook(int number) {//获取存放书的数组,查找,展示功能都需要用到
        return this.book[number];
    }

    public void setBook(Book book,int number) {//修改存放书的数组,number参数是要修改哪个下标
        this.book[number] = book;
    }

    public int getNumber() {//获取书架上 图书的种类  在遍历书架查找/展示的时候需要用到
        return number;
    }

    public void setNumber(int number) {//修改书架上 图书的种类  添加和删除图书功能都需要用到
        this.number = number;
    }
}

功能的实现

功能的实现都比较简单,难点主要是怎么构思出图书管理系统的构架,怎么把它们用类,接口联系起来

添加图书功能

public class AddOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("添加图书");
        System.out.println("请输入书名:");
        String name = scanner.nextLine();
        System.out.println("请输入作者:");
        String author = scanner.nextLine();
        System.out.println("请输入价格:");
        int price = scanner.nextInt();
        System.out.println("请输入类型:");
        String none = scanner.nextLine();//读取nextInt 的回车,否则type直接读取然后结束
        String type = scanner.nextLine();

        Book book = new Book(name,author,price,type);
        bookList.setBook(book, bookList.getNumber());//把新增图书放入下标为图书种类数的书架数组中
        bookList.setNumber( bookList.getNumber() + 1 );//让书架中的图书种类加1

        System.out.println("添加成功");
    }

}

借阅图书功能

public class BorrowOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        System.out.println("要借阅的书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getNumber(); i++) {
            if (name.equals(bookList.getBook(i).getName())) {
                System.out.println("借阅成功!");
                bookList.getBook(i).setLend(true);
                return;
            }
        }
        System.out.println("没有要借阅的书籍!");
    }
}

系统退出功能

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

查找图书功能

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        System.out.println("请输入要查找的书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getNumber(); i++) {
            if (name.equals(bookList.getBook(i).getName())) {
                System.out.println("已找到!");
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("没有要查找的图书!");
    }
}

展示全部图书功能

public class ListAllBooks implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("展示图书列表:");
        for (int i = 0; i < bookList.getNumber(); i++) {
            System.out.println(bookList.getBook(i));
        }
    }
}

归还图书功能

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("输入要归还的书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getNumber(); i++) {
            if (name.equals(bookList.getBook(i).getName())) {
                if (bookList.getBook(i).getLend()) {
                    bookList.getBook(i).setLend(false);
                    System.out.println("归还成功");
                    return;
                }else {
                    System.out.println("该图书没有借出!");
                    return;
                }
            }
        }
        System.out.println("没有该图书!");
    }
}

删除图书功能

public class RmoveOperation implements IOperation{
    private void del(BookList bookList,int number) {//number是坐标
        for (int j = number; j < bookList.getNumber()-1; j++) {

            bookList.setBook(bookList.getBook(j+1),j);//把后面的图书放前面
            bookList.setBook(null,j+1);//对后面的图书进行置空
            //避免内存泄露(内存浪费)  如果不置空:移动后虽然当前位置j也指向后面j+1的图书,但是如果执行
            //删除指令,把当前图书删除掉,那么j+1的指向了一个删掉了的图书,造成内存泄漏
        }
        bookList.setNumber(bookList.getNumber()-1);
        System.out.println("删除成功!");
    }
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("请输入要删除的书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        for (int i = 0; i < bookList.getNumber(); i++) {
            if (name.equals(bookList.getBook(i).getName())) {
                del(bookList,i);
                return;
            }
        }
        System.out.println("没有要删除的图书!");
    }
}

修改图书功能

public class UpdateOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("修改图书");
        System.out.println("请输入要修改的书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getNumber(); i++) {
            if (name.equals(bookList.getBook(i).getName())) {
                System.out.println("已找到!");
                System.out.println("修改后的书名:");
                String name2 = scanner.nextLine();
                System.out.println("修改后的作者:");
                String author = scanner.nextLine();
                System.out.println("修改后的价格:");
                int price = scanner.nextInt();
                System.out.println("修改后的类型:");
                String none = scanner.nextLine();
                String type = scanner.nextLine();

                Book book = new Book(name2,author,price,type);
                bookList.setBook(book,i);
                System.out.println("修改成功!");
                return;
            }
        }
    }
}

 

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

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

相关文章

历年国自然标书申请 面上项目614份 2001-2019年 面上标书

这里列举几例 清华任丰原 哈尔滨 杨宝峰 # 关注微信&#xff1a;生信小博士&#xff0c;10元领取 关注微信之后&#xff0c; 点开付费合集即可领取

Strus2 系列漏洞

目录 1、S2-001 2、S2-005 3、S2-007 4、S2-008 5、S2-009 6、S2-012 7、S2-013/S2-014 8、S2-015 9、S2-016 10、S2-019 11、s2-032 12、S2-045 13、S2-048 14、S2-052 15、S2-053 16、S2-057 17、S2-devMode Strusts 中使用 OGNL 为表达式语言。OGNL(Object…

OpenAI 开发者大会2023 解读

概述 宏观上还是分成两点&#xff1a;新的底层模型GPT-4 Turbo、新的应用生态GPTs。其余的名词都是服务于上面两个&#xff0c;很多名词是面向开发者的&#xff08;非普通用户&#xff0c;主要是在页面上使用&#xff09;容易导致混淆&#xff0c;比如什么JSON 格式、函数调…

使用uniapp写小程序,真机调试的时候不显示log

项目场景&#xff1a; 当小程序文件太大的情况下使用真机调试&#xff0c;但是真机调试的调试器没有任何反应 问题描述 使用uniapp写小程序&#xff0c;真机调试的时候不显示log 原因分析&#xff1a; 提示&#xff1a;因为真机调试的时候没有压缩文件&#xff0c;所以调试的…

EtherCAT从站EEPROM分类附加信息详解:SM(同步管理器)

0 工具准备 1.EtherCAT从站EEPROM数据&#xff08;本文使用DE3E-556步进电机驱动器&#xff09;1 分类附加信息——SM&#xff08;同步管理器&#xff09; 1.1 分类附加信息规范 在EEPROM字64开始的区域存储的是分类附加信息&#xff0c;这里存储了包括设备信息、SM配置、FM…

有向无权图的最短路径

在运筹学领域的经典模型中&#xff0c;最大流问题、多商品网络流问题和最短路径问题等都依附在图上对问题进行描述&#xff0c;同样&#xff0c;当我们梳理问题的数学模型&#xff0c;或理解相关问题的求解算法时&#xff0c;也要依靠它。因此&#xff0c;我将总结和图相关的问…

Android NDK JNI 开发native层崩溃日志栈分析

问题&#xff1a; 在Android的JNI开发中&#xff0c;你是否看到如下一堆崩溃日志&#xff0c;不知如何下手分析问题&#xff0c;崩溃在哪一行&#xff1f; 11-16 17:20:44.844 23077 23077 W test_jni_h: jni_preload: Starting for processln 11-16 17:20:44.844 23077 2307…

AWD比赛中的一些防护思路技巧

## 思路1&#xff1a; 1、改服务器密码 &#xff08;1&#xff09;linux&#xff1a;passwd &#xff08;2&#xff09;如果是root删除可登录用户&#xff1a;cat /etc/passwd | grep bash userdel -r 用户名 &#xff08;3&#xff09;mysql&#xff1a;update mysql.user set…

基于SpringBoot+Vue的二手物品交易平台

基于SpringBootVue的二手物品交易平台的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 本项目是基于Spring Boot 和 Vue 技术栈构建…

latex简单使用

​​文章目录 公式详解 普通公式公式居中带标号公式上标下标根号分式括号运算符列表 无序列表有序列表插入图片 单图多图排版表格脚注与定理子标题目录与附录 目录附录参考文献字体设置 字体样式 加粗斜体字母大写等线自定义字体字体大小 第一种设置第二种设置第三种设置 页面…

系列六、JVM的内存结构【栈】

一、产生背景 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的&#xff0c;不同平台的CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 二、概述 栈也叫栈内存&#xff0c;主管Java程序的运行&#xff0c;是在线程创建时创建&#xff0c;线程销毁时销毁&…

【PyQt小知识 - 4】:QGroupBox分组框控件 - 边框和标题设置

QGroupBox QGroupBox 是 PyQt 中的一个小部件&#xff0c;用于创建一个带有标题的组框。 可以使用 QGroupBox 将相关控件分组并添加一个标题。 以下是一个使用 QGroupBox 的示例代码&#xff08;示例一&#xff09;&#xff1a; from PyQt5.QtWidgets import * import sysa…

ERP管理系统:企业升级的秘密武器

ERP管理系统&#xff1a;企业升级的秘密武器 在当今快速发展的商业环境中&#xff0c;企业要想保持竞争力&#xff0c;就必须不断进行自我升级。而在这个过程中&#xff0c;ERP管理系统以其强大的功能和优化流程的能力&#xff0c;逐渐成为了企业升级的秘密武器。 一、ERP管理…

Unity开发之C#基础-异常处理(Try Catch)

前言 其实本来这章应该将栈和队列的 但是后来想想 栈和队列在实际应用很少跟多的是大家了解一下栈和队列的基本常识比如先进先出的是谁后进先出的是谁这种 csdn有很多介绍栈和队列的文章 我觉得都比我理解深刻所以大家可以去搜索参照一下 今天我们继续往下讲解 如何自己主动的…

【Java 进阶篇】JQuery 遍历 —— For 循环的奇妙之旅

在前端开发的世界里&#xff0c;遍历是一个常见而重要的操作。它让我们能够浏览并操纵文档中的元素&#xff0c;为用户提供更加丰富和交互性的体验。而在 JQuery 中&#xff0c;遍历的方式多种多样&#xff0c;其中 for 循环是一种简单而灵活的选择。在本篇博客中&#xff0c;我…

11-Vue基础之组件通信(二)

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Freeswitch中mod_commonds

mod_commands Table of Contents (click to expand) 0. About1. Usage 1.1 CLI1.2 API/Event Interfaces1.3 Scripting Interfaces1.4 From the Dialplan2. Format of returned data3. Core Commands 3.1 acl  3.1.1 Syntax3.1.2 Examples3.2 alias 3.2.1 Syntax3.2.2…

作为HR是看重学历还是工作经验?

作为HR是看重学历还是工作经验&#xff1f; 这个没有绝对的统一的看法&#xff0c;如果我是HR我更看重工作经验&#xff0c;如果是中小企业&#xff0c;对于人才嘛&#xff0c;那肯定是要到岗就能干活的&#xff0c;底子好不好先不说&#xff0c;关键是要能干活的。 不过近些…

【算法基础】分解质因数

文章目录 什么是分解质因数具体案例输入格式输出格式数据范围 原理讲解原始方法转换思路利用试除法判定质数的思路为什么不需要单独判断是否为质数 什么是分解质因数 分解质因数是指将一个合数用质因数相乘的形式表示出来&#xff0c;即将一个合数分解为若干个质数的乘积。其中…

人工智能如何重塑体验为先的汽车行业

面向汽车行业用户体验的 AI 人工智能的影响力继续在各个主要行业中迅速蔓延&#xff0c;全球各地的公司都开始大力投资 AI 技术&#xff0c;以提高自身的竞争优势。未来的趋势表明&#xff0c;企业如果不立即采用人工智能战略&#xff0c;就可能会远远落后于竞争对手。 AI 和…