Java学习(11):Java实现图书馆书库管理系统

news2024/9/22 13:33:47

接上次博客:Java学习(10)多接口、接口的继承、抽象类和接口的区别、Object类【toString 、equals、hashcode】、接口实例 【compareTo、clone 】、浅拷贝和深拷贝、内部类_di-Dora的博客-CSDN博客

我们要想完成这个书库管理系统,首先应该理清楚它的底层逻辑。

我们一共写了三个包:

包1:book,它里面放了两个源文件,一个是Book,它代表了“Book”这个类,定义了相关的成员,代表了每本书的具体属性;一个是BookList,它可以被看作是一个书架,存放了我们拥有的图书的相关信息,可以对图书的信息进行查阅,还可以保存当前图书的数量。

包2:operation,它里面放了多个源文件,代表了可以对图书进行的一些相关操作,这些对象又都继承了一个接口IOPeration。

包3:user,针对不同的使用对象,该系统呈现的功能也会有所差异,所以这个包里面先实现了一个 User 作为父类,又实现了两个子类 NormalUser 和 AdminUser ,分别代表普通用户和管理员。

综上,整个系统的结构如下图:

 下面是这个系统的基础代码,我会通过注释在相关地方说明一些需要注意的知识点:

1、TestBook/src/Main.java

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

import java.util.Scanner;


public class Main {

    //可以利用返回值,的向上转型达到返回值的一致性
    public static User login() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1---》管理员  0---》普通用户");
        int choice = scanner.nextInt();
        if(choice == 1) {
            /*AdminUser adminUser = new AdminUser(name);
            return adminUser;*/
            return new AdminUser(name);
        }else {
            /*NormalUser normalUser = new NormalUser(name);
            return normalUser;*/
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {

        BookList bookList = new BookList();

        User user = login();
        while (true) {
            int choice = user.menu();
            //user是哪个对象? choice是几? ---》 这些能够确定:我能够操作哪个对象的哪个方法。
            //通过这两个变量可以确定之后,怎么联系起来
            /*
             * 1. 先让AdminUser和NormalUser存好各自对应的操作
             * 2. 我们就可以通过不同对象的menu调用对象对应的操作了!
             */
            user.doOperation(choice, bookList);

        }
    }
}

2、TestBook/src/book

(1)、TestBook/src/book/Book.java

package book;

public class Book {
    private String name;//书名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出 默认是false

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
        //因为boolean isBorrowed 默认是false ,所以我们不需要在构造函数里面再写一遍

    }

    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 +*/
                '}';
    }
}

(2)、TestBook/src/book/BookList.java

package book;

public class BookList {

    private Book[] books = new Book[10];

    private int usedSize;//这是一共计数器用来记录当前实际放的书的书目!

    public BookList() {
        //构造方法 来初始化成员
        this.books[0] = new Book("三国演义","罗贯中",50," 中国古典名著 ");
        this.books[1] = new Book("西游记","吴承恩",38," 中国古典名著 ");;
        this.books[2] = new Book("红楼梦","曹雪芹",45," 中国古典名著 ");;
        this.usedSize = 3;
    }
    //传入想要取得的图书的下标,得到图书
    public Book getBook(int pos) {
        return books[pos];
    }
    //传入想要放入的图书和放置的位置
    public void setBooks(int pos,Book book) {
        books[pos] = book;
    }

    public int getUsedSize() {
        return usedSize;
    }

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

3、TestBook/src/operation

(1)、TestBook/src/operation/AddOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOPeration {
    @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("请输入想要添加的书的价格:");
            int price = scanner.nextInt();
            //记得要把回车符读取一下
            scanner.nextLine();
            System.out.println("请输入想要添加的书的类型:");
            String type = scanner.nextLine();
            Book book = new Book(name, author, price, type);
            int usedSize = bookList.getUsedSize() + 1;//我们需要增加一下目前拥有的书的数量
            bookList.setBooks(bookList.getUsedSize(), book);
            bookList.setUsedSize(usedSize);
            System.out.println("添加成功!");

        }
}

(2)、TestBook/src/operation/BorrowedOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;


public class BorrowedOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        int currentSize = bookList.getUsedSize();
        System.out.println("这是本书库所有藏书");
        for (int k = 0; k < currentSize; k++) {
            Book book = bookList.getBook(k);
            System.out.println(book);
        }
        System.out.println("请输入想要借阅的书的书名:");
        String nameborrow = scanner.nextLine();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(nameborrow)) {
                if(!book.isBorrowed()){
                    book.setBorrowed(true);
                    System.out.println("借阅成功!");
                    return;
                }
                else{
                    System.out.println("该图书已被借出,请重新选择!");
                }
            }
        }
    }
}

(3)、TestBook/src/operation/DelOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;


