图书管理系统(Java版本)

文章目录

  • 前言
  • 要求
  • 1.设置对象
    • 1.1.图书
    • 1.2.书架
    • 2.管理员
    • 3.功能的实现
  • 2.搭建框架
    • 2.1.登录(login)
    • 2.2.菜单
    • 2.3.操作方法的获取
  • 3.操作方法的实现
    • 3.1.退出系统(ExitOperation)
    • 3.2.显示图书(ShowOperation)
    • 3.3.查阅图书(FindOperation)
    • 3.4.新增图书(AddOperation)
    • 3.5.借出图书(BorrowOperation)
    • 3.6.归还图书(ReturnOperation)
    • 3.7.删除图书(DelOperation)


前言

前面足足有十篇博客,给大家讲解了Java的基础语法,尤其是面向对象以及其思想,是我们遇到的第一种障碍,为此咱们写一个图书管理系统进行巩固。

要求

在这里插入图片描述
这边是一个主要流程,其中具体的功能就不在此一一展示,等会在功能的实现中,具体再说

1.设置对象

1.1.图书

根据图上所示,我们可以发现,每一个图书的成员变量有五个:
书名,作者,价格,类型,以及借出情况。
并且我们不想要让别人直接得到,那么都需要用private修饰。

1.2.书架

每本书都要放到书架中,方才可以使用,当然还要直到当前图书的个数,以及如何取书和放书。
下来我们这两个放到一个包中,编写其内容,代码。
书架类

public class BookList {
    Book[]books=new Book[10];
    private int UseSize;
    public BookList(){
        this.books[0]=new Book("三国演义","罗贯中",9.9,"小说");
        this.books[1]=new Book("我与地坛","史铁生",23.9,"散文");
        this.books[2]=new Book("红楼梦","曹雪芹",9.9,"小说");
        this.UseSize=3;
    }
    public BookList(int useSize) {
        UseSize = useSize;
    }
    public Book getBook(int pos){
        return books[pos];
    }
    public void setBook(int pos,Book book){
        this.books[pos]=book;
    }

    public int getUseSize() {
        return UseSize;
    }

    public void setUseSize(int useSize) {
        UseSize = useSize;
    }
     public Book[] getBooks() {
        return books;
    }

    public void setBooks(Book[] books) {
        this.books = books;
    }
}

图书类

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

    public Book(String name, String author, double 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 double getPrice() {
        return price;
    }

    public void setPrice(double 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==false?"未借出":"已借出")+
                '}';
    }
}

2.管理员

管理员分为两类,1.一种是普通用户,2。一种是管理员用户。
我们把这两种用户的相同点放到一个User抽象类中,再分别实现自己的功能,把这三个类放到一个包里。
User抽象类

public abstract class User {
    protected String name;

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

AdminUser类

public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
    }

    @Override
    public void menu() {

    }
}

NormalUser类

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
    }

    @Override
    public void menu() {

    }
}

其中具体的实现,等会在写

3.功能的实现

我们通过上面的图,可以发现一共有7种操作方法,并且有一样的,首先我们会有2个问题:第一个问题:如何可以知道User的类型,第二种,如何可以该用户有哪些方法,并且如何去进行调用呢?这些方法等会都会进行解答,首先我们先把每个功能的框架搭建一下,在创建一个包(iOperation)。
在这里插入图片描述

这边各种包的创建过程,其中有7大操作功能,内容和上面的都一样,大家下面自己去搭建一下。
具体内容,现在进行操作。


2.搭建框架

2.1.登录(login)

在这里插入图片描述

我们现在实现这个页面的内容。主要我们是要想返回值是什么?结合上面第一个问题,返回值是User,通过登录这个方法,我们可以确定目前是什么用户进行登录。

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){
            return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
    }

2.2.菜单

在这里插入图片描述
现在我们完成这个菜单页面,并且返回值又是什么?因为,我们已经知道身份了,那么就要知道操作方法的选择,因此返回值是int

AdminUser类

