【Java】练手小项目|用Java实现一个简单的图书管理系统

news2024/10/7 20:27:59

在这里插入图片描述

  • 博主简介:努力学习的预备程序媛一枚~
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Java岛冒险记【从小白到大佬之路】

文章目录

  • 一、项目简介(流程图)
  • 二、设计思路(UML图)
  • 三、代码
  • 四、总结&反思:

一、项目简介(流程图)

在这里插入图片描述

二、设计思路(UML图)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、代码

在这里插入图片描述

  • Book类:
package book;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * Author: yaoyao2024
 * Date: 2023-07-13
 * Time: 20:42
 */
public class Book {
    private String name;
    private int price;
    private String type;
    private String author;
    private boolean isBorrowed;

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

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

    public String getName() {
        return name;
    }

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

    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 String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

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

  • BookList
package book;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * Author: yaoyao2024
 * Date: 2023-07-13
 * Time: 20:47
 */
public class BookList {
    private Book[] books = new Book[10];
    private int bookNum = 0;

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

    public int getBookNum() {
        return bookNum;
    }
    public Book getBookByIndex(int index){
        return books[index];
    }

    public void setBookNum(int bookNum) {
        this.bookNum = bookNum;
    }
    public BookList(){
        books[0] = new Book("红楼梦",12,"小说","曹雪芹");
        books[1] = new Book("三国演义",13,"小说","罗贯中");
        books[2] = new Book("水浒传",14,"小说","施耐庵");
        this.bookNum = 3;
    }
}

  • 接口: IOperation
package Operation;

import book.BookList;


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

  • 实现接口类:AddOperation
package Operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        if(bookList.getBookNum()>10){
            System.out.println("数量已满,无法添加!");
            return;
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名:");
        String name = scanner.nextLine();
//        scanner.nextLine();
        System.out.println("请输入作者:");
        String author = scanner.nextLine();
        System.out.println("请输入图书价格:");
        int price = scanner.nextInt();
        scanner.nextLine();
        System.out.println("请输入图书类型:");
        String type = scanner.nextLine();
        Book book = new Book(name,price,type,author);
        bookList.setBooks(bookList.getBookNum(),book);
        bookList.setBookNum(bookList.getBookNum()+1);
        System.out.println("新增图书成功!");
    }
}

  • 实现接口类:BorrowOperation
package Operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书的名字:");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBookNum(); i++) {
            Book book = bookList.getBookByIndex(i);
            if (name.equals(book.getName()) && !book.isBorrowed()) {
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }

        }
        System.out.println("借阅失败!");
    }
}

  • 实现接口的子类DelOperation
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);
        System.out.println("请输入你要删除的图书的名字:");
        for (int i = 0; i < bookList.getBookNum(); i++) {
        String name = scanner.nextLine();
            Book book = bookList.getBookByIndex(i);
            if (name.equals(book.getName())) {
              for( int j = i+1; j < bookList.getBookNum();j++){
                  bookList.setBooks(j-1,bookList.getBookByIndex(j));
              }
                bookList.setBookNum(bookList.getBookNum()-1);
                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);
    }
}

  • 实现接口的类:FindOperation
package Operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入你要查找图书名字:");
        String name = scanner.nextLine();
        for (int i = 0; i <bookList.getBookNum(); i++) {
            Book book = bookList.getBookByIndex(i);
            if(name.equals(book.getName())){
                System.out.println("找到了!");
                System.out.println(book);
                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) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你想归还图书的名字:");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getBookNum(); i++) {
            if (name.equals(bookList.getBookByIndex(i).getName())){
                bookList.getBookByIndex(i).setBorrowed(false);
                System.out.println("归还图书成功!");
                return;
            }
        }
        System.out.println("找不到该图书!");
        return;
    }
}

  • 实现接口的类:ShowOperation
package Operation;

import book.BookList;
public class ShowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示所有图书");
        for (int i = 0; i < bookList.getBookNum(); i++) {
            System.out.println(bookList.getBookByIndex(i));
        }
    }
}
  • 抽象类:User
package user;

import Operation.IOperation;
import book.BookList;

public  abstract class User {
    protected String name;
    public abstract int menu();
    protected IOperation[] operations;
    public void doOperation(int choice, BookList bookList){
        operations[choice].work(bookList);
    }
    public User(String name) {
        this.name = name;
    }
}

  • 继承抽象类的管理员类Admin
package user;

import Operation.*;

