首页 > 其他分享 >图书管理系统的简单实现

图书管理系统的简单实现

时间:2024-10-24 21:49:30浏览次数:7  
标签:管理系统 System bookList 简单 println import public 图书 out

文章目录


   个人主页

  JavaSE专栏

图书系统逻辑分析

该程序设置有三个包,user 包,book 包,operation包。

  • book包中包含对于书的一些信息和操作;
  • operation包中包含有对 书 的所有操作功能;
  • user包中包含用户的一些信息和操作
    在这里插入图片描述

 抽离整个图书管理系统的对象: 用户 、 书、 书架
 book包中包含对于书的一些信息和操作
 book包中存在有 Book类,BookList类


 Book类中,有图书的属性:图书名,作者,类型,价格,是否被借出。
 Book类中的成员变量都被 private 修饰,所以使用 Getter and Setter 来访问和设置 成员变量的值。Book类中也重写了 toString 方法,用于后序显示图书的操作,这里注意重写的toString方法中,关于 isBorrowed 的修改,使用 isBorrowed == true ? "已借出" : "未借出" 动态表示图书状态

package book;

public class Book {
    private String name;
    private String author;
    private String type;
    private float price;
    private boolean isBorrowed;

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

    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 float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

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

 BookList类中 定义books数组用来存储图书,初始化数组容量为10,后序添加图书操作中如果数组满了,再进行扩容;
 定义 usedSize表示数组中有效图书的数量;使用构造方法对数组books初始化,即每次创建一个bookList 对象books数组里面都是默认存储三本书,默认有效图书数量为3
 定义findBook方法,用来查找 pos下标位置的图书并返回,后序主要被操作图书的各种类所调用
 定义setBook方法,用来新增一本图书
 定义getUsedSize方法,用来得到数组中有效图书的数量,后序主要被操作图书的各种类所调用
 定义setUsedSize方法,用来更改数组中有效图书的数量,后序被 删除图书的类 (DeltOperation) 和 新增图书的类(AddOperation) 中所调用

package book;

import java.util.Arrays;

public class BookList {
    private Book[] books = new Book[10];//初始化数组容量为10
    private int usedSize;//书架上的有效书的数量
    //默认每次都是三本书
    public BookList() {
        books[0] = new Book("三国演义","罗贯中","小说",10);
        books[1] = new Book("西游记","吴承恩","小说",15);
        books[2] = new Book("红楼梦","曹雪芹","小说",20);
        usedSize = 3;
    }

    /**
     * 找到 pos 位置的书并返回
     * @param pos
     * @return
     */
    public Book findBook(int pos) {
        return books[pos];
    }

    /**
     * 在 pos 位置新增一本书
     * @param pos
     * @param book
     */
    public void setBook(int pos, Book book) {
        //如果满了,进行扩容
        if(usedSize == books.length) {
            books = Arrays.copyOf(books,2*books.length);
        }
        books[pos] = book;
        usedSize++;
    }

    /**
     * 获取书架上的有效书本的个数并返回
     * @return
     */
    public int getUsedSize() {
        return usedSize;
    }

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

}

operation包中包含有对 书 的所有操作功能
  operation包中定义有一个Ioperation接口,和AddOperation类,FindOperation类,BorrowedOperation类,ReturnOperation类,ShowOperation类,ExitOperation类,DeltOperation类。这些类都对应着增添图书功能,查找图书功能,借阅图书功能,归还图书功能,显示图书功能,退出图书系统功能,删除图书功能。
Ioperation接口中定义work(BookList bookList)方法(此方法是抽象方法),表示对图书的操作
让所有类实现Ioperation接口,按照需求重写work方法。

【这里使用接口的原因:后续会把用户操作菜单中的各种操作放入一个数组中,数组是相同元素的集合,把这些操作类都实现Ioperation接口,那么数组的元素类型就可以设置为Ioperation,满足了数组的定义。如果不使用接口,那么这些类就无法放入同一个数组中,因为每个元素的类型都不一样】

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

public class AddOperation implements IOperation{
    public void work(BookList bookList) {
        System.out.println("AddOperation::");
    }
}
package operation;

import book.BookList;

import java.util.Scanner;

public class BorrowedOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
       System.out.println("BorrowedOperation::");
    }
}
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("DelOperation::");
    }
}
package operation;
import book.BookList;

public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
    System.out.println("ExitOperation::");
    }
}
package operation;
import book.BookList;
import java.util.Scanner;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {System.out.println("FindOperation::");
    }
}

package operation;
import book.BookList;
import java.util.Scanner;