public class DelOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("这是本书库现有藏书");
        int currentSize = bookList.getUsedSize();
        for (int k = 0; k < currentSize; k++) {
            Book book = bookList.getBook(k);
            System.out.println(book);
        }
        System.out.println("请输入你想要删除的书的名字:");
        Scanner scanner = new Scanner(System.in);
        /*现在遍历书架,比对是否存在与输入字符串相同的书名
        * 如果有,那么就把后一本数的信息前移,覆盖掉需要删除的书的信息
        * */
        String namedel = scanner.nextLine();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(namedel)) {
                for(int j=i+1;j<currentSize;j++){
                    Book booklatter = bookList.getBook(j);
                    bookList.setBooks(j,booklatter);
                }
                //记得还要减少库存
                bookList.setUsedSize(bookList.getUsedSize()-1);
                System.out.println("删除图书成功!");
                return;
            }
        }
    }
}

(4)、TestBook/src/operation/ExitOperation.java

package operation;

import book.Book;
import book.BookList;


public class ExitOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
           bookList.setBooks(i,null);
        }
        bookList.setUsedSize(0);

        System.exit(0);
    }
}

(5)、TestBook/src/operation/FindOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOPeration{
    public void work(BookList bookList){

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

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            /*一定不可以这么写!
            * Book book = books[i];
            * 记住!我们现在是在面向对象!
            * */
            if(book.getName().equals(name)) {
                System.out.println("找到了你查找的书:");
                System.out.println(book);
                return;
            }
        }

        System.out.println("不好意思,本书库目前还未收藏该书!");
    }
}

(6)、TestBook/src/operation/IOPeration.java

package operation;

import book.BookList;

public interface IOPeration {
    void work(BookList bookList);//每个子类都要实现这个抽象的方法
}

(7)、TestBook/src/operation/ReturnOperation.java

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        System.out.println("请输入你想要归还的图书的书名:");
        Scanner scanner = new Scanner(System.in);
        String nameborrow = scanner.nextLine();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(nameborrow)) {
                book.setBorrowed(false);
                System.out.println("归还图书成功!");
                return;
            }
        }
    }
}

(8)、TestBook/src/operation/ShowOperation.java

package operation;

import book.Book;
import book.BookList;

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("这是本书库所有藏书");

        int currentSize = bookList.getUsedSize();

        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            //同样的,这里也不可以这样写:
            //Book book = books[i];
            System.out.println(book);
        }
    }
}

3、TestBook/src/user

(1)、TestBook/src/user/User.java

package user;

import book.BookList;
import operation.IOPeration;


public abstract class User {
    protected String name;//姓名
    public IOPeration[] ioPerations;//这里我们采取的是先定义,后初始化的方式

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

