Java_实现图书管理系统

目录

前言

框架核心思想

框架的实现

书类和书架类的实现

功能接口实现

功能的声明

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

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;
            }
        }
    }
}

 

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

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

相关文章

【源码系列】情侣游戏小程序系统开发飞行棋扫雷大冒险

系统介绍 情侣游戏小程序系统&#xff0c;为情侣们提供了一种全新的互动方式。通过专属的游戏体验、创新的游戏玩法、丰富的道具与场景、个性化定制以及实时互动与社交等功能&#xff0c;该系统让爱情在棋盘上飞舞&#xff0c;为情侣们带来了更多的乐趣和益处。随着技术的不断…

Python实现求解上个工作日逻辑

目录 一、需求描述二、代码实现三、测试结果 一、需求描述 因工作需要&#xff0c;现需获取任意一个日期的上个工作日&#xff0c;要求考虑法定假日及周末。 例如&#xff1a;2024年2月10日&#xff08;春节&#xff09;的上一个工作日为2024年2月9日&#xff0c;2024年2月17…

【C++】数组中出现次数超过一半的数字

代码&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型vector * return int整型*/int MoreThanHalfNum_Solution(vector<int>& numbers) {int …

spring学习笔记-IOC,AOP,事务管理

目录 概述 什么是spring 侵入式的概念 spring的核心 spring的优势 注意 IOC控制反转 概述 核心 容器 DI&#xff0c;dependency injection依赖注入 概念 注入方式 循环依赖 spring如何解决循环依赖 spring生成Bean的方式 Bean属性注入&#xff08;Bean属性赋值…

如何用Postman做接口自动化测试?一文带你学会

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用…

MoveIt 机械臂运动 学习 01-MoveIt 初次见面

ROS中有针对机器人进行移动操作的一套工具——MoveIt&#xff01;。在主页http://moveit.ros.org 上 包含使用MoveIt&#xff01;的文档、教程、安装说明以及多种机械臂&#xff08;或机器人&#xff09;的示例演示&#xff0c;如一些 移动操作任务&#xff0c;包括抓握、拾取和…

鸿蒙4.0真机调试踩坑

传言鸿蒙next版本将不再兼容Android&#xff0c;所以领导安排做下鸿蒙开发的调研工作。 鸿蒙开发指南其实已经非常的友好了。但是鸿蒙开发本身还是有些坑要踩&#xff0c;这篇文章主要讲了鸿蒙真机调试问题。 目前手上的真机为华为 nova6&#xff0c;处理器为麒麟990.鸿蒙系统…

AI换脸的一种技术实施例

刚刚看一个帖子的时候发现了AI识别中一个可以利用到其它场景的的一个通用处理步骤&#xff1a;人脸矫正。 人脸识别过程&#xff1a; 1.首先识别到关键的人脸部分&#xff0c;经过一个粗筛过程&#xff0c;把目标物的脸部图样先抓出来。 2.然后&#xff0c;因为人脸的水平&…

vue3基础学习(上)

##以前怎么玩的? ###MVC Model:Bean View:视图 Controller ##vue的ref reactive ref:必须是简单类型 reactive:必须不能是简单类型 ###创建一个Vue项目 npm init vuelatest ###生命周期 ###setup相关 ####Vue2的一些写法 -- options API ####Vue3的写法 组合式API Vu…

好用且强大——JNPF永远的神

一款开源且强大的工具 风流数年&#xff0c;只看今朝&#xff0c;Linux 让我们看到了开源驱动下的生产力&#xff0c;其实低代码和它一样&#xff0c;都是提高效率、降低成本的工具。 近 10 年间&#xff0c;JNPF 低代码平台如火如荼的发展起来&#xff0c;堪称黑马也不为过。这…

借助拧紧曲线高效管理螺栓装配防错——SunTorque智能扭矩系统

拧紧曲线作为拧紧质量的“晴雨表”&#xff0c;在拧紧过程中&#xff0c;能够实时探知到拧紧状态是否存在异常&#xff0c;并根据曲线特质推测出拧紧过程中遇到了什么样的问题&#xff0c;今天SunTorque智能扭矩系统带您了解拧紧曲线在螺栓装配防错管理中如何发挥作用。 合格的…

网络和Linux网络_2(套接字编程)socket+UDP网络通信代码

目录 1. 预备知识 1.1 源IP地址和目的IP地址 1.2 端口号port和套接字socket 1.3 网络通信的本质 1.4 TCP和UDP协议 1.5 网络字节序 2. socket套接字 2.1 socket创建套接字 2.2 bind绑定 2.3 sockaddr结构体 3. UDP网络编程 3.1 server的初始化服务器 3.2 server的…

Java小游戏之——贪吃蛇

今天详细讲解写贪吃蛇的遇到的问题 代码&#xff1a; Main类 GrameStart类 GamePanel类 启动main方法 在写贪吃蛇的时候&#xff0c;我接触到了两个新东西&#xff1a; 1.定时器Timer类。 2.paint&#xff08;&#xff09;绘图方法。第一次出现在java.awt.Component类中&…

云性能监控的五大重要性

在当今数字化时代&#xff0c;企业越来越依赖云服务来支持其IT基础设施和业务运营。为了确保这些云服务的稳定性和性能&#xff0c;云性能监控变得至关重要。本文将探讨云性能监控的重要性。 一、实时可见性 云性能监控提供了对云基础设施和应用程序性能的实时可见性。这意味着…

探索arkui(2)--- 布局(列表)--- 1(列表数据的展示)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

【LeetCode刷题-滑动窗口】--487.最大连续1的个数II

487.最大连续1的个数II 方法&#xff1a;滑动窗口 维护一个区间&#xff0c;使得该区间中只包含一个0 class Solution {public int findMaxConsecutiveOnes(int[] nums) {int n nums.length;int left 0,right 0,sum 0;int zero 0; //计算0的个数while(right < n){if(…

基于JavaWeb+SpringBoot+Vue房屋租赁系统微信小程序系统的设计和实现

基于JavaWebSpringBootVue房屋租赁系统微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 21世纪是信息的时代&#xff0c;是网络的时代&#xff0c;进入信息社会高速…

(C++)把字符串转换成整数

把字符串转换成整数_牛客题霸_牛客网 愿所有美好如期而遇 思路 看到这个题目我们首先应该想到的就是去处理第一个字符&#xff0c;但是第一个字符也可能是数字字符&#xff0c;所以我们需要对他单独处理&#xff0c;如果他不符合条件&#xff0c;直接return&#xff0c;符合条…

java实现钉钉机器人消息推送

项目开发中需要用到钉钉机器人发送任务状态&#xff0c;本来想单独做一个功能就好&#xff0c;但是想着公司用到钉钉机器人发送项目挺多的。所以把这个钉钉机器人抽离成一个组件发布到企业maven仓库&#xff0c;这样可以给其他同事用提高工作效率。 1.目录结构 2.用抽象类&…