JAVA实现图书管理系统(思路,和完整代码)

news2024/12/25 22:37:19

因为文件过多每个文件之间的关系如下(每个文件中都只有一个类):

因为JAVA属于面向对象编程的语言,所以我们想要实现图书管理系统就得分以下几步:

  • 找出其中的所有的对象
  • 实现所有的对象
  • 完成对象之间的交互

在图书管理系统中我们可以想到这几个对象用户(用户还可以分为普通用户管理员),还得有存放书的书架

找出对象之后我们将它们分别放在两个包中(一个放书和书架,另一个放普通用户和管理员)。

我们可以在书架类中创建一个书的数组,这样就相当于把书放在了书架中。

package book;

public class BookList {
    public Book[] books;//书架
    public int numBooks;//书架实际存放的书的本书
}

此时你还可以将书类中的属性都用private修饰因为后面我们的所有操作都是针对书架(如果用private修饰就需要对每个属性都实现get 和 set 方法)。

书类包含以下属性:

String name;

String author;

int money;

String type;

boolean isBorrow;

以下方法:

public Book(){};
public Book(String name, String author, int money, String kind) {}
public String getName() {}

public void setName(String name) {}

public String getAuthor() {}

public void setAuthor(String author) {}

public int getMoney() {}

public void setMoney(int money) {}

public String getType() {}

public void setType(String kind) {}

public boolean getBorrow() {}

public void setBorrow(boolean borrow) {}

@Override
public String toString() {
    return  "name='" + name + '\'' +
            ", author='" + author + '\'' +
            ", money=" + money +
            ", kind='" + type + '\'' +
            ", 状态:"+(isBorrow == false ? "未被借出" : "已被借出");
}

此处重写toString是为了可以直接使用System.out.println();输出book

因为普通用户和管理员都属于用户所以可与使用继承让 普通用户管理员继承用户这个父类。

管理员权限:                                                        普通用户权限:

                                                 

 

这样我们就可以利用多态的思想,创建一个用户类,由于引用的对象不同调用相同的方法结果也不相同。

可是现在又有一个新问题就是管理员和普通用户所打印出来的菜单是不同的,所以就不能在父类中实现,所以父类就不能是一个普通的父类,它必须是一个抽象类

因为用户的操作太多而且有重复方法所以这里推荐新建一个包将其全部放入新的包中,并将所有的操作都单独封装成一个类。

操作属于用户所以写成如下格式:

//用户类
abstract public class User {
    protected String name;
    protected Work[] work;//存放用户所有的操作
    public int counst; //work中的元素个数
    
}
//管理员
public class AdvancedUser extends User{

    public AdvancedUser(String name){
        this.name = name;
        this.work = new Work[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };
        this.counst = 5;
    }

}
//普通用户
public class NormalUser extends User {

    public NormalUser(String name){
        this.name = name;
        this.work = new Work[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new RetOperation(),
        };
        this.counst = 4;
    }
    
}

 这样就可以用数组来调用方法

public void operation(int choice, BookList bookList){

        work[choice].work(bookList);
    }

完整代码:

package main;

import book.BookList;
import user.AdvancedUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

public class Main {

    public static User login(){
        Scanner in = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = in.nextLine();
        System.out.println("请选择你的身份:1.管理员    0.普通用户");
        if (in.nextInt() == 1){
            return new AdvancedUser(name);
        }else {
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();
        while(true){
            int choice;
            do{
                choice = user.menu();
            }while(choice < 0 || choice >= user.counst);

            user.operation(choice, bookList);
        }
    }
}
package book;

public class Book {
    private String name;
    private String author;
    private int money;
    private String type;
    private boolean isBorrow;

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

    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 getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public String getType() {
        return type;
    }

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

    public boolean getBorrow() {
        return isBorrow;
    }

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

    @Override
    public String toString() {
        return  "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", money=" + money +
                ", kind='" + type + '\'' +
                ", 状态:"+(isBorrow == false ? "未被借出" : "已被借出");
    }
}
package book;

public class BookList {
    public Book[] books;//书架
    public int numBooks;//书架实际存放的书的本书

