开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

news2025/1/23 1:10:03

图书管理系统

一、设计思路

1、首先需要区分两类人,图书管理员和借书用户,不同的用户要展现不同的界面,利用继承和多态可以将其实现。

2、要将不同的操作封装起来,单独设计成为一个类,为了规范实现,需要使用接口。

3、要将书的属性进行封装,设立一个书架,及存放书的数组。

4、实现管理员添加书籍,查找书籍,删除书籍以及显示书籍。

5、读者可以查找书籍,借阅书籍以及归还书籍。

二、代码

1、book类的实现

书籍的属性有书名、作者、类型以及是否被借出,结合封装、private权限,并提供相应的get 方法和set 方法,空参构造器以及一个不包含是否被借出的构造器(布尔值的默认类型就是false,可以不进行初始化)并需要提供对应的toString()方法的重写

代码实现如下:

package com.sh.Library;

public class Book {
        private String name;
        private String author;
        private String type;
        private boolean isBorrowed; //是否被借出
        //构造器
        public Book(){

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

        //get、set方法
        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 String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public boolean isBorrowed() {
            return isBorrowed;
        }
        public void setBorrowed(boolean borrowed) {
            isBorrowed = borrowed;
        }

        //重写toString()
        public String toString() {
            return "Book{" + "书名:'" + name + '\'' + ", 作者:'" + author + '\'' + ", 类型:'" + type + '\'' + ", 是否借出:" + isBorrowed + '}';
        }
    }

2、BookList类的实现

BookList类提供一个ArrayList的泛型数组来进行Book的存储,便于后面对书籍的操作。

BookList类我们提供一个私有的ArrayList的泛型数组,同时在空参构造器中对其初始化,先加入几本书籍,并提供对应的get和set方法

代码实现如下:

package com.sh.Library;

import java.util.ArrayList;

    public class BookList {
        private ArrayList<Book> books = new ArrayList<Book>();
        public BookList() {
            books.add(new Book("倾城之恋","张爱玲","小说"));
            books.add(new Book("背影","朱自清","散文"));
            books.add(new Book("你好,旧时光","八月长安","小说"));
        }
        public Book getBook(int pos){ //获取某个位置上的书籍
            return books.get(pos);
        }
        public void setBook(int pos,Book book){ //设置某个位置上的书籍
            books.set(pos,book);
        }
        public ArrayList<Book> getBooks(){  //获取书架,便于后面的Operation的使用
            return books;
        }
    }

3、OperationException

异常的出现一般出现在操作中,我们可以通过自定义异常类的方式来处理不同异常情况的发生(也可以不进行定义),我们的自定义也提供一个空参构造器,和一个有参构造器用来打印异常信息(自定义异常类需要继承Exception类)

代码实现如下:

package com.sh.Library;public class OperationException extends Exception{
    static final long serialVersionUID=-33875169931L;
    //空参构造器
    public OperationException(){

    }
    public OperationException(String message){
        super(message); //Exception类中存在String参数的构造器和message
    }
}


4、用户类的实现

用户类中,我们需要定义用户的名字,同时定义一个抽象方法menu()来给子类管理员类和读者类重写(二者的目录不同),同时要提供set和get方法,并提供抽象Operation方法给子类重写使用(子类的目录不同,执行的操作就会存在差异)

代码实现如下:

package com.sh.Library;

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

    public abstract void menu();

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name=name;
    }
    public abstract void Operation(int n, BookList bookList)throws OperationException;
    //子类的Operation会抛出异常来处理异常,父类也需要抛出异常,
    //因为父类抛出异常大小要大于子类重写方法抛出的异常
}

5、操作接口的实现

我们需要执行的操作有增加,删除,显示,查找等,他们都需要遵循一定的规范,而这个规范就由接口来实现,在增删查改等操作中,他们的主要方式就是工作,即work(),故接口中提供对应的work()方法供接口的实现类,即各种操作进行重写

代码实现如下:

package com.sh.Library;