public class ReturnOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
    System.out.println("ReturnOperation::");
    }
}
package operation;
import book.Book;
import book.BookList;

public class ShowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
       System.out.println("ShowOperation::");
    }
}

user包中包含用户的一些信息和操作
 user包中有User类, AdiminUser类,NormalUser类,其中AdiminUser类 和 NormalUser类都继承了User类,为了满足选择不同的身份,进而打印出不同的menu菜单,我们在父类User里定义一个menu()方法,子类按照需求重写menu()方法
【注意】按照上述描述,可以把User设置成抽象类,把没有具体实现的menu方法设置为抽象方法

 打印出菜单后,可以把操作的功能放入一个数组中,但是不同用户会显示不同的操作功能,因此数组内容由身份决定,所以如何实现作为不同身份,操作不同的数组? -> 可以在父类User类中定义 array数组,
在子类的构造方法中初始化数组,填充不同的功能元素,这样在选择不同的身份时,在各自的构造方法中就完成了数组内容的初始化。此时的数组内容就会根据身份而创建。

不同身份的数组已经准备好,选择一个数字进行操作
应该这样调用类中的方法: array[choice].work(bookList)
所以可以在User类中定义 doWork(int choice,BookList bookList)方法,用来实现所选择的操作

//         User类
package users;

import book.BookList;
import operation.IOperation;

public abstract class User {
    protected String name;

    protected IOperation[] array;

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

    public abstract int menu();

    public void doWork(int input, BookList bookList) {
        array[input].work(bookList);
    }
}
//       AdiminUser类
package users;

import operation.*;

import java.util.Scanner;

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        array = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new ShowOperation()
        };

    }

    @Override
    public int menu() {
        System.out.println("欢迎" + this.name +"来到图书系统");
        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 input = scanner.nextInt();
        return input;
    }
}
//        NormalUser类
package users;

import operation.*;

import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        array = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowedOperation(),
                new ReturnOperation()
        };
    }

    @Override
    public int menu() {
        System.out.println("欢迎" + this.name +"来到图书系统");
        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 input = scanner.nextInt();
        return input;
    }
}

创建 Main类 ,实现登录操作

import book.BookList;
import users.AdminUser;
import users.NormalUser;
import users.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();
        int choice = 0;
        do {
            System.out.println("请选择你的身份: 1:管理员  2:普通用户");
            choice = scanner.nextInt();
            if(choice == 1) {
                return new AdminUser(name);
            }else if(choice == 2){
                return new NormalUser(name);
            }else {
                System.out.println("选择错误,请重新选择(1 or 2)");
            }
        }while(choice != 1 || choice != 2);
        return null;
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();
        while(true) {
            int ret = user.menu();
            user.doWork(ret,bookList);
        }
    }
}

各种操作功能的实现

ShowOperation类 ------显示图书操作

package operation;

import book.Book;
import book.BookList;

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

FindOperation类 ------查找图书操作

package operation;

import book.BookList;

import java.util.Scanner;

public class FindOperation implements IOperation{
    @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(bookList.findBook(i).getName().equals(name)) {
                System.out.println("成功找到该图书,信息如下:");
                System.out.println(bookList.findBook(i));
                return;
            }
        }
        System.out.println("该图书尚未添加...");
    }
}

AddOperation类 ------新增图书操作

package operation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入图书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入作者名:");
        String author = scanner.nextLine();
        System.out.println("请输入图书类型:");
        String type = scanner.nextLine();
        System.out.println("请输入价格:");
        float price = scanner.nextFloat();
        Book book = new Book(name,author,type,price);
        bookList.setBook(bookList.getUsedSize(), book);
        System.out.println("新增图书成功");
    }
}


DeltOperation类 ------删除图书操作

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("请输入将要删除的图书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if(bookList.findBook(i).getName().equals(name)) {
                for (int j = i+1; j < bookList.getUsedSize(); j++) {
                    Book tmp = bookList.findBook(j-1);
                    tmp = bookList.findBook(j);
                }
                bookList.setUsedSize(bookList.getUsedSize()-1);
                System.out.println("删除图书成功");
                return;
            }

        }
        System.out.println("该图书尚未添加...");
        return;
    }
}

BorrowedOperation类 ------借阅图书操作

package operation;

import book.BookList;

import java.util.Scanner;

public class BorrowedOperation implements IOperation{
    @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(bookList.findBook(i).getName().equals(name)) {
                if(bookList.findBook(i).isBorrowed()) {
                    System.out.println("该图书已被借出...");
                    return;
                }
                bookList.findBook(i).setBorrowed(true);
                System.out.println("借阅图书成功");
                return;
            }
        }
        System.out.println("该图书尚未添加...");
    }
}

