五分钟”手撕“图书管理系统

news2024/11/24 17:47:57

前言:

图书馆管理系统需要结合JavaSE的绝大部分知识,是一个很好的训练项目。

为了让大家更加方便的查阅与学习,我把代码放开头,供大家查询。

还有对代码的分析,我将以类为单位分开讲解。

目录

全部代码 

Main类 

User类 

BookList类 

Book类 

NormalUser类 


 

全部代码 

/*一共有三个包*/

//User包
//User.java
package user;
import Book.BookList;
import Operation.IOparetion;

public abstract class User {
    protected String name;
    protected IOparetion[] iOparetions;

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public void doIOparetion(int chioce, BookList bookList){
        this.iOparetions[chioce].work(bookList);
    }
}







//User包
//NormalUser.java
package user;
import Operation.*;
import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOparetions= new IOparetion[] {
                new ExitOparetion(),
                new FindOparetion(),
                new BorrowedOparetion(),
                new ReturnOparetion()
    };
    }
    @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);
        int choice= scanner.nextInt();
        return choice;
    }
}






//User包
//Administrators.java
package user;
import Operation.*;
import java.util.Scanner;

public class Administrators extends User {
    public Administrators(String name) {
        super(name);
        this.iOparetions = new IOparetion[]{
                new ExitOparetion(),
                new FindOparetion(),
                new AddOparetion(),
                new DelOparetion(),
                new ShowOparetion()
        };
    }
    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("0.退出系统");
        System.out.println("******************");
        System.out.println("请输入数字:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}





//Book包
//Book.java
package Book;

public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isLend;

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

    public void setLend(boolean lend) {
        isLend = lend;
    }

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





//Book包
//BookList.java
package Book;

public class BookList {
    private Book[] book=new Book[10];
    private int usedSize;

    public Book getBook(int pos) {
        return book[pos];
    }

    public void setBook(int pos,Book book) {
        this.book[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

    public BookList() {
        book[0]=new Book("西游记","吴承恩",19,"小说");
        book[1]=new Book("三国演义","罗贯中",36,"小说");
        book[2]=new Book("红楼梦","曹雪芹",13,"小说");
        this.usedSize=3;
    }
    public boolean isFull(){
        if(usedSize==book.length){
            return true;
        }return false;
    }
}





//Oparetion包
//Ioparetion.java
package Operation;

import Book.BookList;

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





//Oparetion包
//AddOparetion.java
package Operation;

import Book.Book;
import Book.BookList;
import java.util.Scanner;

public class AddOparetion implements IOparetion {
    @Override
    public void work(BookList bookList) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要添加的书籍名字");
        String name=scanner.nextLine();
        System.out.println("请输入作者的名字");
        String author=scanner.nextLine();
        System.out.println("请输入书的种类");
        String type=scanner.nextLine();
        System.out.println("请输入书的价格");
        int price=scanner.nextInt();
        Book book=new Book(name,author,price,type);
        if(bookList.isFull()){
            System.out.println("书架满了,借阅失败");
            return;
        }
        bookList.setBook(bookList.getUsedSize(), book);
        bookList.setUsedSize(bookList.getUsedSize()+1);
        System.out.println("添加成功");
    }
}




//Oparetion包
//BorrowedOparetion.java
package Operation;

import Book.BookList;
import java.util.Scanner;

public class BorrowedOparetion implements IOparetion{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入你要找的书名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        for(int i=0;i<bookList.getUsedSize();i++){
            if(name.equals(bookList.getBook(i).getName())){
                bookList.getBook(i).setLend(true);
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("借阅失败");
    }
    }




//Oparetion包
//DelOparetion.java
package Operation;

import Book.BookList;
import java.util.Scanner;

public class DelOparetion implements IOparetion{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入你要删除的书籍名字");
        Scanner scanner=new Scanner(System.in);
        String s=scanner.nextLine();
        int pos=-1;
        int i=0;
        for (;i<bookList.getUsedSize();i++){
            if(s.equals(bookList.getBook(i))){
                pos=i;
            }
            if(i>=bookList.getUsedSize()){
                System.out.println("没有你要找的书");
                return;
            }
        }for(int j=i;i<bookList.getUsedSize()-1;i++){
            bookList.setBook(j,bookList.getBook(j+1));

        }
        bookList.setBook(bookList.getUsedSize(), null);
        bookList.setUsedSize(bookList.getUsedSize()-1);
        System.out.println("删除成功");
    }
}





//Oparetion包
//ExitOparetion.java
package Operation;
import Book.BookList;

public class ExitOparetion implements IOparetion {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统中....");
        for(int i=0;i<bookList.getUsedSize()-1;i++){
            bookList.setBook(i,null);
        }
        System.exit(0);
    }
}




//Oparetion包
//FindOparetion.java
package Operation;

import Book.BookList;
import java.util.Scanner;

public class FindOparetion implements IOparetion{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入你要找的书名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        for(int i=0;i<bookList.getUsedSize();i++){
            if(name.equals(bookList.getBook(i).getName())){
                System.out.println("找到了,下标为:"+i);
                System.out.println(bookList.getBook(i));
                return;
            }
        }
        System.out.println("没找到");
    }
}




//Oparetion包
//ReturnOparetion.java
package Operation;

import Book.BookList;
import java.util.Scanner;

public class ReturnOparetion implements IOparetion{
    @Override
    public void work(BookList bookList) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要归还的书名");
        String s=scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize()-1; i++) {
            if(s.equals(bookList.getBook(i).getName())){
                bookList.getBook(i).setLend(false);
                System.out.println("归还成功");
                return;
            }
        }
        System.out.println("归还失败,没有你要归还的书");
    }
}