public interface IOperation{
    void work(BookList bookList)throws Exception;
}

6、操作类实现

(1)增加

我们需要将操作类实现操作接口,同时为重写的方法提供书架类,便于进行操作。代码实现如下:

添加操作并没有什么异常,在简易图书系统中不需要对书籍的信息进行检验。

package com.sh.Library;

import java.util.Scanner;
    public class AddOperation implements IOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("新增图书!");
            Scanner scan=new Scanner(System.in);
            System.out.println("请输入要新增图书的名字:");
            String name=scan.next();
            System.out.println("请输入作者的名字:");
            String author=scan.next();
            System.out.println("请输入图书的类型:");
            String type=scan.next();
            Book book=new Book(name,author,type); //新建书籍
            bookList.getBooks().add(book); //使用ArrayList的add来进行图书的添加
            System.out.println("添加成功!");
        }
    }

(2)添加

查找操作只有两种情况,一种是找到了,另一种自然就是没找到,在没找到的时候我们就可以选择抛出一个异常,查找操作的具体实现还是通过遍历来实现

代码如下:

package com.sh.Library;

import java.util.Scanner;
    public class AddOperation implements IOperation{
        public void work(BookList bookList) {
            System.out.println("新增图书!");
            Scanner scan=new Scanner(System.in);
            System.out.println("请输入要新增图书的名字:");
            String name=scan.next();
            System.out.println("请输入作者的名字:");
            String author=scan.next();
            System.out.println("请输入图书的类型:");
            String type=scan.next();
            Book book=new Book(name,author,type); //新建书籍
            bookList.getBooks().add(book); //使用ArrayList的add来进行图书的添加
            System.out.println("添加成功!");
        }
    }

(3)删除

删除操作同理,也是提供相应的书名,然后进行搜索,如果找到了,就使用remove()方法进行删除,否则就抛出一个异常,具体还是通过遍历实现:

public class DelOperation implements IOperation{
    public void work(BookList bookList)throws OperationException{
        System.out.println("请输入你想要删除的书籍:");
        Scanner scan=new Scanner(System.in);
        String name=scan.next();
        boolean flag=true;
        for(int i=0;i< bookList.getBooks().size();i++){
            if(bookList.getBooks().get(i).getName().equals(name)){
                flag=false;
                System.out.println("查找到了,请问是否要进行删除:"+name+"(Y/N)");
                if(scan.next().equalsIgnoreCase("y")){ //进行删除操作
                    bookList.getBooks().remove(i);
                    System.out.println("删除成功!");
                }
            }
        }
        if(flag){
            throw new OperationException("未查找到该书籍!");
        }
    }
}
(4)显示

显示操作较为好实现,因为重写过book的toString()方法了,所以可以直接遍历BookList进行输出即可

代码如下:

package com.sh.Library;

public class DisplayOperation implements IOperation{
    //显示功能的实现
    //结合book类的重写进行
    public void work(BookList bookList) throws OperationException {
        for(int i=0;i<bookList.getBooks().size();i++){
            System.out.println(bookList.getBooks().get(i)); //直接输出
        }
    }
}
(5)借书

借书操作的实现也相同,先提供一个书名,然后遍历书架,若有则判断其是否已被借出,如果是,则抛出一个异常,否则就借出成功,并更改书的借出状态;若没有,即抛出一个未找到的异常。

package com.sh.Library;

public class BorrowOperation implements IOperation{
    public void work(BookList bookList)throws OperationException{
        System.out.println("请输入你想要借的书:");
        Scanner scan=new Scanner(System.in);
        String name=scan.next();
        boolean flag=true;
        for(int i=0;i< bookList.getBooks().size();i++){
            if(bookList.getBooks().get(i).getName().equals(name)){ //查找到该书籍在图书馆中
                flag=false;
                if(bookList.getBooks().get(i).isBorrowed()==true){
                    throw new OperationException("借书失败,该书已被借出");
                }else{ //书未被借出
                    System.out.println("借出成功!");
                    bookList.getBooks().get(i).setBorrowed(true);
                }
            }
        }
        //出循环了,仍未找到
        if(flag) {
            throw new OperationException("未查找到该书");
        }
    }
}

