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

news2024/11/19 11:21:27

一.抽象出对象:

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("没有找到你要借阅的那本书");
    }
}

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

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

相关文章

C++ List完全指南:使用方法与自定义实现

文章目录 list的使用几种构造函数 list的实现1.节点类的定义1.1节点类的构造函数 2.正向迭代器实现2.1operator*重载2.2operator->重载2.3operator重载2.4operator--2.5operator和operator&#xff01; 3.反向迭代器实现3.1operator*重载3.2operator->重载3.3operator重载…

SpringBoot使用Mock进行单元测试

需求说明&#xff1a;需要对一个service接口进行单元测试 1.在pom.xml中加入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

计算机网络 1

两台主机想通信&#xff0c;其实本质就是两个文件的资源交换&#xff0c;但是长距离的通信&#xff0c;面临的是很多的问题。这个时候需要通过一些方式来保证可靠性 什么是协议 这样一个例子&#xff0c;我是住在农村&#xff0c;我读高中了我需要去县里面读书。这个时候呢&…

arm64虚拟化-CPU虚拟化

arm64虚拟化-CPU虚拟化 1 虚拟化1.1 CPU虚拟化1.2 内存虚拟化1.3 I/O虚拟化 2 异常状态2.1 AArch642.2 AArch32 3 启动到EL2异常等级4 CPU虚拟化4.1 进入VM4.2 退出VM 本篇博客是基于对苯叔《ARM64高级特性专题》的学习而总结的&#xff0c;大家如有需要可以去淘宝或者奔跑吧li…

【Nginx <末>】Nginx 基于 IP 地址的访问限制

目录 &#x1f44b;前言 &#x1f4eb;一、限制 IP 可以实现哪些功能 &#x1f440;二、 项目实现 2.1 访问控制实现 2.2 Nginx 配置中指定 IP 地址 &#x1f49e;️三、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;前面一段时间学习了 Nginx 的相关知识&#xff0c…

DAMA数据管理知识体系必背18张框图

近期对数据管理知识体系中比较重要的框图进行了梳理总结,总共有18张框图,供大家参考。主要涉及数据管理、数据治理阶段模式、数据安全需求、主数据管理关键步骤,主数据架构、DW架构、数据科学的7个阶段、数据仓库建设活动、信息收敛三角、大数据分析架构图、数据管理成熟度等…

Jenkins--从入门到入土

Jenkins–从入门到入土 文章目录 Jenkins--从入门到入土〇、概念提要--什么是CI/DI&#xff1f;1、CI&#xff08;Continuous Integration&#xff0c;持续集成&#xff09;2、DI&#xff08;DevOps Integration&#xff0c;DevOps 集成&#xff09;3、解决的问题 一、Jenkins安…

【深度学习】1.手动LogisticRegression模型的训练和预测

通过这个示例&#xff0c;可以了解逻辑回归模型的基本原理和训练过程&#xff0c;同时可以通过修改和优化代码来进一步探索机器学习模型的训练和调优方法。 步骤&#xff1a; 生成了一个模拟的二分类数据集&#xff1a;通过随机生成包含两个特征的数据data_x&#xff0c;并基于…

Android Compose 九:interactionSource 的使用

先上官方文档 InteractionSource InteractionSource represents a stream of Interactions corresponding to events emitted by a component. These Interactions can be used to change how components appear in different states, such as when a component is pressed or…

WordPress安装memcached提升网站速度

本教程使用环境为宝塔 第一步、服务器端安装memcached扩展 在网站使用的php上安装memcached扩展 第二步&#xff1a;在 WordPress 网站后台中&#xff0c;安装插件「Memcached Is Your Friend」 安装完成后启用该插件&#xff0c;在左侧工具-中点击Memcached 查看是否提示“U…

《拯救大学生课设不挂科第四期之蓝桥杯是什么?我是否要参加蓝桥杯?选择何种语言?如何科学备赛?方法思维教程》【官方笔记】

背景&#xff1a; 有些同学在大一或者大二可能会被老师建议参加蓝桥杯&#xff0c;本视频和文章主要是以一个过来人的身份来给与大家一些思路。 比如蓝桥杯是什么&#xff1f;我是否要参加蓝桥杯&#xff1f;参加蓝桥杯该选择何种语言&#xff1f;如何科学备赛&#xff1f;等…

webpack5生产模式

生产模式 生产模式准备 开发模式和生产模式有不同的 配置文件 2修改webpack.prod.js文件修改webpack.dev.js文件 修改webpack.dev.js文件 1》修改输出路径为undefined 2》将绝对路径进行修改&#xff0c;进行回退 此时文件的执行命令为 修改webpack.prod.js文件 1》修改绝…

跨平台之用VisualStudio开发APK嵌入OpenCV(三)

本篇将包含以下内容&#xff1a; 1.使用 Visual Studio 2019 开发一个 Android 的 App 2.导入前篇 C 编译好的 so 动态库 3.一些入门必须的其它设置 作为入门&#xff0c;我们直接使用真机进行调试&#xff0c;一方面运行速度远高于模拟器&#xff0c;另一方面模拟器使用的…

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员考试资料题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安全管理…

Zoho Campaigns邮件营销怎么发邮件?

Zoho Campaigns&#xff0c;作为业界领先的邮件营销平台&#xff0c;以其强大的功能、用户友好的界面以及深度的分析能力&#xff0c;为企业提供了一站式的邮件营销解决方案&#xff0c;助力企业高效地触达目标受众&#xff0c;构建并巩固庞大的客户基础。云衔科技为企业提供Zo…

电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载

电量计量芯片HLW8110的前端电路设计与误差分析校正.pdf 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1vlCtC3LGFMzYpSUUDY-tEg 提取码&#xff1a;8110

用Prometheus全面监控MySQL服务:一篇文章搞定

简介 在现代应用中&#xff0c;MySQL数据库的性能和稳定性对业务至关重要。有效的监控可以帮助预防问题并优化性能。Prometheus作为一款强大的开源监控系统&#xff0c;结合Grafana的可视化能力&#xff0c;可以提供全面的MySQL监控方案。 设置Prometheus 安装Prometheus 使…

深度学习面试问题总结(21)| 模型优化

本文给大家带来的百面算法工程师是深度学习模型优化面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习面试问题&#xff0c;并提供参考的回答及其理论基础&a…

ic基础|时钟篇05:芯片中buffer到底是干嘛的?一文带你了解buffer的作用

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

leecode 637 二叉树的层平均值

leetcode 二叉树相关-层序遍历专题 二叉树的层序遍历一般来说&#xff0c;我们是利用队列来实现的&#xff0c;先把根节点入队&#xff0c;然后在出队后将其对应的子节点入队&#xff0c;然后往复此种操作。相比于二叉树的遍历递归&#xff0c;层序遍历比较简单&#xff0c;有…