图书管理系统(附源码)

news2024/12/24 2:27:18

前言:前面一起和小伙伴们学习了较为完整的Java语法体系,那么本篇将运用这些知识连串在一起实现图书管理系统


目录

一、总体设计

二、书籍与书架

书籍(Book)

书架(Booklist)

三、对图书的相关操作

IOperations接口

ShowOperation

FindOperation

BorrowOperation

ReturnOperation

AddOperation

DeleteOperation

ExitOperation 

三、用户

用户抽象类(User)

NormalUser

AdminUser

Main( 测试 )

注册方法:

main方法:


以面向对象的思想来实现 图书管理系统。

一、总体设计

系统设计框架图

系统设计思想:

用不同的包来分装不同的类别。共创建book包、user包和operation包。

1、book包

与书相关的有书本与书架,封装共同放入book包,体现了封装的设计思想。

 2、user包

user包中用户分为普通用户类与管理员类,共同继承User抽象类,不同的子类有不同的行为现象,这里体现了多态的设计思想

 3、operation包

定义IOperation接口并创建接口数组,再定义不同的图书业务如删除图书类、借阅图书类、归还图书类等等去实现IOperation接口并重写业务方法。并用接口数组间接实例化图书业务对象,通过数组下标来调用不同的图书业务类。

结构图:


二、书籍与书架

书籍(Book)

提供书籍相关信息:

  • 书名
  • 作者
  • 价格
  • 类型
  • 借出情况

对于成员变量及成员方法,不可盲目地设计其权限性为public,对于这种情况,最好使用private进行封装。

代码如下:(代码中也有适当注释)

package 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 +
              //注意这里,借出情况信息不应该设置为ture or false
              //可以进行如68行修改
              '}';
   }
}

书架(Booklist)

书架用来存放书籍,书架可以被视为书籍数组,每一个元素都是一本书籍,提供:

  • 初始化书籍信息并封装
  • 记录存放数量并封装

代码如下:

package book;

public class BookList {

   private Book [] books =new Book[10];
   private int count;//实际放的书本数

    public BookList() {
      this.books[0]=new Book("三国演义","罗贯中",20,"小说");
      this.books[1]=new Book("西游记","吴承恩",30,"小说");
      this.books[2]=new Book("红楼梦","曹雪芹",30,"笑说");

      this.count=3;
    }
     //拿书
    public Book getBooks(int pos) {
        return books[pos];
    }
     //设置书的位置
    public void setBooks(int pos,Book books) {
        this.books[pos] = books;
    }
    //作用找书
    public Book[] getBooks(){
        return books;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

}

三、对图书的相关操作

IOperations接口

ioperation接口的作用:

  • 被图书业务操作类实现
  • 创建IOperation接口数组,并用接口数组间接实例化图书业务对象,通过数组下标来调用不同的图书业务类。(User类中定义)

提供信息:

  • 定义含参 ( 书架 )的work方法
package ioperation;

import book.BookList;

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

ShowOperation

ShowOperation内容及作用:

  • 重写接口方法
  • 打印书籍信息
package ioperation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOperations {
    @Override
    public void work(BookList bookList) {
        //记录书本数量
        int count= bookList.getCount();
        //遍历数组
        for (int i = 0; i < count; i++) {
            Book book =bookList.getBooks(i);
           // 这里不能直接打印booklist[i],因为 booklist是引用
            System.out.println(book);
        }
    }
}

FindOperation

FindOperation作用:

  • 在遍历书籍数组时利用equal方法核对书籍信息
package ioperation;
import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperations {
    @Override
    public void work(BookList bookList) {
        System.out.println("查照图书----------");

        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要查找的图书书名:");
        String name=scanner.nextLine();

        int count=bookList.getCount();

        for (int i = 0; i < count; i++) {
           Book book =bookList.getBooks(i);
         if (book.getName().equals(name)){
             System.out.println("找到该图书"+book);
             return;
            }
        }
        //若找到了图书在22行return返回则运行不到这里
        System.out.println("没有找到这本书");
    }
}

BorrowOperation

BorrowOperation作用

  • 找到需要借阅的书籍更改借阅状态
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class BorrowOperation implements IOperations {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书---------");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书书名--");
        String name = scanner.nextLine();

        int count = bookList.getCount();