//Oparetion包
//ShowOparetion.java
package Operation;
import Book.BookList;

public class ShowOparetion implements IOparetion{
    @Override
    public void work(BookList bookList) {
        for(int i=0;i<bookList.getUsedSize();i++){
            System.out.println(bookList.getBook(i));
        }
    }
    }

 首先,我们需要打个框架出来,由于java是一门面向对象的编程,所以我们应该要多考虑对象,而不是过程。

我将它分为三个包:User、Book、operation包,其实对象有:书架、书、用户、管理员。

总体请看下图:

 

这里我主要讲解大致结构和细微的细节 ,因为方法的思路在数据结构讲解更加清晰

Main类 

public class Main {
    public static User login(){
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你的名字");
        String name=scanner.nextLine();
        System.out.println("请输入你的身份:1.普通用户  2.管理员用户");
        int choice =scanner.nextInt();
        if(choice==1){
            NormalUser normalUser=new NormalUser(name);
            return normalUser;
        }else{
            Administrators administrators=new Administrators(name);
            return administrators;
        }
    }
    public static void main(String[] args) {
        BookList bookList=new BookList();
        User user=login();
        while (true){
            int ret=user.menu();
            user.doIOparetion(ret,bookList);
        }
    }
}

 上述代码中:

Scanner来new一个对象来输入,int一个choice来接收选1还是2,选择是管理人还是普通用户。

由于要返回一个对象,所以login的返回值是user类型的,user与管理员和普通用户是父子关系,在main中用user类型接收,属于向上转型(好处就是发生多态)

User类 

package user;
import Book.BookList;
import Operation.IOparetion;

public abstract class User {
    protected String name;
    protected IOparetion[] iOparetions;

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public void doIOparetion(int chioce, BookList bookList){
        this.iOparetions[chioce].work(bookList);
    }
}

 上述代码中:

User作为父类,被管理员和普通用户继承,被abstract修饰主要是为了menu这个方法被继承,实现多态

IOparetion是一个接口,是为了被那些add和del等等方法实现的,还是实现多态,

它现在作为一个数组来接收,是为了存放这些方法,这样就不用一个个在用户或者管理员里面书写了,可以直接定义为一个类(这也是为什么方法可以另外书写的原因),这体现了面向对象的特点,大大缩短了工程量和分模块的简洁性(即使下次有人需要用,不需要再写,直接调用就好了)。

BookList类 

package Book;

public class BookList {
    private Book[] book=new Book[10];
    private int usedSize;

    public Book getBook(int pos) {
        return book[pos];
    }