import java.util.Scanner;

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

    @Override
    public int menu() {
        System.out.println("*********************************");
        System.out.println("Hello:"+name+" 欢迎来到图书管理系统");
        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.print("请输入你的选择:");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

  • 子类:NormalUser
package user;

import Operation.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        operations = new IOperation[] {new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};
    }

    @Override
    public int menu() {
        System.out.println("*********************************");
        System.out.println("Hello:"+name+" 欢迎来到图书管理系统!");
        System.out.println("1、查询图书");
        System.out.println("2、借阅图书");
        System.out.println("3、归还图书图书");
        System.out.println("0、退出系统");
        System.out.print("请输入你的选择:");
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }
}

  • 主逻辑,main方法存在类:Main
import book.BookList;
import user.Admin;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {
    public static User login(){
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请选择你的角色:1、管理员   0、普通成员");
        int choice = scanner.nextInt();
        if(choice == 1){
            return new Admin(name);
        }else{
            return new NormalUser(name);
        }

    }
    public static void main(String[] args) {
        //创建一个书架
        BookList bookList = new BookList();
        User user = login();
        while (true){
          int choice = user.menu();
          user.doOperation(choice,bookList);
        }
    }
}

四、总结&反思:

  • Iopertation:定义一个接口(规范),所有的操作都必须实现这个接口

  • 不同用户有自己不同的菜单打印方式,所以把这个抽象方法定义在抽象类User,中,且在子类进行重写,即可用父类引用调用打印菜单方法时触发动态绑定,调用各自的打印菜单的方法(多态的好处,不用再去判断哪个是普通用户。哪个是管理员,减少了“圈复杂度)!

  • 最重要!!!巧妙的在User子类的构造方法中初始化父类的ioperations数组,这样根据子类创建的初始化过程,子类在初始化的时候将父类属性也初始化了,而巧的是,我们父类引用指向恰巧只能访问父类属性,但是这个属性巧妙的和子类的类型相关联,很巧妙!
    这样我们即使只有父类引用时,访问属性,也访问的是子类各自类型对应的操作!!!


在这里插入图片描述

  • Java岛冒险记【从小白到大佬之路】

  • LeetCode每日一题–进击大厂

  • Go语言核心编程

  • 算法

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

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

相关文章

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 18 日论文合集)

文章目录 一、检测相关(19篇)1.1 Implementation of a perception system for autonomous vehicles using a detection-segmentation network in SoC FPGA1.2 Monocular 3D Object Detection with LiDAR Guided Semi Supervised Active Learning1.3 Active Learning for Object…

亚马逊在人工智能领域的投资机会

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 亚马逊股票的关键指标 猛兽财经认为亚马逊&#xff08;AMZN&#xff09;在拥抱生成式人工智能方面是非常认真的&#xff0c;以下指标就证明了这一点。 上周&#xff0c;亚马逊透露&#xff0c;它已经建立了“AWS生成人工智…

uniapp中axios封装和环境配置

axios版本 最好锁定版本&#xff0c;避免bug axios-miniprogram-adapter这个依赖主要是适配小程序网络请求的适配器&#xff0c;为了解决uniapp 适配axios请求&#xff0c;避免报adapter is not a function错误 cnpm i axios0.26.0 axios-miniprogram-adapter 配置adapter函…

leaflet 沿河流流向显示河流名字

1.效果图&#xff1a; 2.代码块 首先需要借助一个插件3mapslab-Leaflet.streetlabels&#xff08;这个插件也可用于显示街道名字用的&#xff09; 插件可在leaflet官网上下载及案例&#xff01; --- layout: default ---<div idmap style"width:100%;min-height:30…

2023年,做好数据分析项目,四分之三就靠它了

摘要 在2023年&#xff0c;数据分析成为了一个卓越的商业实践&#xff0c;为企业和组织带来了巨大的成功。本文将深入探讨一个重要数据分析项目&#xff0c;其成功的四分之三依赖于数据洞察力的重要性。通过合理的数据收集、清洗、分析和解释&#xff0c;企业能够获得实质性的见…

关于生物数据库定制研发-开发注意事项

目前需要定制开发一款核酸数据库、蛋白数据库、蛋白结构数据库或是通路数据库等生物医药数据库成本无疑是巨大的&#xff01;需要承受生物数据获取成本、开发成本、专业人才挖掘、行业壁垒攻克、研发及运维等碎片化难题&#xff0c;所以找到一家实力强劲专业公司是很有必要的。…

fastadmin采坑之关联id

在add.html中添加 尤其要注意 data-field属性这个是最重要的&#xff0c;不然搜索不出来 <div class"form-group"><label class"required control-label col-xs-12 col-sm-2">{:__(Meeting_id)}:</label><div class"col-xs-12…

