【JavaSE】阶段性小结,运用Java实现图书管理系统

news2025/7/3 3:39:10

文章目录

  • 逻辑分析
  • 主题框架
  • 具体方法
    • 添加书籍
    • 删除书籍
    • 查找书籍
    • 借阅书籍
    • 归还书籍
    • 展示书籍
    • 退出系统
  • 源码
    • User
    • NormalUser
    • AdmintUser
    • Book
    • BookList
    • IOperation
    • AddboookOperation
    • DeletbookOperation
    • FindbookOperation
    • ShowbookOperation
    • BorrowbookOperation
    • ReturnbookOperation
    • ExitOperation

逻辑分析

我们需要完成一个图书管理系统,首先我们要对他的逻辑进行分析,Java是面向对象的语言,那我们的图书管理系统都包含哪些对象呢?既然是图书管理系统,首先我们是不是要有书,既然有书了我们就需要有存放书的书架,我们还需要有用户,这里我们写两类用户,一类是管理员,可以对书架进行管理,一类是普通用户,可以实现借书还书等功能。经过我们的分析,大致的逻辑已经出来了,我们可以通过画图来理清楚我们的思路:
在这里插入图片描述
这样我们就可以创建出对应的类与接口:
在这里插入图片描述
那么如何将书放入书架呢?我们在书架类中创建一个书类的数组是不是就可以储存书类对象了
在这里插入图片描述

主题框架

首先我们来看看已经完成的图书管理系统是什么样子的:
在这里插入图片描述
在这里插入图片描述
从上面两个图中我们可以对图书管理系统的框架进行一个分析:

主要有两点:
1、通过我们对身份的选择,打印管理员和普通用户两个不同的菜单
2、再次通过我们的选择,实现对我们所选择的用户的功能的实现

我们先来完成第一个框架,通过我们身份的选择打印不同的用户菜单:
因为不同用户打印的菜单是不一样的,那么我们就可以在父类中写一个抽象方法menu,那么此时父类User也应该是抽象的了,子类方法通过重写父类中的menu实现需要打印的菜单,我们通过创建不同的用户对象去调用对应的menu就可以实现打印不同的菜单了。
在这里插入图片描述

在这里插入图片描述
这样我们就使用多态的思想实现了我们的问题1,通过我们对身份的选择,打印管理员和普通用户两个不同的菜单,我们是通过选择判断,创建了不同的子类对象实现向上转型,之后通过这个对象调用打印菜单的方法,因为menu是抽象方法,而抽象方法不会在父类中实现,会调用对应子类中我们重写的menu方法,这样我们就完成了需求,打印对应用户菜单
在这里插入图片描述

上面就是管理员用户的menu的菜单,我们只需要打印菜单就好了,那为什么会有返回值呢?因为我们还需要完成问题2:通过我们的选择,实现对我们所选择的用户的功能的实现。此时menu返回的是我们第二次的选择——对操作的选择。这里我们依旧是使用多态的思想,我们可以在父类用户类中创建一个IOperation接口的数组,此时我们不在父类中初始化,在对应的子类中初始化,这样不同的子类中的数组元素可以是不同的,我们把我们的选择choice当作IOperation数组的下标,这样就访问到了不同子类中的对应功能
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在两个子类中数组iOperations的元素是不同的,这样我们就可以调用对应用户的对应功能了。以上这就是我们的主体框架需要完成的两个最重要的点,剩下就只需要我们对对应功能的实现了。

具体方法

添加书籍

在这里插入图片描述
输入书籍信息,如果书架中没有此本书,就调用Book的构造方法,将刚才录入的书籍信息当作参数,构造一本书,再将书放入书架中,并给书架中书的数量加一。

删除书籍

在这里插入图片描述

删除书籍值得我们讲一下,首先我们输入需要输入删除书籍的名字,遍历书架中的书,如果书架中当前位置的书,名字与我们需要删除的书籍名称相同,那就进行覆盖,将书架中后一本书覆盖到当前位置,依次类推,最后将书架中书的总数减一,并且将最后一本书的位置,置为null删除就成功了。

查找书籍