(6)还书

还书操作的过程,也是提供相应的书名,遍历书架,若有该书,则进行归还,同时设置其状态为未被借出状态;如果未找到该书,也抛出一个异常。

package com.sh.Library;

public class ReturnOperation implements IOperation{
    public void work(BookList bookList) throws Exception {
        Scanner scan=new Scanner(System.in);
        System.out.println("请输入你要归还的书籍:");
        String name=scan.next();
        boolean flag=true;
        for(int i=0;i<bookList.getBooks().size();i++){
            if(bookList.getBooks().get(i).getName().equals(name)){
                flag=false;
                System.out.println("成功归还!");
                bookList.getBooks().get(i).setBorrowed(false);
            }
        }
        if(flag){
            throw new OperationException("查无此书!");
        }
    }
}

(7)退书

退出功能的实现较为简单,我们这里使用System类中的静态方法exit来进行实现

代码如下:

package com.sh.Library;
//退出功能的实现
    public class ExitOperation implements IOperation {
        public void work(BookList bookList) throws OperationException {
            System.out.println("是否要进行退出?"+"(Y/N)");
            Scanner scan=new Scanner(System.in);
            if(scan.next().equalsIgnoreCase("Y")){
                System.out.println("退出成功!");
                System.exit(0);
            }
        }
    }

7、管理员的实现

首先,管理员类需要继承于用户类,同时实现用户类中的抽象方法menu(),同时实现抽象方法Operation(),这里可以利用接口的多态性来进行实现,同时我们要对Operation抛出的异常进行处理,同时抛出在选择过程中会出现的异常

代码如下:

package com.sh.Library;
public class Admin extends User{
    public Admin(String name){
        super(name);
    }
    public void menu(){
        System.out.println("尊敬的管理员:"+this.getName()+"欢迎来到图书管理系统");
        System.out.println("1.查找图书");
        System.out.println("2.新增图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出系统");
    }
    public  void Operation(int n,BookList bookList)throws OperationException{
        IOperation iOperation=null;
        switch(n){
            case 0:
                iOperation= new ExitOperation();
                break;
            case 1:
                iOperation=new FindOperation();
                break;
            case 2:
                iOperation=new AddOperation();
                break;
            case 3:
                iOperation=new DelOperation();
                break;
            case 4:
                iOperation= new DisplayOperation();
                break;
            default:
                throw new OperationException("输入错误,请重新输入!");
        }
        try {
            iOperation.work(bookList);
        }catch(OperationException e){
            System.out.println(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

8、读者类的实现

package com.sh.Library;

public class Reader extends User{
    public Reader(String name){
        super(name);
    }
    public void menu() {
        System.out.println("尊敬的读者:"+this.getName()+"欢迎来到图书馆");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
    }
    public void Operation(int n, BookList bookList)throws OperationException {
        IOperation iOperation=null;
        switch(n){
            case 0:
                iOperation= new ExitOperation();
                break;
            case 1:
                iOperation=new FindOperation();
                break;
            case 2:
                iOperation=new BorrowOperation();
                break;
            case 3:
                iOperation=new ReturnOperation();
                break;
            default:
                throw new OperationException("输入错误,请重新输入!");
        }
        try {
            iOperation.work(bookList);
        }catch(OperationException e){
            System.out.println(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

9、Test类

package com.sh.Library;
public class Test {
    public static void main(String[] args){
        System.out.println("请输入你的身份:");
        System.out.println("管理员/普通用户(0/1)");
        Scanner scan=new Scanner(System.in);
        int choice=scan.nextInt();
        System.out.println("请输入你的姓名:");
        User user=null;
        BookList bookList=new BookList();
        switch(choice){ //进行身份的选择
            case 0:
                user=new Admin(scan.next());
                break;
            case 1:
                user=new Reader(scan.next());
        }
        IOperation iOperation=null;
        do {
            user.menu();
            System.out.println("请输入你要进行的操作:");
            int input=scan.nextInt();
            if(input==0){
                System.out.println("退出成功");
                return;
            }
            try {
                user.Operation(input, bookList);
            }catch(OperationException e){
                System.out.println(e.getMessage());
            }
        }while(true);
    }
}

10、展示(嘿嘿)

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

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

相关文章

【CicadaPlayer】demuxer_service中DASH的简单理解

DASH协议 dash 是属于demuxer模块的 MPEG-DASH是一种自适应比特率流技术,可根据实时网络状况实现动态自适应下载。和HLS, HDS技术类似, 都是把视频分割成一小段一小段, 通过HTTP协议进行传输,客户端得到之后进行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4(最新的HLS也支持…

【IPV6】--- IPV6过渡技术之6 over 4隧道配置

1. IPV4和IPV6有什么区别&#xff1f; 2. IPV6如何在设备上配置&#xff1f; 3. IPV4和IPV6如何跨协议实现通信&#xff1f; 1. IPV4和IPV6 --- IPV6技术 - IP协议第六版 - 128位二进制数 - 2^12843亿*43亿*43亿*43亿 --- IPV4技术 - IP协议第四版 - 192.1…

element-ui使用记录

element-ui的组件名就是类名 样式穿透&#xff08;用来修改没有类名的子组件样式&#xff09; 例如修改头部具名插槽的样式&#xff08;但是无法定位该元素&#xff09; 查看最后生成的html结构中对应的结构&#xff08;这里的头部有类名&#xff0c;可以直接对该类名进行样…

C#学习笔记9:winform上位机与西门子PLC网口通信_上篇

今日继续我的C#学习笔记&#xff0c;今日开始学习打开使用千兆网口来进行与西门子PLC的通信&#xff1a; 文章提供整体代码、解释、测试效果截图、整体测试工程下载&#xff1a; 主要包含的知识有&#xff1a;下载NuGet程序包、西门子PLC及通信协议、搭建虚拟的S7通信仿真环境…

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象 1. 源由2. “怪”现象2.1 电机#4没有RPM转速2.2 遥控器通道10接收机测试失败2.3 OSD 异常2.4 磁力计数据无法获取 3. 参考资料 1. 源由 升级下固件&#xff0c;追下“时髦”&#xff0c;赶下“潮流”&#xff0c;本着“活着就…

【Linux ARM 裸机】开发环境搭建

1、Ubuntu 和 Windows 文件互传 使用过程中&#xff0c;要频繁进行 Ubuntu 和 Windows 的文件互传&#xff0c;需要使用 FTP 服务&#xff1b; 1.1、开启 Ubuntu 下的 FTP 服务 //安装 FTP 服务 sudo apt-get install vsftpd //修改配置文件 sudo vi /etc/vsftpd.conf//重启…

ES入门十五:分页的三驾马车【from+size、search after、scroll api】

从数据集中获取数据时分页是绕不开的操作&#xff0c;一下子从数据集中获取过多的数据可能会造成系统抖动、占用带宽等问题。特别是进行全文搜索时&#xff0c;用户只关心相关性最高的那个几个结果&#xff0c;从系统中拉取过多的数据等于浪费资源。 ES提供了3种分页方式&…

2024/4/1—力扣—主要元素

代码实现&#xff1a; 思路&#xff1a;摩尔投票算法 int majorityElement(int *nums, int numsSize) {int candidate -1;int count 0;for (int i 0; i < numsSize; i) {if (count 0) {candidate nums[i];}if (nums[i] candidate) {count;} else {count--;}}count 0;…

【Redis 知识储备】冷热分离架构 -- 分布系统的演进(5)

冷热分离架构 简介出现原因架构工作原理技术案例架构优缺点 简介 引入缓存, 实行冷热分离, 将热点数据放到缓存中快速响应 (如存储到 Redis中) 出现原因 海量的请求导致数据库负载过高, 站点响应再读变慢 架构工作原理 多了缓存服务器, 对于热点数据全部到缓存中, 不常用数…

软考高级:计算机网络概述

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

24.4.7周报

星期一&#xff1a; 再学kmp&#xff0c;学的最明白的一次 贴道kmp的题 洛谷传送门 思路&#xff1a;答案为n-ne【n】&#xff0c;把字符串画两遍理解一下 思路&#xff1a;最长周期&#xff0c;复制一遍过后要求覆盖原字符串&#xff0c;及字符串中…

OpenAI Sora:浅析文生视频模型Sora以及技术原理简介

一、Sora是什么&#xff1f; Sora官方链接&#xff1a;https://openai.com/sora 视频模型领头羊Runway Gen 2、Pika等AI视频工具&#xff0c;都还在突破几秒内的连贯性&#xff0c;而OpenAI&#xff0c;已经达到了史诗级的纪录。 OpenAI&#xff0c;永远快别人一步&#xff0…

Android 11属性系统初始化流程

在init进程启动的第二阶段&#xff0c;调用PropertyInit 对属性系统进行初始化 int SecondStageMain(int argc, char** argv) {//省略PropertyInit();//省略 }PropertyInit函数在system\core\init\property_service.cpp 中实现 void PropertyInit() {//省略mkdir("/dev/…

《云原生安全攻防》-- 云原生应用风险分析

为了满足每位朋友的学习需求&#xff0c;并且支持课程的持续更新&#xff0c;本系列课程提供了免费版和付费视频版两种方式来提供课程内容。我们会持续更新课程内容&#xff0c;以确保内容的度和实用性。 在本节课程中&#xff0c;我们将一起探讨云原生应用在新的架构模式下可能…

模块化——如何导入模块?(内置模块与自定义模块)

在Node.js中&#xff0c;要导入另一个模块&#xff0c;我们可以使用require函数。这个函数接受一个文件路径参数&#xff0c;并返回导入的模块。 一、require使用注意事项&#xff1a; (1)自己创建的模块&#xff0c;导入时建议写相对路径&#xff0c;不能省略./和../ //我把…

Struts2:Action类的写法,推荐使用继承ActionSupport类的方法

文章目录 方法一&#xff1a;Action类是一个POJO类&#xff08;简单的Java类&#xff09;ActionDemo2.javastruts_demo2.xmlstruts.xml运行结果其他strutsz_demo1.xml 方法二&#xff1a;实现一个Action的接口ActionDemo2_2.javastruts_demo2.xml运行结果 推荐&#xff01;&…

基于视频监管与AI智能识别技术的水利河道综合治理解决方案

一、方案介绍 TSINGSEE青犀视频水利河道综合治理解决方案是依托视频AI智能分析技术&#xff0c;利用水质/水文等传感器、高清摄像机、水利球、无人机、无人船等感知设备实时采集数据&#xff0c;并与视频能力进行联动&#xff0c;达到智能预警的目的。 TSINGSEE青犀方案以信息…

【单源最短路 图论】882. 细分图中的可到达节点

作者推荐 视频算法专题 本文涉及知识点 单源最短路 图论 LeetCode 882. 细分图中的可到达节点 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间…

4月7号总结

java学习 一.正则表达式 定义&#xff1a;正则表达式是一种用于描述字符串模式的表达式&#xff0c;通常被用于文本搜索、匹配和替换。它是一种强大的工具&#xff0c;可以在文本处理和文本分析中进行复杂的匹配和操作。 通过字符串引用里面的方法matches&#xff0c;然后执行…

jupyter python paramiko 网络系统运维

概述 通过使用jupyter进行网络运维的相关测试 设备为H3C 联通性测试 import paramiko import time import getpass import re import os import datetimeusername "*****" password "*****" ip "10.32.**.**"ssh_client paramiko.SSHCli…