public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
    }

    @Override
    public int menu() {
        System.out.println("****************");
        System.out.println("0.退出系统        ");
        System.out.println("1.查找图书        ") ;
        System.out.println("2.新增图书        ") ;
        System.out.println("3.删除图书        ") ;
        System.out.println("4.显示图书        ") ;
        System.out.println("****************");
        System.out.println("请输入你的操作:");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

NormalUser类

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
    }

    @Override
    public int  menu() {
        System.out.println("****************");
        System.out.println("0.退出系统        ");
        System.out.println("1.查找图书        ") ;
        System.out.println("2.借阅图书        ") ;
        System.out.println("3.归还图书        ") ;
        System.out.println("****************");
        System.out.println("请输入你的操作:");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

User父类就是把原来menu的返回值改为int即可,我就在这不演示啦。

2.3.操作方法的获取

现在便是要解决最难得一个问题,如何让控制台得知,我们要进行那个操作,现在我们知道了用户类型,以及选择的方法,我们可以使用一个数组,每个下标都对应各自的方法,而我们要将7大操作方法,组合在一起,又要跟下标相关联,那一定是数组。并且,要让7大操作方法,都有一个共有的东西,使得在调用这个东西的时候,就是在调用他们自己的话,那就是接口啦!
为此我们在iOperation包中创建一个接口。
IOperation接口

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

创建完接口,下来就要在User中创建IOperation数组了,然后分别在AdminUser和NormalUser中,分别对数组进行初始化,与此同时,在User中创建一个方法,可以在Test中使用接口。
User抽象类

public abstract class User {
    protected String name;
    protected IOPeration[]ioPerations;
    public User(String name) {
        this.name = name;
    }
    public abstract int menu();
    public void doOperation(int choice, BookList bookList){
        ioPerations[choice].work(bookList);
    }
}

AdminUser类

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()  
       };
    };
    @Override
    public int menu() {
        System.out.println("****************");
        System.out.println("0.退出系统        ");
        System.out.println("1.查找图书        ") ;
        System.out.println("2.新增图书        ") ;
        System.out.println("3.删除图书        ") ;
        System.out.println("4.显示图书        ") ;
        System.out.println("****************");
        System.out.println("请输入你的操作:");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

NormalUser类

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.ioPerations=new IOPeration[]{
                new ExitOperation(),
                new FindOperation() ,
                new BorrowOperation(),
                new ReturnOperation()};
    };
    @Override
    public int  menu() {
        System.out.println("****************");
        System.out.println("0.退出系统        ");
        System.out.println("1.查找图书        ") ;
        System.out.println("2.借阅图书        ") ;
        System.out.println("3.归还图书        ") ;
        System.out.println("****************");
        System.out.println("请输入你的操作:");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
}

Test类

public class Test {
    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){
            return new AdminUser(name);
        }else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList=new BookList();
        User user=login();
        while (true){
            int choice=user.menu();
            user.doOperation(choice,bookList);
        }
    }
}

由此观之:将7大操作方法连接起来的的是接口
将方法按照顺序让控制台知道我们的操作,是数组(也可以说是下标),将这两个结合起来,便是我们的创新的点子,最精彩的在上面,大家好好领悟,领悟完,再看每个操作方法的具体实现


3.操作方法的实现

3.1.退出系统(ExitOperation)

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

3.2.显示图书(ShowOperation)

public class ShowOperation implements IOPeration{
    public void work(BookList bookList){
    	System.out.println("显示图书...");
        int currentSize=bookList.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBook(i);
            System.out.println(book);
        }
    }
}

3.3.查阅图书(FindOperation)

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.getUseSize();
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println("找到了图书:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到你想查阅的书籍");
    }
}

3.4.新增图书(AddOperation)