    public BookList() {
        this.books = new Book[10];
        //默认书架存放两本书
        this.books[0] = new Book("西游记","吴承恩",39,"小说");
        this.books[1] = new Book("红楼梦","曹雪芹",39,"小说");
        this.numBooks = 2;
    }


}

 

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation extends Work{

    @Override
    public void work(BookList bookList) {
        Scanner in = new Scanner(System.in);
        bookList.books[bookList.numBooks] = new Book();
        System.out.print("请输入书名:");
        bookList.books[bookList.numBooks].setName(in.nextLine());
        System.out.print("请输入作者:");
        bookList.books[bookList.numBooks].setAuthor(in.nextLine());
        System.out.print("请输入所属书类:");
        bookList.books[bookList.numBooks].setType(in.nextLine());
        System.out.print("请输入书价:");
        bookList.books[bookList.numBooks].setMoney(in.nextInt());
        bookList.numBooks++;
    }
}

 

package operation;

import book.BookList;

import java.util.Scanner;

public class BorrowOperation extends Work{

    @Override
    public void work(BookList bookList) {
        int numBooks = bookList.numBooks;

        Scanner in = new Scanner(System.in);
        System.out.print("请输入书名:");
        String name = in.nextLine();

        for (int i = 0; i < numBooks; i++) {
            if (name.equals(bookList.books[i].getName())) {
                if (bookList.books[i].getBorrow() == false){
                    System.out.println("借阅成功");
                    bookList.books[i].setBorrow(true);
                    return;
                }else{
                    System.out.println("该书已被借出");
                    return;
                }
            }
        }
        System.out.println("未收录该书");
    }
}
package operation;

import book.BookList;

import java.util.Scanner;

public class DelOperation extends Work{

    @Override
    public void work(BookList bookList) {
        int numBooks = bookList.numBooks;

        Scanner in = new Scanner(System.in);
        System.out.print("请输入书名:");
        String name = in.nextLine();

        for (int i = 0; i < numBooks; i++) {
            if (name.equals(bookList.books[i].getName())){
                int j = 0;
                for (j = i; j < numBooks-1; j++) {
                    bookList.books[j] = bookList.books[j + 1];
                }
                bookList.books[j] = null;
                bookList.numBooks--;
                return;
            }
        }
    }
}
package operation;

import book.BookList;

public class ExitOperation extends Work{

    @Override
    public void work(BookList bookList) {
        System.exit(0);
    }
}

 

package operation;

import book.BookList;

import java.util.Scanner;

public class FindOperation extends Work{

    @Override
    public void work(BookList bookList) {
        int numBooks = bookList.numBooks;

        Scanner in = new Scanner(System.in);
        System.out.print("请输入书名:");
        String name = in.nextLine();

        for (int i = 0; i < numBooks; i++) {
            if (name.equals(bookList.books[i].getName())) {
                System.out.println(bookList.books[i]);
                return;
            }
        }
        System.out.println("未收录该书");
    }
}
package operation;

import book.BookList;

import java.util.Scanner;

public class RetOperation extends Work{

    @Override
    public void work(BookList bookList) {
        int numBooks = bookList.numBooks;

        Scanner in = new Scanner(System.in);
        System.out.print("请输入书名:");
        String name = in.nextLine();

        for (int i = 0; i < numBooks; i++) {
            if (name.equals(bookList.books[i].getName())) {
                if (bookList.books[i].getBorrow()){
                    System.out.println("归还成功");
                    bookList.books[i].setBorrow(false);
                    return;
                }else{
                    System.out.println("该书未被借出");
                    return;
                }
            }
        }
        System.out.println("未收录该书");
    }
}
package operation;

import book.BookList;

public class ShowOperation extends Work{

    @Override
    public void work(BookList bookList) {
        for (int i = 0; i < bookList.numBooks; i++) {
            System.out.println(bookList.books[i]);
        }
    }
}
package operation;

import book.BookList;

abstract public class Work {
    abstract public void work(BookList bookList);
}
package user;

import operation.*;

import java.util.Scanner;

public class AdvancedUser extends User{

    public AdvancedUser(String name){
        this.name = name;
        this.work = new Work[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };
        this.counst = 5;
    }

    @Override
    public int menu() {
        System.out.println("###########################");
        System.out.println(" Hello " + "AdvancedUser:" + this.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.println("请选择你的操作:");
        Scanner in = new Scanner(System.in);
        return in.nextInt();
    }
}

 

package user;

import operation.*;

import java.util.Scanner;

public class NormalUser extends User {