    public abstract int menu();

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

(2)、TestBook/src/user/NormalUser.java

package user;

import operation.*;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperation(),
                new ReturnOperation()
        };
    }

    public int menu() {
        System.out.println("************************");
        System.out.println("hello "+ 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 scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

}

(3)、TestBook/src/user/AdminUser.java

package user;

import operation.*;

import java.util.Scanner;


public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.ioPerations = new IOPeration[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };
        /*this.ioPerations = {
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };*/
    }

    public int menu() {
        System.out.println("************************");
        System.out.println("hello "+ 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 scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

}

好了,写到这里,我们的书库管理系统就大功告成了(当然了,你也可以自己加一些新的功能)!

最后我们可以来看看这个系统的运行结果:

作为管理员:

 

作为普通用户:

 

 

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

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

相关文章

MySQL基础(十七)触发器

在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有 2 个或者多个相互关联的表&#xff0c;如商品信息和库存信息分别存放在 2 个不同的数据表中&#xff0c;我们在添加一条新商品记录的时候&#xff0c;为了保证数据的完整性&#xff0c;必须同时在库存表中添加…

VMware ESXi 7.0 U3m Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi 7 U3 标准版集成 Intel 网卡、USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-05-03&#xff0c;发布 ESXi 7.0U…

8-1HBase的安装与简单操作

目录 第1关&#xff1a;Hbase数据库的安装 代码如下&#xff1a; 第二关&#xff1a;创建表 首先要启动&#xff1a;hbase shell 1、create “表名” , ”列族名” 新建一个表 2、list 列出hbase中存在的所有表 代码测试&#xff1a; 第三关&#xff1a;添加数据、…

加解密技术了解

常用的对称加密算法&#xff1a; 对称算法&#xff0c;指加密和解密使用相同密钥的加密算法&#xff0c;对称加密算法用来对敏感数据等信息进行加密。 1). DES算法 2). 3DES算法 3). AES算法 4). TDEA算法 5). Blowfish算法 6). RC5算法 7). IDEA算法 三种常用对称算法…

Speech and Language Processing之word2vec

1、介绍 事实证明&#xff0c;在每一个NLP任务中&#xff0c;密集向量都比稀疏向量工作得更好。虽然我们不能完全理解其中的所有原因&#xff0c;但我们有一些直觉。首先&#xff0c;密集向量可以更成功地作为特征包含在机器学习系统中;例如&#xff0c;如果我们使用100维…

Shell脚本之正则表达式详解(花每年都开,你还是那个你吗)

文章目录 一、什么叫做正则表达式二、正则表达式的组成三、正则表达式分类四、正则表达式字符用法五、正则表达式练习1.匹配/etc/fstab中不是以#开头的行2.匹配/etc/passwd中以bash结尾的行3.匹配文件中025开头&#xff0c;后一个字符为"-"、" " 或没有&am…

Linux进程信号(下)

目录 1&#xff1a;信号保存概念 2&#xff1a;sigset_t 3&#xff1a;信号集操作函数 3.1&#xff1a;sigprocmask 3.2&#xff1a;9号进程不能被阻塞&#xff08;验证&#xff09; 3.3&#xff1a;sigpending 4&#xff1a;信号处理 5&#xff1a;sigaction 6&#x…

C++知识点 -- C++的IO流

C知识点 – C的IO流 文章目录 C知识点 -- C的IO流一、C标准IO流1.多个输入数据2.多行数据读入 二、C文件IO流1.ifstream读文件2.文件读写类 三、stringstream 一、C标准IO流 C系统实现了一个庞大的类库&#xff0c;其中以ios为基类&#xff0c;其他类都是直接或间接派生自ios类…

springboot 阿里云oss图片上传和异常处理

自己去申请开通阿里云oss。 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 1.在pom.xml添加依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.14.0</version></dep…

港科夜闻|香港科大与香港资管通有限公司签署校企合作备忘录,成立校企合作基金促科研成果落地...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港资管通有限公司签署校企合作备忘录&#xff0c;成立校企合作基金促科研成果落地。“港科资管通领航基金”28日在香港成立&#xff0c;将致力于推动高校科研成果转化&#xff0c;助力香港国际创科中心建设。…

Fabric.js 拖拽顶点修改多边形形状

theme: smartblue 我正在参加「掘金启航计划」 本文简介 戴尬猴&#xff0c;我是德育处主任 这次要介绍的一个demo是"拖拽多边形定点修改多边形形状"。 其实 Fabric.js 官网也有这个demo&#xff1a;Fabric.js demos Custom controls, polygon 。但这个demo可能对于…

ASEMI代理ADV7611BSWZ原装ADI车规级ADV7611BSWZ

编辑&#xff1a;ll ASEMI代理ADV7611BSWZ原装ADI车规级ADV7611BSWZ 型号&#xff1a;ADV7611BSWZ 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;LQFP-64 批号&#xff1a;2023 引脚数量&#xff1a;64 工作温度&#xff1a;-40C~85C 安装类型&#xff1a;表面贴装型 …

怎么轻松地搞定Win11系统备份任务?

“我是一个电脑小白&#xff0c;不是很懂电脑的一些操作。我刚买了一台新电脑&#xff0c;它装的是Win11系统&#xff0c;我害怕它出现什么问题&#xff0c;听朋友说可以通过备份的方法保护系统&#xff0c;这是真的吗&#xff1f;有谁知道该怎么进行Win11系统备份吗&#xff1…

OJ练习第101题——柱状图中最大的矩形

柱状图中最大的矩形 力扣链接&#xff1a;84. 柱状图中最大的矩形 题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 思路 我们先嵌…

第2章 Nginx环境搭建

第2章 Nginx环境搭建 2.1 下载 免费开源版的官方网站&#xff1a;http://nginx.org Nginx 有 Windows 版本和 Linux 版本&#xff0c;但更推荐在 Linux 下使用 Nginx&#xff1b; 下载nginx-1.14.2.tar.gz的源代码文件&#xff1a;wget http://nginx.org/download/nginx-1.…

登录功能实现及文件上传下载功能补充

登录功能实现简单介绍&#xff1a; 1&#xff1a;登录时密码输入错误刷新登陆页面并提示登录信息错误&#xff1b; 2&#xff1a;输入正确用户名及密码点击sign in 登录成功。&#xff08;如果勾选remember me 只要服务器未停止&#xff0c;可以直接免登录进入欢迎页面&#x…

《光电容积法在评估高血压中的应用》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…

ubuntu系统配置软件脚本自启动

背景 项目因为某些原因需要服务器自启动来执行脚本, 因此需要在ubuntu服务器上面实现自启动功能. 步骤 ubuntu作为服务器使用时&#xff0c;常常需要在机器重启时能自动启动我们开发的服务。 Ubuntu 18.04不再使用initd管理系统&#xff0c;改用systemd&#xff0c;包括用sys…

Redis:哨兵集群

目录 基于pub/sub 机制的哨兵集群组成基于pub/sub 机制的客户端事件通知由哪个哨兵执行主从切换哨兵实例是不是越多越好&#xff0c;如果同时调大 down-after-milliseconds 值&#xff0c;对减少误判是不是也有好处 部署多个哨兵实例就形成了一个哨兵集群。哨兵集群中的多个实例…

【Redis】Redis面试题

Redis的事务 什么是Redis的事务 Redis的事务是一个单独的隔离操作&#xff0c;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断&#xff0c;所以Redis事务是在一个队列中&#xff0c;一次性、顺序性、排他…