public class AddOperation implements IOPeration{
    public void work(BookList bookList){
        //1.判满和判空
        System.out.println("新增图书...");
        int currentSize= bookList.getUseSize();
        if(currentSize==0){
            System.out.println("书架中已无书");
            return;
        }
        if(currentSize==bookList.getBooks().length){
            System.out.println("书架已放满书");
            return;
        }
        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("请输入价格:");
        Double price= scanner.nextDouble();
        Book newbook=new Book(name,author,price,type);
        for (int i = 0; i < currentSize; i++) {
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println("此书在书架上已存在...");
                return;
            }
        }
        //插入书籍
        bookList.setUseSize(currentSize+1);
        bookList.setBook(currentSize,newbook);
        System.out.println("新书增加成功...");
    }
}

3.5.借出图书(BorrowOperation)

public class BorrowOperation implements IOPeration {
    public void work(BookList bookList){
        System.out.println("借阅图书...");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你想借阅的书名:");
        String name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        for (int i=0;i<currentSize;i++){
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
                if(book.isBorrowed()){
                    System.out.println("此书已经借出!");
                    return;
                }
                book.setBorrowed(true);
                System.out.println("借阅成功...");
                return;
            }
        }
        System.out.println("没有查到你要借阅的图书");
    }
}

3.6.归还图书(ReturnOperation)

借阅图书和归还图书本质是一样的

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

3.7.删除图书(DelOperation)

这就需要数据结构的知识啦,可以利用画图来演示
在这里插入图片描述
这里用数字代替图书