在这里插入图片描述
输入要查找的书籍名称,遍历书架,找到与我们查找的书籍名字相同的书籍,打印该书籍的信息。

借阅书籍

在这里插入图片描述
同样输入书籍名称,遍历书架找到该书籍的信息,判断是否借出,如果没有就借阅成功。

归还书籍

在这里插入图片描述

展示书籍

在这里插入图片描述
遍历书架,打印每一本书籍的信息即可。

退出系统

在这里插入图片描述

源码

大家可以去我的码云里面看,也可以在下面观看: 图书管理系统源码

User

package User;

import Book.BookList;
import Operation.IOperation;

public abstract class User {
    protected String name;
    protected IOperation[] iOperations;

    public User() {
    }

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

    public abstract int menu();

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

NormalUser

package User;

import Book.BookList;
import Operation.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser() {
    }

    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new BorrowbookOperation(),
                new ReturnbookOperation(),
                new FindbookOperation()
        };
    }

    @Override
    public int menu() {
        System.out.println(" 欢迎 " + 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 choice = scanner.nextInt();
        return choice;
    }


}

AdmintUser

package User;

import Book.BookList;
import Operation.*;

import java.util.Scanner;

public class AdmintUser extends User {

    public AdmintUser() {
    }

    public AdmintUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new AddbookOperation(),
                new DeletbookOperation(),
                new FindbookOperation(),
                new ShowbookOperation()
        };
    }



    @Override
    public int menu() {
        System.out.println(" 欢迎 " + 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 choice = scanner.nextInt();
        return choice;
    }


}

Book

package Book;

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

    public Book() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

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

    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 boolean isBorrow() {
        return isBorrow;
    }

    public void setBorrow(boolean borrow) {
        isBorrow = borrow;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", isBorrow=" + isBorrow +
                '}';
    }
}

BookList

package Book;

public class BookList {
    Book[] books = new Book[20];

    private int usedSize;

    public BookList() {
        books[0] = new Book("三国演义","罗贯中",89,"小说");
        books[1] = new Book("西游记","吴承恩",78,"小说");
        books[2] = new Book("红楼梦","曹雪芹",49,"小说");
        this.usedSize = 3;
    }

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

    public void setBooks(int pos,Book book) {
        books[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

IOperation

package Operation;

import Book.BookList;

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

AddboookOperation

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class AddbookOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("添加书籍");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要添加的书籍名字:");
        String name = scanner.nextLine();
        System.out.println("请输入你要添加的书籍类型:");
        String type = scanner.nextLine();
        System.out.println("请输入你要添加的书籍作者:");
        String author = scanner.nextLine();
        System.out.println("请输入你要添加的书籍的价格:");
        int price = scanner.nextInt();

        int size = bookList.getUsedSize();
        for(int i = 0;i < size;i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)) {
                System.out.println("不好意思,您想添加的图书已经存在!");
                return;
            }
        }
        Book book = new Book(name,author,price,type);
        bookList.setBooks(size,book);
        bookList.setUsedSize(size + 1);
        System.out.println("添加图书成功!");
    }
}

DeletbookOperation

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class DeletbookOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除书籍");
        System.out.println("请输入你要删除的图书的名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        int index = -1;
        for(int i = 0;i < size;i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)) {
                index = i;
                System.out.println("找到该图书了!");
                break;
            }
        }
        if(index == -1) {
            System.out.println("没有找到该图书!");
        }else {
            for(int j = index;j < size - 1;j++) {
                Book book = bookList.getBooks(j+1);
                bookList.setBooks(j,book);
            }
            bookList.setUsedSize(size - 1);
            bookList.setBooks(size - 1,null);
            System.out.println("删除成功!");

        }

    }
}

FindbookOperation

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class FindbookOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找书籍");
        System.out.println("请输入你要查找的书籍名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        for(int i = 0;i < size;i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name)) {
                System.out.println("找到了这本书!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("不好意思没有找到");
    }
}

ShowbookOperation

package Operation;

import Book.Book;
import Book.BookList;

public class ShowbookOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("展示书籍");
        int size = bookList.getUsedSize();
        for(int i = 0;i < size;i++) {
            Book book = bookList.getBooks(i);
            System.out.println(book);
        }
    }
}