nosql作业

nosql作业 文章目录 作业一&#xff1a;string list hash结构中&#xff0c;每个至少完成5个命令&#xff0c;包含插入 修改 删除 查询&#xff0c;list 和hash还需要增加遍历的操作命令1、 string类型数据的命令操作&#xff1a;2、 list类型数据的命令操作&#xff1a;3、 ha…

计算机专升本基础笔记二 进制转换及二进制运算规则

进制转换及二进制运算规则 什么是进制&#xff1f;     进制就是进位计数制&#xff0c;是人为定义的带进位的计数方法。我们的时间就是六十进制(满60秒进一分钟&#xff0c;满60分钟进1小时&#xff09;&#xff1b;对于任何一种进制—X进制&#xff0c;就表示每一位上的数…

网络子系统学习2:套接字缓冲区

套接字缓冲区 目录 套接字缓冲区 套接字缓冲区整体结构 使用套接字缓冲区管理数据 管理套接字缓冲区数据 套接字缓冲区整体结构 在内核分析&#xff08;收到的&#xff09;网络分组时&#xff0c;底层协议的数据将传递到更高的层。发送数据时顺序相反&#xff0c;各种协议…

usb转网口转换器经常自动断网

问题&#xff1a; 最近使用一个usb转网口的扩展坞&#xff0c;发现和其它机器通信时&#xff0c;经常会自动断网。 原因&#xff1a; 和设备的电源管理策略有关&#xff0c;USB设备的“允许计算机自动关闭此设备以节约电源”选项默认是选中的&#xff0c;而网络设备的此选项默…

Java正则表达式匹配字符类

1、匹配字符的示例 以下是在java中使用正则表达式匹配字符的各种示例。 2、匹配字符类 以下是在java中使用正则表达式匹配字符类的一些示例。 3、匹配预定义字符类 以下是使用java中的正则表达式匹配预定义字符类的各种示例。 4、匹配POSIX字符类 以下是使用java中的正则表…

【精简版--纯操作】zabbix企业级监控(简单操作、页面优化、监控主机自己、监控linux、监控Win10)

zabbix企业级监控&#xff08;简单操作、页面优化、监控主机自己、监控linux、监控Win10&#xff09; 目录 一、zabbix安装部署 二、图形化操作&#xff1a;web安装zabbix 三、Zabbix页面优化 四、Zabbix监控自己 五、监控linux主机&#xff1a; 六、监控Win10主机&…

工业RFID识别设备可以分为哪几种?

常见的工业RFID识别设备可以分为&#xff1a;读写器、读写模块、手持终端、工业通道等设备&#xff0c;不同的设备对应不同的应用场景&#xff0c;下面我们就一起来了解一下这些RFID识别设备都有哪些具体应用。 工业rfid识别设备可以分为哪几种? 1、 读写器 RFID读写器是用于读…

Spring框架的创建和使用

目录 Spring框架概述 什么是Spring框架 什么是容器 什么是IoC容器 Spring的核心功能 IoC容器和普通程序开发的区别 DI Spring项目的创建和使用 Spring项目创建 创建一个maven项目 添加Spring框架支持 添加一个启动类 Spring项目的使用 存储Bean对象 获取并使用B…

04规划模型练习题

(0-1 规划)某公司董事会正在考虑几个大型的投资项目&#xff0c;每个项目只能投资一次&#xff0c;且各个项目所需的投资金额与能够产生的预期收益是不同的&#xff0c;具体见表 1 所示.已知公司现有的投资额是 1亿美金&#xff0c;其中投资项目 1和项目 2 是斥的&#xff0c;项…

物理层——数据通信基础知识

1.典型的数据通信模型 2.数据通信的相关术语 2.1 三种通讯方式 2.2 数据传输方式 2.3 常用编码方式&#xff08;数字信号&#xff09; 曼彻斯特编码 将一个码元分成两个相等的间隔&#xff1b; 前一个间隔为 低电平 &#xff0c;后一个间隔为 高电平 表示码元1&#xff1b; 码…

Type-C带充电的OTG转接器方案 LDR6028

近些年随着社会生活水平提高&#xff0c;每个人的的电子设备逐渐的多了起来&#xff0c;各大品牌都在发售自家品牌的全家桶。手机、平板、笔记本电脑、智能手表、无线耳机、任天堂Switch、索尼PS5等电子设备一种不落。 那么多的电子设备基本来说都是需要充电&#xff0c;比如手…

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch;安装浏览器插件FeHelper

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码2.…