public class DelOperation implements IOPeration {
    public void work(BookList bookList){
        System.out.println("删除图书...");
        System.out.println("请输入你想删除的书名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        int currentSize=bookList.getUseSize();
        int i=0;
        int pos=-1;
        for (;i<currentSize;i++){
            Book book=bookList.getBook(i);
            if(book.getName().equals(name)){
                pos=i;
                break;
            }
        }
        if(i==currentSize){
            System.out.println("没有找到你想删除的图书");
            return;
        }
        //删除图书
        for (int j=pos;j<currentSize-1;j++){
            Book book=bookList.getBook(j+1);
            bookList.setBook(j,book);
        }
        bookList.setBook(currentSize,null);
        bookList.setUseSize(currentSize-1);
        System.out.println("删除成功!");
    }
}


具体代码:请看大松鼠的码云

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day38 贪心算法part05

LC435无重叠区间(未掌握) 思路&#xff1a;先对数组进行排序&#xff0c;找到非重叠的区间的个数&#xff0c;然后区间的总数减去非重叠区间的个数即是需要移除的区间的个数与LC452用最少数量的箭引爆气球类似&#xff0c;但是不同的是[1,2]和[2,3]在此题并不是重叠区间但是在…

【pyspark速成专家】3_Spark之RDD编程1

目录 ​编辑 一&#xff0c;创建RDD 二&#xff0c;常用Action操作 三&#xff0c;常用Transformation操作 一&#xff0c;创建RDD 创建RDD主要有两种方式&#xff0c;一个是textFile加载本地或者集群文件系统中的数据&#xff0c; 第二个是用parallelize方法将Driver中的…

vue-officef实现pdf文件在线预览

一、参考网址 https://www.cnblogs.com/guozhiqiang/p/17957288 1、引入依赖 npm install vue-office/pdf vue-demi2、编写组件 <template><vue-office-pdf :src"pdf"/> </template> <script> // import pdf from vue-pdf import VueOffice…

机器学习云环境测试

等待创建完成后&#xff0c;点击 PyTorch 打开&#xff0c;创建一个全新的 notebook 在 Cell 中输入如下代码&#xff0c;并点击 Run 完成后点击 New Cell &#xff0c;在 New Cell 中输入如下代码 输入完成后点击 Run &#xff0c;运行 New Cell 。&#xff08;每个 Cell 代…

云和恩墨海外首秀在吉隆坡召开的2024中国智能科技与文化展览会

作为中马建交50周年官方重点推荐的活动之一&#xff0c;2024中国智能科技与文化展览会&#xff08;第四届&#xff09;于5月20至21日在毗邻吉隆坡双子塔的吉隆坡国际会展中心举办。本次展览会获得马来西亚科学技术创新部、马来西亚通讯部、中国驻马来西亚大使馆和马来西亚中华总…

获得 AI Applied Skills 凭证:微软在线评估认证的注意事项

在你踏上微软的亚洲AI奥德赛之旅&#xff0c;完成基础课程学习后&#xff0c;你可以继续进行相应的评估&#xff0c;在交互式实验室体验中完成一系列任务&#xff0c;通过线上即时评估赢得认证。通过本文的介绍&#xff0c;可以帮助你了解评估认证的一些细节以及注意事项&#…

C++中的四种类型转换运算符

隐式类型转换是安全的&#xff0c;显式类型转换是有风险的&#xff0c;C语言之所以增加强制类型转换的语法&#xff0c;就是为了强调风险&#xff0c;让程序员意识到自己在做什么。但是&#xff0c;这种强调风险的方式还是比较粗放&#xff0c;粒度比较大&#xff0c;它并没有表…

[协议]stm32读取AHT20程序示例

AHT20温度传感器使用程序&#xff1a; 使用i2c读取温度传感器数据很简单&#xff0c;但市面上有至少两个手册&#xff0c;我这个对应的手册贴出来&#xff1a; main: #include "stm32f10x.h" // Device header #include <stdint.h> #includ…

【408精华知识】页、页面、页框、页帧、内存块、物理块、物理页面还傻傻分不清?

在做题过程中&#xff0c;我们经常能看到页、页框、块等概念&#xff0c;初接触时&#xff0c;常感觉傻傻分不清&#xff0c;这篇文章将简洁地介绍它们之间的联系与区别。 这些概念之间的根本区别&#xff0c;在于是物理上的概念还是逻辑上的概念&#xff0c;也即是虚地址还是实…

认知架构 cognitive architecture

Assistants API&#xff1a;以开发人员为中心。 有状态的API&#xff1a;允许存储以前的消息、上传文件、访问内置工具&#xff08;代码解释器&#xff09;、通过函数调用控制其他工具。 认知架构应用的两个组件&#xff1a;&#xff08;1&#xff09;如何提供上下文给应用 &…

Widows技术专题系列-系统装机教程

Windows技术专题系列 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-05-20csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 1 系统…

使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录 &#xff08;一&#xff09;Supabase&#xff08;二&#xff09;Realtime&#xff08;消息&#xff09;&#xff08;2.1&#xff09;Python 消息订阅&#xff08;2.2&#xff09;JavaScript 消息订阅 &#xff08;三&#xff09;Storage&#xff08;存储&#xff09;&…

【Centos7+JDK1.8】Jenkins安装手册

一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins&#xff0c;直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…

探索Facebook:数字社交的新时代

Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;一直在引领着数字社交的发展潮流。随着科技的不断进步和社会的不断变迁&#xff0c;Facebook也在不断演进和创新&#xff0c;迎接着数字社交的新时代。本文将探索Facebook在数字社交领域的新发展&#xff0c;以…

一个开源的工具类轮子是怎么造出来的

心路历程 为什么要做 在22年9月的某一天&#xff0c;在公司开需求评审时&#xff0c;接到了一个给PDF、图片添加水印的需求。做为一个刚工作的CURD程序员&#xff0c;在遇到这些问题时&#xff0c;第一反应是去github上找找有没有类似的开源框架。但是&#xff0c;出乎我意料…

基于springboot实现旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 DOM破坏总结为一句话就是&#xff1a;利用HTML元素来响应JS代码的执行结果。 举个例子&#xff1a; <body> <img id"x"> <img name"y"…

145.栈和队列:删除字符串中的所有相邻重复项(力扣)

题目描述 代码解决 class Solution { public:string removeDuplicates(string s) {// 定义一个栈来存储字符stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size(); i){// 如果栈为空或栈顶字符与当前字符不相同&#xff0c;则将当前字符入栈if(st.e…

JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解

文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC&#xff1a;并行回收4. Parallel GC&#xff1a;吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags&#xff1a;查看命令行相关参数&#xff08;包含使用的垃圾收集器&#xff09;使用命令行指令&#xff1a;ji…

【简单介绍下爬山算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…