        for (int i = 0; i < count; i++) {
            Book book = bookList.getBooks(i);
            if (book.getName().equals(name)) {
                if (book.isBorrowed()) {
                    System.out.println("这本书已被借出!");
                    return;
                }
                //设置借阅情况
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }

        }
        System.out.println("没有你要借的这本书");
    }
}

ReturnOperation

ReturnOperation内容及作用:

  • 找到需要归还的书籍更改借阅状态
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class ReturnOperation implements IOperations {

    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书--------");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要归还的书:");
        String name= scanner.nextLine();

        int count= bookList.getCount();
        for (int i = 0; i < count; i++) {
          Book book = bookList.getBooks(i);
          if(book.getName().equals(name)){
              //检测前提当前是否被借出
              if(book.isBorrowed()){
                  System.out.println("归还成功!");
                  //设置为未借出
                  book.setBorrowed(false);
                  return;
              }
              System.out.println("没有你归还的书,归还失败!");
          }
        }
    }
}

AddOperation

AddOperation作用:

  • 新增书籍
package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class AddOperation implements IOperations {
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书-------");

        //判满
        int count=bookList.getCount();
        if(count==bookList.getBooks().length){
            System.out.println("书架已满!");
        }
        //输入图书信息
        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 newbook=new Book(name,author,price,type);

        for (int i = 0; i < count; i++) {
            Book book = bookList.getBooks(i);
            if (book.getName().equals(name)) {
                System.out.println("已存在该图书!");
                return;
            }
        }
            //放入新书
            bookList.setBooks(count,newbook);
            //书本数量加1
            bookList.setCount(count+1);

            System.out.println("新增图书成功!");
        }
    }

DeleteOperation

DeleteOperation相对复杂一点

删除步骤:

  • 遍历书籍数组记录要删除书本的下标
  • 后一个下标的书籍信息依次覆盖当前下标书籍信息,达到删除目的

代码如下:

package ioperation;
import book.Book;
import book.BookList;
import java.util.Scanner;

public class DeleOperation implements IOperations {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书------");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要删除的图书书名:");
        String name=scanner.nextLine();

        int count=bookList.getCount();
        int pos = 0;
        int i = 0;
        //找到书
        for (; i < count; i++) {
            Book book = bookList.getBooks(i);
            if (book.getName().equals(name)) {
                pos = i;
                break;
            }
        }

            if(i==count){
                System.out.println("没有你要删除的书!");
                return;
            }

            for (int j = pos; j < count-1; j++) {
             //拿下标为j+1书
              Book book = bookList.getBooks(j+1);
              //放入j位置
              bookList.setBooks(j,book);
            }
            //书本数量减1
            bookList.setBooks(count-1,null);

            bookList.setCount(count-1);
        System.out.println("删除成功!");
        }
    }

ExitOperation 

ExitOperation 内容:

  • System.exit(0) 退出系统
package ioperation;
import book.BookList;

public class ExitOperation implements IOperations {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统--------");
        System.exit(0);
    }
}

三、用户

用户分为普通用户类与管理员类。

User

创建User抽象类来抽取普通用户类与管理员类的共性,不同的子类有不同的行为现象,这里体现了多态的设计思想。因为User类为抽象类,其访问限定符应设置为protected。

User内容(共性的抽取)

  • 定义用户名
  • 定义接口数组
  • 定义doIoperation方法

doIoperation方法说明:

  • 传参数图书业务号码及书架
  • 通过对数组下标来访问对应业务
package use;
import book.BookList;
import ioperation.IOperations;

public abstract class User {

    protected String name;
   //定义接口数组
    public IOperations[] ioperations;

    public User(String name) {
        this.name = name;
    }
     
    //抽取共性菜单
    protected abstract int menu();

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

NormalUser

NormalUser继承User类

  • 在构造方法中初始化操作数组,并间接实例化操作业务等类的对象
  • 打印菜单并返回用户业务数字
package use;
import ioperation.*;
import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
      this.ioperations=new IOperations[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }

    @Override
    protected 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);
        return scanner.nextInt();

    }
}

AdminUser

AdminUserr继承User类

  • 在构造方法中初始化操作数组,并间接实例化操作业务等类的对象
  • 打印菜单并返回用户选择的图书业务数字
package use;
import ioperation.*;
import java.util.Scanner;