    public void setBook(int pos,Book book) {
        this.book[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

    public BookList() {
        book[0]=new Book("西游记","吴承恩",19,"小说");
        book[1]=new Book("三国演义","罗贯中",36,"小说");
        book[2]=new Book("红楼梦","曹雪芹",13,"小说");
        this.usedSize=3;
    }
    public boolean isFull(){
        if(usedSize==book.length){
            return true;
        }return false;
    }
}

 对于上述代码:

由于java是面向对象编程,所以对于一些信息不需要用户来知道内部是怎么实现的,所以用private修饰,这样的话需要set和get方法来获取,这样之后的代码都需要调用set和get来获取或者是赋值。

BookList是书架,所以里面是摆书的,所以用Book类型作为数组,来收取book。可以放很多本。

usedsize是有效书籍数,就是记录里面有多少本。

Book类 

package Book;

public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isLend;

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

    public void setLend(boolean lend) {
        isLend = lend;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (isLend==true?"已借出":"未借出")+
                '}';
    }
}

对于上述代码:

Book是类,它代表的是一本书,所以你需要定义名字作者价格什么什么的。

也是利用封装,只把必要的信息给用户,所以用privat密封起来,更加安全一点,所以需要set和get方法。

这里的toString方法里面有个三目操作符,如果isLend被借出的话,就是true,就会打印已借出,否则为借出。 

NormalUser类 

package user;
import Operation.*;
import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOparetions= new IOparetion[] {
                new ExitOparetion(),
                new FindOparetion(),
                new BorrowedOparetion(),
                new ReturnOparetion()
    };
    }
    @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);
        int choice= scanner.nextInt();
        return choice;
    }
}

对于上述代码:

如果继承了父类,使用构造方法时候需要先把父类的构造方法实现。

因为IOparetion是user里面的,user被普通用户继承,所以可以直接访问把他变成一个数组,这样就可以存方法了,不用在这普通用户这个类里一个一个方法写,直接脱离出来,非常充分体现了面向对象的特点!

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

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

相关文章

【NumPy】NumPy实战入门:线性代数(dot、linalg)与随机数(numpy.random)详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

redis--redis Cluster

简介 解决了redis单机写入的瓶颈问题&#xff0c;即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素无中心架构的redis cluster机制&#xff0c;在无中心的redis集群当中&#xff0c;其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连…

高阶路由过渡处理方案 —— 浏览器堆栈主动介入

目录 01: 前言 02: VueRouter 过渡动效可行性分析 03: 主动介入浏览器堆栈管理&#xff0c;分析可行性方案 04: 主动介入浏览器堆栈管理 05: 基于 GSAP 实现高阶路由过渡动画分析 06: 基于 GSAP 实现高阶路由过渡动画处理 07: 通用组件&#xff1a;navbar 构建方案分析…

202206青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 下图所示, 有一个名为"书目.csv"的文件。 小明针对这个文件编写了 5 行代码,请问, 代码运行到最后打印在屏幕上的结果是? ( ) with open(书目.csv, r, encoding=utf-8) as f:for line in f.readlines

Rabbitmq-Windows 安装

第一步&#xff1a;下载并安装erlang &#xff11;.原因&#xff1a;RabbitMQ服务端代码是使用并发式语言Erlang编写的&#xff0c;安装Rabbit MQ的前提是安装Erlang &#xff12;.下载地址&#xff1a;http://www.erlang.org/downloads 3.双击&#xff0c;点next就可以 4.选…

【网络技术】【Kali Linux】Wireshark嗅探(十四)QUIC(快速UDP互联网连接)协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

【Unity2D:Animator】为角色添加动画效果

一、添加Animator组件并创建Animator Controller文件 1. 添加Animator组件&#xff1a; 2. 在Assets-Art文件夹中新建一个名为Animations的文件夹&#xff0c;用来存储所有动画资源 3. 在Animations文件夹中新建一个名为Player的文件夹&#xff0c;再创建一个名为Animators的文…

2024电工杯数学建模A题Matlab代码+结果表数据教学

2024电工杯A题保姆级分析完整思路代码数据教学 A题题目&#xff1a;园区微电网风光储协调优化配置 以下仅展示部分&#xff0c;完整版看文末的文章 %A_1_1_A % 清除工作区 clear;clc;close all;warning off; %读取参数%正常读取 % P_LOADxlsread(附件1&#xff1a;各园区典…

springboot vue 开源 会员收银系统 (2) 搭建基础框架

前言 完整版演示 前面我们对会员系统https://blog.csdn.net/qq_35238367/article/details/126174288进行了分析 确定了技术选型 和基本的模块 下面我们将从 springboot脚手架开发一套收银系统 使用脚手架的好处 不用编写基础的rabc权限系统将工作量回归业务本身生成代码 便于…

盲人社会适应性训练:打开生活的新篇章