ReturnOperation类 ------归还图书操作

package operation;

import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation {
    @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(bookList.findBook(i).getName().equals(name)) {
                if(!bookList.findBook(i).isBorrowed()) {
                    System.out.println("该图书未被借出...");
                    return;
                }
                bookList.findBook(i).setBorrowed(false);
                System.out.println("归还图书成功");
                return;
            }
        }
        System.out.println("该图书尚未添加...");
    }
}

ExitOperation类 ------退出系统操作

package operation;

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.setBook(i,null);
        }
        System.exit(0);
    }
}

完整代码

---------完整代码请点击 本人码云链接---------




在这里插入图片描述


标签:管理系统,System,bookList,简单,println,import,public,图书,out
From: https://blog.csdn.net/2401_83147199/article/details/143215859

相关文章

  • 动态规划之简单多状态 dp 问题(下)
    文章目录买卖股票的最佳时机买卖股票的最佳时机含手续费买卖股票的最佳时机III买卖股票的最佳时机IV买卖股票的最佳时机题目:买卖股票的最佳时机思路状态表示:dp[i]表示第i天结束后,处于某个状态的最大利润,我们可以细分为,处于“买入”、“可交易”、“”三种状......
  • jsp高校人事档案数字化管理系统70of8(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学院简介,校园风光,员工,工资发放开题报告内容一、研究背景与意义随着信息技术的飞速发展和高校人事管理的日益复杂,传统的人事档案管理方式已难以满足高效、准......
  • jspm基于Java web的在线餐饮管理系统的设计和实现(11862)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发......
  • 基于neo4j的学术论文关系管理系统
    正在为毕业设计头疼?又或者在学术研究中总是找不到像样的工具来管理浩瀚的文献资料?今天给大家介绍一款超实用的工具——基于Neo4j的学术论文关系管理系统,让你轻松搞定学术文献的管理与展示!......
  • 基于neo4j的疫情信息管理系统
    你是否想过,一个能清晰展示疫情传播路径和患者关系的系统有多强大?今天,就来介绍一套专为疫情信息设计的知识图谱管理系统,它利用Neo4j图数据库构建,帮助你轻松掌握疫情动态和患者之间的潜在联系,让疫情防控不再复杂。......
  • 使用yield压平嵌套字典有多简单?
    我们经常遇到各种字典套字典的数据,例如:nest_dict = {    'a': 1,    'b': {        'c': 2,        'd': 3,        'e': {'f': 4}    },    'g': {'h': 5},    'i': 6,    'j�......
  • 简单的格式化配置ESLint 配合 Prettier
    要让编辑器(例如VSCode)自动处理多余的空格、自动格式化代码(如将<div></div>转换为<div/>),你可以安装和配置以下工具: 1.Prettier(推荐) Prettier是一款流行的代码格式化工具,支持多种语言和格式化规则。它可以自动处理多余的空格、代码缩进、以及将空标签转换为自闭合标签......
  • 鸠摩搜书入口zlibrary数字图书馆最新网址
    鸠摩搜书是一款功能全面的电子书搜索引擎,汇聚了大量的小说、学术著作、教材等资源。它支持多种格式的电子书搜索,如PDF、EPUB等,满足不同阅读需求。用户可以通过书名、作者或关键词进行搜索,快速定位所需内容。同时,鸠摩搜书提供了丰富的筛选条件,如按类型、语言、年份等,帮助用户精准查......
  • 计算机毕业设计项目推荐,个人知识管理系统 79004(开题答辩+程序定制+全套文案 )上万套实
    摘 要尽管我们每天面临的信息越来越多,信息过载与信息噪音越来越严重,但只要我们能充分利用个人知识管理技能,借助有效的个人知识管理软件相信战胜海量信息不再是困难。本课题在分析了个人知识管理现状以及对现有的个人知识管理网站进行研究比较的基础上,针对网络交流互助的特......
  • 真AI遇到招聘管理系统,帮助企业打造新质生产力
    知名科技杂志《连线》创始主编凯文·凯利曾预测:“在未来的100年里,人工智能将超越任何一种人工力量,将人类引领到一个前所未有的时代。”确实如此,随着近两年AIGC与大模型的快速爆发,AI在千行百业中的重要性愈发突出,它不但让众多行业迎来了被深度重构的新阶段,同时也成为了驱动新......