BorrowbookOperation

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class BorrowbookOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅书籍");
        System.out.println("请输入你需要借阅的书籍名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        for(int i = 0;i < size;i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name) &&
            !book.isBorrow()) {
                book.setBorrow(true);
                System.out.println("借阅成功!!");
                return;
            }
        }
        System.out.println("对不起没有找到该书籍!");
    }
}

ReturnbookOperation

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class ReturnbookOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还书籍");
        System.out.println("请输入你需要归还的书籍名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int size = bookList.getUsedSize();
        for(int i = 0;i < size;i++) {
            Book book = bookList.getBooks(i);
            if(book.getName().equals(name) &&
                    book.isBorrow()) {
                book.setBorrow(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("退出程序");
        System.exit(0);
    }
}

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

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

相关文章

[计算机毕业设计]关联挖掘的服装推荐系统

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

OS>>多线程

文章目录绪论SIGCHLDvolatile概念执行流并行与并发临界资源与临界区互斥和同步线程线程定义线程独立性线程优点线程缺点线程ID线程操作线程创建线程等待线程终止线程分离线程替换线程互斥与同步互斥同步原子性互斥锁/互斥量原理使用抢票情景模拟未加锁前加锁后代码锁使用规范重…

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计(原理图+源码+仿真工程+论文)

【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计&#xff08;原理图源码仿真工程论文&#xff09; 文章目录【毕业设计】14-基于单片机的健康检测仪/心跳/温度/血压设计&#xff08;原理图源码仿真工程论文&#xff09;资料下载链接任务书设计说明书摘要设计框架架构…

Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之五

问题点 7&#xff1a; 关于BLE HIDS data 写入到Android 节点"/dev/uhid"的flow&#xff1b; 关于BLE中的HIDS&#xff0c;首先我们需要理解好角色的定义&#xff1a; GATT Server 作为HID Service 提供者&#xff0c;对应HID Device角色&#xff1b; GATT Client…

maven大全(概述、安装配置、使用步骤)

一、概述 1.什么是maven&#xff1f; 答&#xff1a; 全称是Apache Maven。专门用于管理和构建项目的工具 2.maven有什么作用&#xff1f; &#xff08;1&#xff09;提供了一套标准化的项目结构 官方&#xff1a; 就是使用的idea&#xff0c;eclipse编译器的项目结构不统…

基于Matlab的高压直流输电系统仿真研究

目录 摘要 I Abstract II 第1章 绪论 1 1.1 高压直流输电系统 1 1.2 高压直流输电系统的历史 1 1.3 高压直流输电系统的特点 1 1.4 我国高压直流输电系统的现状 2 1.5 高压直流输电技术的发展前景 5 第2章 高压直流输电控制基本原理 6 2.1 高压直流输电控制系统分层结构 6 2.2 …

领夹直播麦克风常规的使用方法及方案说明

麦克风多对我们来说并不陌生&#xff0c;但领夹式麦克风我们日常可能会用的比较少&#xff0c;像做自媒体、采访等会用到的比较多&#xff0c;它能收到人说话的声音&#xff0c;避开外界嘈杂的声音。接下来我们一起来了解一下领夹式麦克风的相关知识吧&#xff01; 一、领夹式麦…

Win11系统启动文件夹是空的怎么解决?

Win11系统启动文件夹是空的怎么解决&#xff1f;有用户发现自己系统的启动文件夹里面没有任何的文件&#xff0c;这样可能会导致我们的电脑出现问题&#xff0c;导致无法正常的启动桌面程序。那么如何去解决这个问题&#xff0c;一起看看具体的解决方法分享吧。 解决方法&#…

从I/O的视角看DPU

计算的流动性 随手翻开一个公有云&#xff0c;都会发现有不同的计算实例&#xff0c;搭配不同的CPU、内存、网络和存储来应对不同业务的需求. 当云原生和大量的新技术出现后&#xff0c;作为公有云考虑的最重要的一件事情就是提供这些丰富服务的成本: 青云、Ucloud也都在A股上…

[Redis] Spring Boot 使用Redis---RedisTemplate泛型约束乱码问题

✨✨个人主页:沫洺的主页 &#x1f4da;&#x1f4da;系列专栏: &#x1f4d6; JavaWeb专栏&#x1f4d6; JavaSE专栏 &#x1f4d6; Java基础专栏&#x1f4d6;vue3专栏 &#x1f4d6;MyBatis专栏&#x1f4d6;Spring专栏&#x1f4d6;SpringMVC专栏&#x1f4d6;SpringBoot专…

牛客网-《刷C语言百题》第五期

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;《C语言入门必刷百题》 &#x…

计算机毕业设计ssm+vue+elementUI高校志愿者服务招募网站

项目介绍 随着我国教育制度的改革和社会的进步&#xff0c;越来越多的人希望加入志愿者这个行列从而贡献自己的一份爱。加入志愿者不仅能够更好的锻炼自己&#xff0c;也可以帮助那些需要帮助的人&#xff0c;从而让社会变的更加温暖和美好&#xff0c;尤其是对比较发达的地区…

基于matlab创建基于物理统计的雷达模型(附源码)

目录 一、前言 二、、定义场景 三、定义用于检测生成的雷达 四、生成统计雷达检测 五、定义用于 IQ 信号生成和处理的雷达 六、IQ 信号和处理仿真 七、总结 八、程序 一、前言 此示例演示如何以编程方式从统计雷达模型创建基于物理的雷达模型。 雷达是一种感知系统&…

Zookeeper的功能简介

1.ZooKeeper是什么&#xff1f; ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff…

超神之路 数据结构 2 —— Queue队列实现和循环队列和普通队列的性能比较

接上一篇继续往下挖&#xff0c;在上一篇&#xff0c;我们实现了一个属于自己的动态数组。利用这个动态数组&#xff0c;我们来实现一个基于动态数组&#xff0c;一个属于自己的普通队列Queue。 Queue 是一种它许我们从表的一段进行删除&#xff0c;表的另一端进行插入的线性表…

Docker—苹果Mac安装Docker的两种方式

文章目录Docker简介方式一&#xff1a;官网dmg安装方式二&#xff1a;homebrew安装前置条件brew安装docker关注微信公众号&#xff1a;CodingTechWork&#xff0c;一起学习进步。Docker简介 &emsp docker就是集镜像、容器和仓库三个概念于一身的集装箱&#xff0c;应用于…

GPO:组策略与系统配置

1、所有的服务器不需要按ctrl+alt+del交互式登录; 2、关闭所有机器的睡眠功能 3、所有计算机都不允许登录Microsoft账户; 4、允许IT组进行系统时间修改 5、设定所有职务为managers的用户为本地管理员,除了域控制器 GPO:组策略与系统配置 所有的服务器不需要按ctrl+alt+del;…

基于ELK搭建的本地社工库

简介 ELK原本是一个开源实时日志分析平台。 ELK是三个开源软件的缩写&#xff0c;分别为&#xff1a;Elasticsearch 、 Logstash以及Kibana 。目前又新增了一个Beats&#xff0c;是一个轻量级的日志收集处理工具&#xff0c;Beats占用资源少&#xff0c;适合于在各个服务器上…

Greenplum GPKafka【实践 01】使用GPKafka实现Kafka数据导入Greenplum数据库踩坑问题记录(不断更新ing)

1.说明 Kafka 是分布式消息订阅系统&#xff0c;有非常好的横向扩展性&#xff0c;可实时存储海量数据&#xff0c;是很常用的流数据处理中间件。物联网设备采集的数据很多时候就是通过 Kafka 进行处理的。当 Kafka 数据要入库分布式数据库 Greenplum 时&#xff0c;我们就需要…

二、IAR新建一个工程

之前录制了无线传感网综合项目实战课程&#xff0c;这个课程非常适合应届毕业生和想转行Linux的朋友&#xff0c;用来增加项目经验。 其中一部分内容是关于CC2530zigbee的知识&#xff0c;后面会更新几篇关于cc2530的文章&#xff0c;敬请关注&#xff01; 下面是该系列文章链…