在现代社会的快节奏中&#xff0c;每一位成员都在寻求更好的方式来适应环境&#xff0c;对于盲人群体而言&#xff0c;这种适应性尤为关键。盲人社会适应性训练作为一个旨在提升盲人生活质量和独立性的系统性过程&#xff0c;正逐步受到广泛关注。在这一过程中&#xff0c;一款…

Jmeter+prometheus+grafana性能测试

文章目录 Jmeterprometheusgrafana性能测试背景目标设计思路原理案例启发 Jmeterprometheusgrafana性能测试 背景 ​ 在现代社会中&#xff0c;人们对于应用程序的响应速度和性能体验提出了越来越高的要求。无论是电子商务网站、社交媒体平台还是企业级软件系统&#xff0c;都…

Playwright教程

Playwright简介 支持多数浏览器 在Chromium&#xff0c;Firefox和WebKit上进行测试。Playwright拥有适用于所有现代浏览器的完整API覆盖&#xff0c;包括Google Chrome和Microsoft Edge&#xff08;带有Chromium&#xff09;&#xff0c;Apple Safari&#xff08;带有WebKit&a…

VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION--论文笔记

论文笔记 论文来源 Very Deep Convolutional Networks for Large-Scale Image Recognition 代码来源 还没上传 数据集 这里采用的是猫狗数据集 还没上传 1论文摘要的翻译 在这项工作中&#xff0c;我们研究了卷积网络深度对其在大规模图像识别设置中的准确性的影响。我…

CTFHUB技能树——SSRF(二)

目录 上传文件 ​FastCGI协议 Redis协议 上传文件 题目描述&#xff1a;这次需要上传一个文件到flag.php了.祝你好运 index.php与上题一样&#xff0c;使用POST请求的方法向flag.php传递参数 //flag.php页面源码 <?phperror_reporting(0);if($_SERVER["REMOTE_ADDR&…

删除MySQL中所有表的外键

方法一&#xff1a; 原理 查询schema中所有外键名称然后拼接生成删除语句 第一步&#xff1a; SELECT CONCAT(ALTER TABLE ,TABLE_SCHEMA,.,TABLE_NAME, DROP FOREIGN KEY ,CONSTRAINT_NAME, ;) FROM information_schema.TABLE_CONSTRAINTS c WHERE c.TABLE_SCHEMA数据库名…

node环境问题(无法加载文件D:\Software\Node.js\node_global\vue.ps1,因为在此系统上禁止运行脚本。)

问题&#xff1a;npm安装lerna显示安装成功&#xff0c;但是lerna -v的时候报错 解决步骤&#xff1a; 1、输入&#xff1a;Get-ExecutionPolicy 2、输入&#xff1a;Set-ExecutionPolicy -Scope CurrentUser&#xff08;有选项的选Y&#xff09; 3、输入&#xff1a;RemoteSi…

超详细的前后端实战项目(Spring系列加上vue3)前端篇(二)(一步步实现+源码)

好了&#xff0c;兄弟们&#xff0c;继昨天的项目之后&#xff0c;开始继续敲前端代码&#xff0c;完成前端部分 昨天完成了全局页面的代码&#xff0c;和登录页面的代码&#xff0c;不过昨天的代码还有一些需要补充的&#xff0c;这里添加一下 内容补充&#xff1a;在调用登…

信息系统项目管理师0129:输入(8项目整合管理—8.7监控项目工作—8.7.1输入)

点击查看专栏目录 文章目录 8.7 监控项目工作8.7.1 输入8.7 监控项目工作 监控项目工作是跟踪、审查和报告整体项目进展,以实现项目管理计划中确定的绩效目标的过程。本过程的主要作用: 让干系人了解项目的当前状态并认可为处理绩效问题而采取的行动;通过成本和进度预测,让…

房地产支持政策加码不断,美克家居全力变革未来可期

2023年我国经济处于恢复发展阶段&#xff0c;而家具制造业“回温”速度明显慢于经济增速&#xff0c;在这一背景下&#xff0c;美克家居如此营收表现并不令人感到意外。而在充沛现金流支撑下&#xff0c;辅以全方位开展降本增效的年度经营规划&#xff0c;公司亏损收窄或已为期…

rclone迁移对象存储之间的数据

1 概述 rclone是一款文件复制工具&#xff0c;既可以用于在linux主机之间复制文件&#xff0c;也可以在对象存储之间复制文件。 rclone的官网为&#xff1a; https://rclone.orgrlcone关于对象存储的官方文档为&#xff1a; https://rclone.org/s32 安装 2.1 yum安装 yum …