public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
       this.ioperations=new IOperations[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeleOperation(),
                new ShowOperation()
        };
    }

    @Override
    protected 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);
        return scanner.nextInt();
    }

}

Main( 测试 )

Main为测试类包含

注册方法:

  • 根据选择不同实例化不同用户对象并返回(在实例化的同时已经调用了该用户类的构造方法,也就是已经初始化好了用户的图书业务权限)
  • 返回类型为User,这里采用了向上转型

main方法:

  • 实例化书架
  • 调用Login方法获得用户身份(这里转型有疑惑的建议看多态性第五条转型问题)
  • 进入循环可以实现一次运行多次选择业务
  • 用choice接受用户需要办理的图书业务对应数字
  • 调用user的doIoperation方法完成图书操作
package use;
import book.BookList;
import java.util.Scanner;

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 choice = scanner.nextInt();
        if (choice == 1) {
            return new AdminUser(name);
        } else if (choice == 2) {
            return new NormalUser(name);
        }
        return null;
    }

    public static void main(String[] args) {
     
        BookList booklist = new BookList();

        User user = Login();

        while (true) {

            int choice = user.menu();

            user.doIoperation(choice, booklist);
        }
    }
}

写作不易,求路过的朋友们给个三连与关注。有写的不对的地方,欢迎大佬们在评论区指出错误并指导。

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

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

相关文章