    public NormalUser(String name){
        this.name = name;
        this.work = new Work[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new RetOperation(),
        };
        this.counst = 4;
    }
    @Override
    public int menu() {
        System.out.println("###########################");
        System.out.println(" Hello " + "NormalUser:" + this.name);
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        System.out.println("###########################");
        System.out.println("请选择你的操作:");
        Scanner in = new Scanner(System.in);
        return in.nextInt();
    }
}
package user;

import book.BookList;
import operation.Work;

abstract public class User {
    protected String name;
    protected Work[] work;//存放用户所有的操作
    public int counst; //work中的元素个数
    abstract public int menu();

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

运行结果:

 

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

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

相关文章

微服务架构基础--第3章Spring Boot核心功能讲解

第3章Spring Boot核心功能讲解 一.预习笔记 1.使用maven创建SpringBoot项目 1-1:创建一个maven项目 1-2:在pom文件中导入依赖 1-3&#xff1a;编写启动类&#xff08;注意启动类的位置&#xff09; 1-4&#xff1a;编写测试类 1-5&#xff1a;运行SpringBoot启动类 2.了解p…

Visual Studio 2022安装

Visual Studio下载网址

基于智慧路灯杆的智慧交通应用示例

智慧路灯杆的身影已经越来越频繁出现在我们的生活之中&#xff0c;无论是我们开车在路上&#xff0c;还是行走在商业街&#xff0c;造型美轮美奂&#xff0c;功能丰富多样的智慧路灯杆&#xff0c;也已经成为了一道独特靓丽的街景。 智慧路灯杆如何发挥其智慧功能&#xff1f;对…

[国产MCU]-BL602开发实例-看门狗定时器(WDG)

看门狗定时器(WDG) 文章目录 看门狗定时器(WDG)1、看门狗定时器(WDG)介绍2、看门狗定时器驱动API介绍3、看门狗定时器使用实例看门狗(Watchdog),又叫看门狗定时器(Watchdog Timer),是一种硬件的计时设备,当系统的主程序发生某些错误时,导致未及时清除看门狗计时器…

入门Echarts数据可视化:从基础到实践

目录 引言数据可视化的重要性Echarts资源与拓展 Echarts简介及开发准备什么是EchartsEcharts的特点与优势安装Echarts引入Echarts库 第一个图表使用Echarts绘制一个简单的柱状图数据准备与图表配置数据格式要求图表标题与标签设置 实践与性能优化提升图表渲染性能的技巧响应式设…

代码分析Java中的BIO与NIO

开发环境 OS&#xff1a;Win10&#xff08;需要开启telnet服务&#xff0c;或使用第三方远程工具&#xff09; Java版本&#xff1a;8 BIO 概念 BIO(Block IO)&#xff0c;即同步阻塞IO&#xff0c;特点为当客户端发起请求后&#xff0c;在服务端未处理完该请求之前&#xff…

ffmpeg 4.4版本对MP4文件进行AES-CTR加密,和流式加密

对于ffmpeg的AES-CTR加密有两种方式&#xff0c;一个是普通的整个视频做加密&#xff0c;另一个是对视频做切片处理&#xff0c;然后进行加密。 一、对于普通的加密方式 直接使用下面的命令就行 ffmpeg -i animal.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes…

VR漫游的“沉浸式”体验,你get到了吗?

信息化时代&#xff0c;几乎每隔一段时间都会出现新的词汇&#xff0c;而“沉浸式”一词仿佛自带流量一般&#xff0c;在很多场景中都有所使用&#xff0c;接下来我们就带大家一起感受下VR漫游所表现出来的“沉浸式”漫游体验。 VR漫游通过专业的全景相机采集高清的图片素材&am…

AWS-自定义ami的S3存取使用

需要提前配置好aws-cli哈 对应的区域 要统一 示例&#xff1a;即AWS-CLI 和 EC2、AMI、S3以上资源均要使用同已区域&#xff0c;以下拿新加坡举例 1.新建自定义AMI 2.查看ami状态 确认是可用状态&#xff0c;才能开始操作 3.aws-cli 开始存入s3 只能使用桶的根目录 开始上…

jdk1.7与jdk1.8的HashMap区别2-底层原理区别

jdk1.7与jdk1.8的HashMap区别1-基本结构与属性对比_ycsdn10的博客-CSDN博客 一、代码区别 1.代码数&#xff1a;JDK1.7与JDK1.8相差了一倍的代码 2.方法数&#xff1a;JDK1.7是40个&#xff0c;JDK1.8是51个&#xff08;只算基本方法&#xff09; 二、Hash差别 1.JDK1.7 st…

【Pytorch+torchvision】MNIST手写数字识别

深度学习入门项目&#xff0c;含代码详细解析 在本文中&#xff0c;我们将在PyTorch中构建一个简单的卷积神经网络&#xff0c;并使用MNIST数据集训练它识别手写数字。 MNIST包含70,000张手写数字图像: 60,000张用于培训&#xff0c;10,000张用于测试。图像是灰度&#xff08;即…

融云:从「对话框」跳进魔法世界,AIGC 带给社交的新范式

8 月 17 日&#xff08;周四&#xff09;&#xff0c;融云将带来直播课-《北极星如何协助开发者排查问题与预警风险&#xff1f;》欢迎点击上方报名~ AIGC 与社交结合的应用主要分两种&#xff0c;一是发乎于 AIGC&#xff0c;以大模型为基础提供虚拟伴侣等服务的 App&#xff…

7个月的测试经验,来面试居然开口要18K,我一问连5K都不值...

2021年8月份我入职了深圳某家创业公司&#xff0c;刚入职还是很兴奋的&#xff0c;到公司一看我傻了&#xff0c;公司除了我一个测试&#xff0c;公司的开发人员就只有3个前端2个后端还有2个UI&#xff0c;在粗略了解公司的业务后才发现是一个从零开始的项目&#xff0c;目前啥…

网络防御(7)

课堂实验 R1 [Huawei] int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 100.1.12.2 24 protocolAug 1 2023 10:24:09-08:00 Huawei gOlIFNET/4/LINK STATE(1)[4]:The1ineIp on the interface GigabitEthernet0/0/0 has entered the Up state. [Huawei-GigabitEthernet0/0/…

lab7 proxylab

前情提要&#xff0c;如果看了书本&#xff0c;这个lab难度不高&#xff0c;但是如果不看书&#xff0c;难度还是挺高的&#xff0c;并且这个lab会用到cachelab中学到的东西&#xff0c;需要阅读 第十章&#xff1a;系统编程第十一章&#xff1a;网络编程第十二章&#xff1a;…

UE5.2 LyraDemo源码阅读笔记(四)

上一篇&#xff08;三&#xff09;讲到在模式玩法UI点击Elimination进入淘汰赛模式。 UI选择点击Elimination后&#xff0c;触发蓝图W_HostSessionScreen的HostSession节点&#xff0c;有&#xff1a; 调用这个方法切换关卡后&#xff0c;会调用到LyraGameMode.cpp的 ALyraGam…

双通道差分2:1/1:2USB31多路复用器/分离器ASW3410

ASW3410 是一个 2:1 或1:2 的数据开关&#xff0c;用于高速数据传输。 ASW3410数据开关支持高性能的各类高速数据 传输协议&#xff0c;如下: USB 3.1 SuperSpeed (Gen 2)10Gbps PCle (Gen 3) SATA 6Gbit/s 光纤通道HDMI 2.0 Display Port 1.2 特性 10GHz 典型带宽 2.5 GHz的…

【C++从0到王者】第十八站:手把手教你写一个简单的优先级队列

文章目录 一、优先级队列简介二、优先级队列的接口说明1.基本介绍及其使用2.构造函数3.求数组中第k个最大的元素 三、手撕优先级队列四、仿函数1.仿函数介绍2.优先级队列添加仿函数3.需要自己写仿函数的情形 五、优先级队列完整代码 一、优先级队列简介 优先级队列是一种容器适…

【网络安全】等保测评系列预热

【网络安全】等保测评系列预热 前言1. 什么是等级保护&#xff1f;2. 为什么要做等保&#xff1f;3. 路人甲疑问&#xff1f; 一、等保测试1. 渗透测试流程1.1 明确目标1.2 信息搜集1.3 漏洞探索1.4 漏洞验证1.5 信息分析1.6 获取所需1.7 信息整理1.8 形成报告 2. 等保概述2.1 …

HEIF—— 1、vs2017编译Nokia - heif源码

HEIF(高效图像文件格式) 一种图片有损压缩格式,它的后缀名通常为".heic"或".heif"。 HEIF 是由运动图像专家组 (MPEG) 标准化的视觉媒体容器格式,用于存储和共享图像和图像序列。它基于著名的 ISO 基本媒体文件格式 (ISOBMFF) 标准。HEIF读写器引擎…