JAVA实现图书管理系统(初阶)

一.抽象出对象:

1.要有书架,图书,用户(包括普通用户,管理员用户)。根据这些我们可以建立几个包,来把繁杂的代码分开,再通过一个类来把这些,对象整合起来实现系统。说到整合,肯定缺不了,相关接口,我们再定义一个,放接口,和扩展这个接口的方法。

如图:

二.构思:

1.先在书架类上,初始化好默认书籍,其他构造方法(如:getBook,setBook(在具体的下标,放书和返回书)),具体,在写实现接口的方法时,来增加。

public class BookList {
    //组合的方式,初始化书架
    private Book[] books = new Book[10];
    private int usedSize;//实际放的,书的个数

    //初始化书架(放书)
    public BookList() {
        this.books[0] = new Book("三国演义", "罗贯中", 12, "小说");
        this.books[1] = new Book("红楼梦", "曹雪芹", 13, "小说");
        this.books[2] = new Book("西游记", "吴承恩", 14, "小说");

        this.usedSize = 3;
    }

    //返回一本,pos(要找的书)下标的书
    public Book getBook(int pos) {
        return books[pos];
    }

    //插入一本书的方法(相当于,要初始化好,书架原来已有的书)
    public void setBook(int pos, Book books) {
        this.books[pos] = books;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

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

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

2.在book类中写一些图书对象的,基本属性,和给成员变量初始化,的方法。

public class Book {
    private String name;//书籍名字
    private String author;//书籍作者
    private int price;//书籍价格
    private String type;//书籍类型
    private boolean isBorrowed;//受否被借出

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

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

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

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

    }
}

3.在User类中,定义好name和,相关构造方法,以及接口命名的数组,为后面,到达调用,扩展了接口的类,里的方法,做铺垫。

public abstract class User {
    protected String name;

    //定义,接口命名,类型的数组,后续配合,
    // 【return new AdminUser(name);】就可以看出,再加上接口调用的方法,就知道,操作了哪一个方法
    protected IOperation[] iOperations;
    //要根据子类,来初始化,父类成员变量
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();

    //这里封装一个方法,提供给,Main调用。
    public void DoIOperation(int choice, BookList bookList) {
        //这里,iOperations数组,里有我们要的对象,通过,数组里的对象,调用接口里的方法
        iOperations[choice].work(bookList);
    }
}

4.管理员类中(AdminUser)和普通用户类中(NormalUser)继承了user类,初始化好系统菜单,相关构造方法。(这个构造方法很关键,用接口作为数组相当于实例化了,扩展了接口的类,的方法,达到调用系统具体方法的作用 

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        //通过【return new AdminUser(name);】,再加上实现接口的方法,就知道,操作了哪一个方法
        //登录界面,选择了哪个,角色(NormalUser)或者(AdminUser),this就是哪个的引用
        this.iOperations = new IOperation[] {
                //这些对象都实现了,iOperations接口,所以不会报错

                //下面相当于实例化了,扩展了接口的类,的方法,达到调用系统具体方法的作用
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),
        };
    }

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

}

5.在Main类中写好,登录界面,及整合一下,如何实例化对象,来操作系统。

 public static void main(String[] args) {
        //实例化书架
        BookList bookList = new BookList();

        //通过返回值,向上转型,确定用户
        //这里的user是,返回的(AdminUser),或者(NormalUser)
        User user = login();


        while (true) {

            //然后,通过返回信息,调用恰当的菜单
            int choice = user.menu();//发生了,动态绑定
           /**
            * 根据choice,返回值看看,调用了哪个方法
            *
            * 1.哪个对象?
            * 答:User user = login();
            *
            * 2.哪个方法?-》进一步,还要确定,当前对象,包含了这些方法
            *答:在构造方法【return new AdminUser(name)】运行时,会初始化好,对应的操作对象。
            *
            * 注意:后面通过父类对象,调用方法,(int choice = user.menu();),通过choice判断
            * 调用了,哪个方法 ,接下来就要对,父类,进行操作
            */

           user.DoIOperation(choice, bookList);
       }

    }

}

6.初始化好,接口和,菜单里操作系统的work方法(实现了这个接口的,类就是,每个操作系统的方法)

public interface IOperation {
    //这个接口,有操作书架的方法,在其他类实现,就可以,操作性的区分,不同用户的方法
    public void work(BookList bookList);
}

7.接下来就是实现了,接口的每一个类每个操作系统的方法

以下是管理员菜单方法:

(1).查找图书:

public class FindOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");

        int currentSize = bookList.getUsedSize();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的图书");
        String name = scanner.nextLine();

        for (int i = 0; i < currentSize; i++) {
            //遍历,书架,已初始化的书
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                System.out.println("找到了");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有你要找的书...");
    }
}

(2).新增图书:

public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        //1.判断书架(数组)是否满了
        int currentSize = bookList.getUsedSize();
        if (currentSize == bookList.getBooks().length) {
            System.out.println("该书架满了,不能放了");
            return;
        }

        //2.构建对象
        Scanner scanner = new Scanner(System.in);

        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 type = scanner.next();
        Book newBook = new Book(name, author, price, type);


        //3.判断书架是否,已经存在这本书
        for (int i = 0; i < currentSize; i++) {
            //遍历,书架,已初始化的书
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                System.out.println("书已经存在了,不用再添加了");
                return;
            }
        }

        //插入图书
        bookList.setBook(currentSize, newBook);
        bookList.setUsedSize(currentSize+1);
    }
}

(3).删除图书:

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");


        int currentSize = bookList.getUsedSize();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要删除的图书");
        String name = scanner.nextLine();

        int pos = 0;
        int i = 0;
        for (; i < currentSize; i++) {
            //遍历,书架,已初始化的书
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                //找到要删除的,位置
                pos = i;
                break;
            }
        }

        if (i == currentSize) {
            System.out.println("没有找到你要删除的图书");
        }

        //开始删除
        for (int j = pos; j < currentSize-1; j++) {
         //思路:bookList[j] = bookList[j+1];
            //先找到j+1,那个位置,然后覆盖
            Book book = bookList.getBook(j+1);
            bookList.setBook(j, book);
        }

        //更新下标
        bookList.setUsedSize(currentSize-1);
        System.out.println("删除成功");
    }
}

(4).显示图书:

public class ShowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");

        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            //遍历下标,把找到的图书打印出来
            Book book = bookList.getBook(i);
            System.out.println(book);
            }
        }
    }

(5).退出系统:

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

以下是普通用户菜单方法:

(1).退出系统和查找图书,是普通人员和管理员的共同方法

(2)归还图书:

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");

        int currentSize = bookList.getUsedSize();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要归还的图书");
        String name = scanner.nextLine();

        for (int i = 0; i < currentSize; i++) {
            //遍历,书架,已初始化的书
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                //看看isBorrowed返回,ture(已借出),还是false(未借出)
                if (book.isBorrowed()) {
                    book.setBorrowed(false);
                    return;
                }
            }
        }
        System.out.println("错误,没有你要归还的图书");
    }
}

(3)借阅图书:

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

       int currentSize = bookList.getUsedSize();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书");
        String name = scanner.nextLine();

        for (int i = 0; i < currentSize; i++) {
            //遍历,书架,已初始化的书
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                //看看isBorrowed返回,ture(已借出),还是false(未借出)
                if (book.isBorrowed()) {
                    System.out.println("该书已经被借出");
                    return;
                }

                book.setBorrowed(true);//置为借出
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("没有找到你要借阅的那本书");
    }
}

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

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

相关文章

Day04:CSS 进阶

目标&#xff1a;掌握复合选择器作用和写法&#xff1b;使用background属性添加背景效果 一、复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。 1、后…

ros 学习记录(四)仿真环境中键盘控制turtlebot3运动

仿真环境中键盘控制turtlebot3运动 准备工作1. 监听键盘敲击&#xff1a;key_publisher.py2. 控制turtlebot3运动&#xff1a;keys_to_twist_using_rate.py3. 测试4. 数据监视 准备工作 名称版本ROSNoeticGazebo11.11.0python3.8.10 turtlebot3的安装与仿真环境搭建请看上一篇…

视频播放器-Kodi

一、前言 Kodi 是一款开源免费的多媒体播放软件。Kodi 是由非营利性技术联盟 Kodi 基金会开发的免费开源媒体播放器应用程序。 Kodi是一款免费和开源&#xff08;遵循GPL协议&#xff09;的多媒体播放器和娱乐中心软件&#xff0c;由XBMC基金会开发。Kodi的主要功能是管理和播…

three.js判断物体在人的前面,还是后面

three.js判断物体在人的前面&#xff0c;还是后面 const player new THREE.Vectors(10, 0, 5); const mesh new THREE.Vectors(15, 0, 6);上面&#xff0c;两个变量分别表示&#xff0c;玩家的位置&#xff0c;物体的位置。 从这发现&#xff0c;当玩家和物体的角度关系 小…

报错:c2665 ”loadimage“没有重载函数可以转换所有参数类型

解决方法: 右键项目选择属性-》高级-》字符集-》使用多字节字符集-》确定

SparkStreaming概述

Spark概述 SparkStreaming概述 Spark Streaming 是 Apache Spark 生态系统中的一个组件&#xff0c;用于实时流数据处理。它允许用户通过流式计算引擎处理实时数据流&#xff0c;并以低延迟的方式对数据进行分析、处理和存储。 背景 在大数据领域&#xff0c;传统的批处理系统…

什么是云渗透测试?