[C++][设计模式][适配器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将”一些现存的对象“放在新的环境中应用&#xff0c;但是新环境要求的接口是这些现存对象所不满足如何应对这些”迁移的变化“&#xff1f;如何既能利用现…

第一节:如何开发第一个spring boot3.x项目(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;从今天开始&#xff0c;我会记录每篇我自学spring boot3.x的经验。只要我不偷懒&#xff0c;学完应该很快&#xff0c;哈哈&#xff0c;更新速度尽可能快&#xff0c;想和大佬们一块讨论&#xff0c;如果需要讨论的欢迎一起评论区留…

基于MongoDB的电影影评分析

项目源码及资料 项目介绍 1、从豆瓣网爬取Top10的电影数据 爬取网址: https://movie.douban.com/top250 1.1 爬取Top10的影视信息 mv_data [] i 0 for x in soup.select(.item):i 1mv_name re.search(>([^<])<, str(x.select(.info > .hd > a > .tit…

【VMware】VMware 开启的虚拟机无法联网的解决方案

目录 &#x1f30a;1. 问题说明 &#x1f30a;2. 解决方案 &#x1f30d;2.1 查看虚拟网络编辑器 &#x1f30d;2.2 设置 vmnet &#x1f30d;2.3 设置虚拟机网络 &#x1f30d;2.4 Xshell连接虚拟机 &#x1f30a;1. 问题说明 虚拟机 ping 其他网页显示失败,比如&#…

嵌入式linux系统中动态链接库实现详解

大家好,linux系统中动态库是如何实现相互链接的?今天简单聊聊动态链接库的实现原理。 假设有这样两段代码,第一段代码定义了一个全量变量a以及函数foo,函数foo中引用了下一段代码中定义的全局变量b。 第二段代码定义了全局变量b以及main函数,同时在main函数中调用了第一个…

【数据仓库与数据挖掘】期末复习重点资料

题型&#xff1a; 选择题10个2分 填空题10空2分 简答题6个5分 大题1个&#xff08;20分10分&#xff09; 第一章 数据仓库的概念与体系结构 1.1 数据仓库的基本概念 1、元数据 元数据&#xff08;Metadata&#xff09;是描述数据仓库中数据的数据结构和构建方法的数据。…

关于Redisson分布式锁的用法

关于Redisson分布式锁的用法 Redisson是一个基于Redis的Java分布式对象和服务框架&#xff0c;它提供了多种分布式锁的实现&#xff0c;包括可重入锁、公平锁、读写锁等。Redisson实现分布式锁的核心原理主要依赖于Redis的数据结构和Redisson框架提供的高级功能。以下详细讲解…

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式&#xff0c;即通过代理对象访问目标对象&#xff0c;这样可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。简言之&#xff0c;代理模式就是设置一个中间代理来控制访问原目标…

普通集群与镜像集群配置

一. 环境准备 关闭防火墙和selinux&#xff0c;进行时间同步 主机名系统IP服务rabbitmq-1 Rocky_linux9.4 192.168.226.22RabbitMQ&#xff0c;MySQLrabbitmq-2Rocky_linux9.4192.168.226.23RabbitMQrabbitmq-3Rocky_linux9.4192.168.226.24RabbitMQ 修改主机名#192.168.226…

机械硬盘故障分析及损坏处理(坏道屏蔽)

机械硬盘故障分析&#xff1a; 1、加电后没有声音就是电机不转&#xff0c;是电路问题&#xff0c;更换电路板解决。 2、加电后电机转&#xff0c;有连续敲击声音&#xff0c;或有异响&#xff0c;磁头损坏或机械故障。 3、加电后电机转&#xff0c;运行正常&#xff0c;BIOS无…

docker pull 镜像的时候遇到Pulling fs layer问题

最近遇到一个很奇怪的问题,docker pull 镜像的时候,总是出现Pulling fs layer问题,导致镜像拉取不成功,以前是安装好docker,正常拉取镜像都是没什么问题的,在这里记录一下这个问题的解决方法,当然,可能并不通用。 1、进入阿里云容器服务 地址:https://cr.console.aliy…

【反者道之动,弱者道之用】统计学中的哲理——回归均值 Regression to the mean

&#x1f4a1;&#x1f4a1;在统计学中&#xff0c;回归均值(Regression toward the Mean/Regression to the Mean) 指的是如果变量在其第一次测量时是极端的&#xff0c;则在第二次测量时会趋向于接近平均值的现象。   在金融学中&#xff0c; 回归均值是指股票价格无论高于…

【计算机组成原理实验】——运算器组成实验

计组TEC4实验——运算器组成实验 1. 实验目的 (1&#xff09;掌握算术逻辑运算加、减、乘、与的工作原理。 (2) 熟悉简单运算器的数据传送通路。 (3) 验证实验台运算器的8位加、减、与、直通功能。 (4) 验证实验台的4位乘4位功能。 (5) 按给定数据&#xff0c;完成几种指…

JS乌龟吃鸡游戏

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>乌龟游戏</title><script type"text/javascript">function move(obj){//乌龟图片高度var wuGui_height 67;…

HarmonyOS Next开发学习手册——创建轮播 (Swiper)

Swiper 组件提供滑动轮播显示的能力。Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示。通常&#xff0c;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 针对复杂页面场景&#xff0c;可以使用 Sw…

MySQL1(初始数据库 概念 DDL建库建表 数据库的三大范式 表约束)

目录 一、初始数据库 二、概念 三、DDL建库建表 1. 数据库结构 2. SQL语句分类 3. DDL语句操作数据库 注释&#xff1a; 查看数据库&#xff1a; ​编辑创建数据库&#xff1a; 删除数据库&#xff1a; 选择数据库&#xff1a; 4. 数据库表的字段类型 4.1 字符串…

JVM内存模型剖析与参数设置

目录 Java语言的跨平台特性 JVM 的主要组成部分及其作用是什么? JVM整体结构及内存模型 线程栈&#xff08;Machine Stack&#xff09; 局部变量表&#xff08;Local Variable Table&#xff09; 操作数栈&#xff08;Operand Stack&#xff09; 程序计数器&#xff08…

【Linux】已解决:Ubuntu虚拟机安装Java/JDK

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项结论 已解决&#xff1a;Ubuntu虚拟机安装Java/JDK 一、分析问题背景 在Ubuntu虚拟机上安装Java开发工具包&#xff08;JDK&#xff09;是许多开发者的常见任务。然而&#xff0c;在…

Pc端多功能视频混剪工具/便携版打开即用

PC便携版 视频批量剪辑大师&#xff0c;全自动剪辑神器&#xff0c;会打字就能做视频 多功能&#xff0c;视频混剪&#xff0c;视频配音&#xff0c;文字生成语音&#xff0c;图片合成视频&#xff0c;自动识别音频并生成字幕等功能 链接&#xff1a;https://pan.baidu.com/…

2007-2022年 省级-绿色农业合作社数量相关数据整理

绿色农业合作社作为一种推动农业可持续发展的组织形式&#xff0c;对于促进环境保护、提高农产品质量和增加农民收入等方面具有重要作用。以下是对省级绿色农业合作社数量相关数据的介绍&#xff1a; 数据简介 定义&#xff1a;绿色农业合作社是由农民、农业专家、企业家等组…