推荐阅读&#xff1a; 什么是安全态势&#xff1f; 什么是人肉搜索 什么是恶意软件&#xff1f; 什么是数字取证&#xff1f; 什么是语音网络钓鱼&#xff1f; 什么是网络安全中的社会工程&#xff1f; 什么是网络安全中的威胁情报&#xff1f; 什么是端点检测和响应 (…

Java进阶:详解与实战Java Stream API

Java进阶&#xff1a;详解与实战Java Stream API &#x1f31f; Java进阶&#xff1a;详解与实战Java Stream API &#x1f31f;摘要引言一、Java Stream API介绍&#x1f4da;1. 什么是Java Stream API&#xff1f;2. Java Stream API支持的功能3. 使用Java Stream API的优势…

【vue3+elementuiplus】el-select下拉框会自动触发校验规则

场景&#xff1a;编辑弹框省份字段下拉框必填&#xff0c;触发方式change&#xff0c;有值第一次打开不会触发校验提示&#xff0c;关闭弹框再次打开触发必填校验提示&#xff0c;但是该字段有值 问题的原因是&#xff1a;在关闭弹层事件中&#xff0c;我做了resetfileds&…

react-d3-tree:React组件创建交互式D3树形图

在这里插入代码片import React from "react"; import ReactDOM from "react-dom"; import Tree from "react-d3-tree";import "./styles.css";const myTreeData [{name: "Gaurang Torvekar",attributes: {keyA: "val …

如何使用KNN

导入文件和库 加载数据集、拆分数据集 训练模型 预测 打印结果

自定义Linux命令,显示docker镜像、容器信息

1、修改环境变量&#xff08;仅对当前用户有效&#xff09; vim ~/.bashrc2、给命令取别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、让配置重新生效 source ~/.bashrc4、测试&…

STM32F1之OV7725摄像头·SCCB总线代码编写附带源码详解

STM32F1之OV7725摄像头-CSDN博客 STM32F1之OV7725摄像头像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解-CSDN博客 目录 1. 硬件设计 1.1 SCCB 控制相关 1.2 VGA 时序相关 1.3 FIFO 相关 1.4 XCLK 信号 2. 代码设计 2.1 SCCB总线软件实现 2.1.1 宏定…

【GUI开发基础】

GUI开发基础 &#x1f31f;项目文件组成✨浅析Pro文件配置 &#x1f31f;Qt设计师&#x1f31f;剖析UI文件运行机制&#x1f31f;UI设计方式✨可视化UI设计✨代码化UI设计 &#x1f31f;项目文件组成 创建一个QtGUI项目&#xff1a; open QtCreator —> select Creator Pr…

Nvidia 如何成为 AI 训练的超级强国

周三&#xff0c;英伟达公布了第一季度的财务业绩&#xff0c;再次超出了分析师的预期。在截至 4 月 28 日的季度中&#xff0c;该公司的利润同比飙升 262%&#xff0c;股价一度创下 1000 美元以上的新高。 目前&#xff0c;英伟达的市值超过 2.3 万亿美元&#xff0c;是全球第…

从0开始学统计-什么是相关?

1.什么是统计学相关? 在统计学中&#xff0c;“相关”&#xff08;Correlation&#xff09;是指两个变量之间的线性关系程度。相关关系可以表明两个变量在某种程度上共同变化的趋势&#xff0c;但不意味着因果关系。相关的主要衡量方法是相关系数&#xff08;Correlation Coe…

【Linux-INPUT输入的子系统】

Linux-INPUT输入的子系统 ■ input 子系统简介■ input 驱动编写流程■ ■ input 子系统简介 input 子系统就是管理输入的子系统&#xff0c; input 子系统分为 input 驱动层、 input 核心层、 input 事件处理层&#xff0c;最终给用户空间提供可访问的设备节点 ■ input 驱…

shell脚本实战--批量修改文件名

字符串截取 先来了解一下shell字符串相关操作的变量 # 从开头删除匹配最短 ## 从开头删除匹配最长 % 从结尾削除匹配最短 %% 从结尾删除匹配最长#指定字符内容截取 a*c 匹配开头为a&#xff0c;中间任意个字符&#xff0c;结尾为c的字符串 a*C 匹配…

web学习笔记(五十八)

目录 1. v-model 双向数据绑定 2. 事件修饰符 3. 路径别名 4. setup语法糖 4.1 语法糖的概念 4.2 setup语法糖 5. 配置代理服务器 1. v-model 双向数据绑定 v-model 双向数据绑定只能使用在表单标签&#xff1b; v-model双向数据绑定原理&#xff1a;采用 Object.de…

C++的哈希 哈希表 哈希桶

目录 Unordered系列关联式容器 什么是哈希 哈希表 闭散列 载荷因子α 扩容 查找 删除 字符串哈希算法 最终代码 开散列 插入 查找 删除 最终代码 完整代码 Unordered系列关联式容器 C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0…