java项目——图书管理系统

文章目录

  • 前言
  • 图书管理系统
    • 整体框架:
    • book包
    • user包
    • Main包:
    • iooperation包
    • 总结:


前言

针对这些天所学的javaSE的知识,用一个小项目来实践一下。


图书管理系统

整体框架:

采取面向对象的思想实现此项目,首先分析出此项目中涉及的对象有哪些:
有用户,书籍,业务操作!
用户又分为普通用户与管理员。
书籍相关的对象又分为书籍与书架。
操作又分为七种不同的功能操作。
在这里插入图片描述
在这里插入图片描述

book包

在这里插入图片描述
有关书的类均创建在book包中,有书籍与书架两个类:
书籍Book类
书籍类中有4种属性,均设置成private修饰,封装起来,用getter和setter方法进行获取与修改!

package book;

public class Book {
     private   String name;  //书籍的名称
     private  double price;  //书籍的价格
     private   String author; //书籍的作者
     private boolean state; //书籍当前的状态 -是否可借出

    public Book(String name, double price, String author) {
        this.name = name;
        this.price = price;
        this.author = author;
        this.state = true;  //默认均为true,表示可借出
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public boolean getState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }
}

书架类BookList:

在书架类中,有一个Book类型的数组,用于表示书架,书架的空间为5
属性number表示当前书架上书的数目。
用getter和setter来获取与设置number的信息。

package book;

public class BookList {
    //书架的本质应该是一个数组
   public   Book [] books = new Book[5];   
    private  int number = 3;
  //初始化放入三本书
 //通过构造方法,初始化放入三本书  
    public BookList() {
       
         this.books[0] = new Book("红楼梦",10.5,"曹雪芹");
         this.books[1] = new Book("西游记",15,"吴承恩");
         this.books[2] = new Book("三国演义",15.2,"罗贯中");
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

user包

在这里插入图片描述
user包中有user抽象类,有普通用户类NormalUser,有管理员类AdminUser.
user抽象类:
user抽象类中有属性,用户的名字
有接口数组:即可以用于存放实现菜单中功能的业务实现类
有一个menu抽象方法,对于管理员与普通用户进行不同的重写。
选择操作的抽象方法,可以参考普通用户类与管理员类AdminUser理解!

package user;

import book.BookList;
import iooperation.IOperation;

public  abstract  class User {
     protected   String name;   //用户的名字                                          !
     IOperation [] iOperations;    //操作接口数组

    //定义一个menu抽象方法
    public  abstract int  menu();    //菜单的抽象方法
    public User(String name) {
        this.name = name;
    }
    public   abstract   void dooperation(int choice, BookList bookList);  //选择操作方法!

}

普通用户类NormalUser:
在本类中,构造方法为iOperation数组进行了初始化,针对呈现给普通用户的菜单,赋值了对应的业务实现类对象。

对于dooperation方法,在接收了用户输入的choice值后,便针对选定的书架,iOperations数组中相应的实现类对象!

menu方法如代码中所示:

package user;

import book.BookList;
import iooperation.*;

import java.util.Scanner;

public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
       //创建一个接口数组:
        this.iOperations = new IOperation[]{
                new SearchOperation(),   
                //搜寻功能的实现类——多写一行是为了菜单中选项与数组下标一致,
                //便于调用相应的实现类对象。
                new SearchOperation(),   //搜寻功能的实现类对象
                new BorrowOperation(),   //借阅功能的实现类对象
                new ReturnOperation(),   //归还功能的实现类对象
                new ExitOperation()      //退出功能的实现类对象
        };
    }
    public void dooperation(int choice, BookList bookList){
        //根据choice,调用相应的业务类对象
        this.iOperations[choice].work(bookList);
    }
    public int  menu(){
        System.out.println("*****************************");
        System.out.println("******普通用户菜单*******");
        System.out.println("******1. 查找图书**********");
        System.out.println("******2. 借阅图书***********");
        System.out.println("******3. 归还图书**********");
        System.out.println("******4. 退出系统**********");
        System.out.println("*****************************");
        System.out.println("请选择你要执行的操作!");
        //用于接收从键盘上输入的数字,并返回!
        return   new Scanner(System.in).nextInt();
    }
}

管理员类AdminUser:
本类中亦根据菜单中功能,为iOperations进行了相应的初始化。

对于dooperation的实现与普通用户类相同,均用于接收相应的choice值,而调用
iOperations中相应的实现类对象!

package user;

import book.BookList;
import iooperation.*;


import java.util.Scanner;

public class AdminUser extends User {


    public AdminUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new SearchOperation(), //用于使数组的下标与菜单选项值一致
                new SearchOperation(),  //搜寻功能实现类对象
                new AddOpearation(),    //新增图书功能实现类对象
                new DeleteOperation(),  //删除图书功能实现类对象
                new ShowOperation(),    //展示图书功能实现类对象
                new ExitOperation()     //退出系统功能实现类对象
        };
    }

    @Override
    public void dooperation(int choice, BookList bookList) {
        this.iOperations[choice].work(bookList);
    }

    public int  menu() {
        System.out.println("**欢迎" + super.name + "****");
        System.out.println("******管理员菜单*******");
        System.out.println("*****1. 查找图书**********");
        System.out.println("*****2. 新增图书************");
        System.out.println("*****3. 删除图书***********");
        System.out.println("*****4. 显示图书***********");
        System.out.println("*****5. 退出系统***********");
        System.out.println("请选择你要执行的操作!");
        return   new Scanner(System.in).nextInt();
    }
}

Main包:

Main包中用于放置测试类:
下面中代码的内容体现了本项目大体框架的实现:

首先:针对系统的登录,创建一个静态方法。
其次:在main方法中,先实例一个书架对象,
然后新建一个User 引用 接收从登录方法中传来的用户对象。
然后用choice局部变量接收用户针对菜单 选择的功能选项。
最后,调用dooperation方法,传入实参bookList1与choice,实现对应的功能!

package Main;

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

import java.util.Scanner;

public class Test {
    public static User Login() {
        System.out.println("请输入你的名字:");
        String name = new Scanner(System.in).next();
        System.out.println("请输入你的身份:1. 管理员   2. 普通用户");
        int choice = new Scanner(System.in).nextInt();
        if (choice == 1) {
            return new AdminUser(name);
        } else {
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {
        //先创建一个书架
        BookList bookList1 = new BookList();
        //接收登录后返回的对象值:
        while (true) {
            User user = Login();
            int choice = user.menu();
            //调用相应的业务类对象
            user.dooperation(choice, bookList1);

        }
    }
}

iooperation包

在这里插入图片描述
本包是业务功能实现包,具有一个操作接口与七个业务实现类。
IOperation接口:

本接口中只有一个抽象方法work,参数为书架对象,其余七个实现类均实现本接口。

package iooperation;

import book.BookList;

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

AddOperation类:
此类实现新增图书功能:

package iooperation;

import book.Book;
import book.BookList;

import java.util.Scanner;

public class AddOpearation implements IOperation {
    public void work(BookList bookList){
        System.out.println("请输入您要添加的图书的信息");
        System.out.println("请输入书籍的名字:");
        String name  = new Scanner(System.in).next();
        //先判断书架上是否已经有此书籍,如果有则拒绝添加!!!
        for (int i = 0; i < bookList.getNumber(); i++) {
            if (bookList.books[i].getName().equals(name)) {
                System.out.println("已有这本书的存档,添加失败!!!");
                return;
            }
        }
        System.out.println("请输入书籍的价格:");
        double price2 = new Scanner(System.in).nextDouble();
        System.out.println("请输入书籍的作者:");
        String author2 = new Scanner(System.in).next();
        Book book = new Book(name,price2,author2);

        //将新的书籍的信息赋值到书架的后面
        int currency = bookList.getNumber();  //获取当前书架上书籍的数目
        //需要先判断书架上是否还有空间!!
        if(currency==5){
            System.out.println("书架上的书籍已经满了,不能再添加新的书籍!!");
        }else {
             bookList.books[currency]  = book;
             //然后书籍的数目加1
            bookList.setNumber(currency+1);
            System.out.println("添加书籍成功!!!");
        }
    }
}

BorrowOperation类:
本类用于实现借阅功能:

package iooperation;

import book.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation {

    public void work(BookList bookList){
       //借阅图书
        System.out.println("请输入你要借阅的图书名称:");
        String name = new Scanner(System.in).next();
        for (int i = 0; i < bookList.getNumber(); i++) {
            if (bookList.books[i].getName().equals(name)) {
                  //如果要借阅的图书存在,则判断其是否被借出。
                if(bookList.books[i].getState()== true){
                    //说明此书可借阅!!!
                    System.out.println("借阅成功!!!");
                    bookList.books[i].setState(false);
                    return;
            }else {
                    System.out.println("此书已被借出,借阅失败!!!");
                    return;
                }
        }

    }
        System.out.println("不存在你所要借阅的图书!!!");
    }
}

DeleteOperation类:
本类用于实现删除图书功能!

package iooperation;


import book.BookList;

import java.util.Scanner;

public class DeleteOperation implements IOperation {
    //删除图书
    //在顺序表中删除一条数据,在被删除的数据的位置之后的所有数据往后移动一位!!!
    public void work(BookList bookList){

        System.out.println("请输入你要删除的图书名字:");
        String name = new Scanner(System.in).next();
        //先查找这本书,看其是否存在在书架上!
        for (int i = 0; i < bookList.getNumber(); i++) {
            //如果书架上的书与要查找的书的书名相同!!
            if(bookList.books[i].getName().equals(name)){
            //当书架上存在这本书,将这本书之后的所有书籍往前挪动一位,如果是此书是书架上最后一本书籍,则不用动
                //number-1即可(因为我们是根据数组下标操作书架!!!)
                int currency = bookList.getNumber();
                for (int j = i; j < currency-1 ; j++) {
                         bookList.books[j] = bookList.books[j+1];

                }
               //移动完之后
                System.out.println("删除成功!!!");
                bookList.setNumber(currency-1);
                return;
            }
        }
        System.out.println("未查找到您要删除的书籍!!!");
    }
    }

ExitOperation类:
本类用于实现退出系统功能!

package iooperation;

import book.BookList;

public class ExitOperation implements IOperation {
   public void work(BookList bookList){
      //退出系统:status==0!!!
      System.exit(0);
   }
}

ReturnOperation 类:
本类用于实现归还图书功能!

package iooperation;

import book.BookList;

import java.util.Scanner;

public class ReturnOperation implements IOperation {


    public void work(BookList bookList) {
        //归还图书
        //首先搜索的书籍,判断要归还的书籍是否有存档!
        System.out.println("请输入你要归还的图书名称:");
        String name = new Scanner(System.in).next();
        for (int i = 0; i < bookList.getNumber(); i++) {
            if (bookList.books[i].getName().equals(name)) {
                //如果借阅的图书有存档,且并未被借出
                if (bookList.books[i].getState() == false) {
                    System.out.println("归还图书成功!!!");
                    bookList.books[i].setState(true);
                    return;
                } else {
                    System.out.println("该图书并未借出,归还失败!!!");
                     return;
                }

            }

        }
        System.out.println("归还失败,并无此书的存档!!!");
    }
}

SearchOperation类:
本类用于实现查找图书功能!

package iooperation;

import book.BookList;

import java.util.Scanner;

public class SearchOperation  implements IOperation  {
    //进行查找
    public void work(BookList bookList){
        System.out.println("请输入您要查找的图书名称:");
        String name = new Scanner(System.in).next();
        for (int i = 0; i < bookList.getNumber(); i++) {
            //如果书架上的书与要查找的书的书名相同!!
            if(bookList.books[i].getName().equals(name)){
                //当找到所查找的书籍时,直接将书籍的全部信息打印出来!!!
              //  System.out.println("查找到"+bookname+"这本书");
                System.out.println(bookList.books[i].toString());


                return;
            }

        }
        System.out.println("未查找到您所指向的书籍!!!");
    }
}

ShowOperation类:
本类用于展示书架上所有书籍的功能!

package iooperation;

import book.BookList;

public class ShowOperation implements IOperation {
    //显示书架上的所有图书:
    public void work(BookList bookList){

        // 将所有的书籍均遍历出来
        for (int i = 0; i < bookList.getNumber(); i++) {
            System.out.println(bookList.books[i].toString());
        }

    }

总结:

在最开始写此项目时,我是创建了两个类(普通用户类菜单相关一个,管理员相关一个)根据接受到的choice值,用switch语句来调用相应的实现类对象,
但是这并不是面向对象的思想,是面向过程的思想,
应该尽量的将属于一个对象的东西封装到一个类中去,比如专属于普通用户的菜单,专属于普通用户的业务实现类对象数组,用户对象可以调用自己的方法实现功能(如dooperation方法)等。

在实现方法时,尽量的不要超出其应该的功能范围,比如在实现Login方法时,之前便添加了将登录后返回值加工的代码,这不利于代码的可读性与结构的梳理,应该遵循高内聚,低耦合的思想!

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

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

相关文章

RedHat9 | DNS剖析-DNS服务器综合部署

一、配置需求及网络拓扑 1、配置拓扑 2、配置需求 使用【主DNS服务器】管理meaauf.cn域和gz.meaauf.cn域&#xff1b;并将bj.meaauf.cn域委派给【子域DNS服务器】进行管理。在【主DNS服务器】上添加相应的A记录、别名记录、MX记录和PTR记录&#xff1a;【辅助DNS服务器】作为…

nginx 安全配置

1、前言 前后端分离后&#xff0c;nginx 作为跨域转发工具在日常应用中越来越广泛&#xff0c;它的安全性不能不能忽略。 2、nginx 安装相关说明 2.1 直接下载安装包 在nginx官网下载编译好的安装包&#xff0c;链接地址为nginx: download。如果是linux系统&#xff0c;直接使…

价格预言机领导者 Pyth 与 Eclipse 平台集成,为高频 DeFi 应用提供支持

本篇文章将对这一战略合作伙伴关系&#xff0c;以及 Pyth 网络在 Eclipse 生态系统中扮演的关键角色进行深入探讨。 目前&#xff0c;Pyth 价格数据已正式上线于 Eclipse 测试网。Eclipse 是首个结合了以太坊安全性、Solana 性能和 Celestia DA 的 Solana虚拟机(SVM) Layer2 方…

鸿蒙ArkUI-X跨语言调用说明:【平台桥接(@arkui-x.bridge)】

平台桥接(arkui-x.bridge) 简介 平台桥接用于客户端&#xff08;ArkUI&#xff09;和平台&#xff08;Android或iOS&#xff09;之间传递消息&#xff0c;即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。 以Android平台为例&#xff0c;Ark…

小动物单通道麻醉机、多通道麻醉机

ZL-04A-5多通道小动物麻醉机采用英国进口的挥发罐体&#xff0c;国内组装而成&#xff0c;产品输出气体稳定。多通道小动物麻醉机无需氧气瓶&#xff0c;自带空气输出机&#xff0c;小动物麻醉机对氧气浓度有要求可以选配氧气输出机。 详情介绍&#xff1a; 产品特点&#xf…

模拟量4~20mA电流传感器接线方式

一、模拟量4~20mA电流传感器接线方式 无源双线制是常见的电流型传感器接线方式&#xff0c;它具有简单、经济的特点。其接线方式如下&#xff1a; 传感器的“”接到数据采集器的电源“”上&#xff0c; 传感器的“-”端子连接到数据采集器的“AI”端子上&#xff0c; 数据采集器…

VUE3+TS+elementplus+Django+MySQL实现从数据库读取数据,显示在前端界面上

一、前言 前面通过VUE3和elementplus创建了一个table&#xff0c;VUE3TSelementplus创建table&#xff0c;纯前端的table&#xff0c;以及使用VUE3TSelementplus创建一个增加按钮&#xff0c;使用前端的静态数据&#xff0c;显示在表格中。今天通过从后端获取数据来显示在表格…

简单介绍两个方法 学会怎样操作伦敦金

近期伦敦金价格大涨又大跌&#xff0c;不光吸引了多头的关注&#xff0c;空头也考虑入场对伦敦金进行做空操作。然而&#xff0c;这样去操作伦敦金的交易&#xff0c;是需要比较高的操作技巧的。对普通投资者来说&#xff0c;怎么练就这样的操作伦敦金的技巧呢&#xff1f; 复制…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十二)- 微服务(2)

目录 4. Ribbon负载均衡 4.1 负载均衡流程 4.2 负载均衡策略 4.3 Ribbon饥饿加载 5. Nacos注册中心 5.1 服务注册到nacos 5.2 nacos服务分级存储模型 5.3 根据权重负载均衡 5.4 环境隔离--namespace 4. Ribbon负载均衡 4.1 负载均衡流程 4.2 负载均衡策略 默认实现是…

看潮成长日程表用户手册(上)

看潮成长日程表用户手册&#xff08;上&#xff09; 一、特色功能1、以每周日程表为主要形式2、全时管控的时间管理3、持续的日程管理4、分期间时间表5、按日排程&#xff0c;按周输出6、夏季作息时间处理7、年度假日处理8、休息日处理9、弹性日程10、完成记录11、多种输出形式…

C++-指针

在C中&#xff0c;指针是至关重要的组成部分。它是C语言最强大的功能之一&#xff0c;也是最棘手的功能之一。 指针具有强大的能力&#xff0c;其本质是协助程序员完成内存的直接操纵。 指针&#xff1a;特定类型数据在内存中的存储地址&#xff0c;即内存地址。 指针变量的定…

【第39天】SQL进阶-SQL设计优化-反范式设计(SQL 小虚竹)

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 零、前言一、练习题目二、SQL思路初始化数据什么是反范式设计例子反范式设计的优点反范式设计的缺点实战中要注意的坑 三、总结四、参考 零、前言 今天是学习 SQL 打卡的第 39 天。 ​ 我的学习策略很简单&#xff0c;…

瓦罗兰特账号怎么注册 瓦罗兰特延迟高用什么加速器

《瓦罗兰特》&#xff08;Valorant&#xff09;是由拳头游戏&#xff08;Riot Games&#xff09;开发并发行的一款免费的多人在线第一人称射击游戏&#xff08;FPS&#xff09;&#xff0c;它结合了传统的硬核射击机制与英雄角色的能力系统&#xff0c;为玩家提供了独特的竞技体…

无忧易售ERP:智慧采购,重塑供应链管理新高度

在当今瞬息万变的商业环境中&#xff0c;高效的采购策略不仅是成本控制的关键&#xff0c;更是企业竞争力的体现。无忧易售ERP&#xff0c;作为一站式企业资源规划解决方案的领航者&#xff0c;专为现代企业量身打造了集成化的采购管理模块&#xff0c;以智能化、自动化的工具为…

适用于Android的最佳数据恢复软件

如果您的 Android 设备崩溃&#xff0c;您需要找到一种方法来取回您的数据。幸运的是&#xff0c;有许多数据恢复程序可以帮助您恢复丢失的文件。有些是免费的&#xff0c;而另一些则需要付费。这是适用于Android设备的最佳数据恢复软件列表。 什么是数据恢复软件&#xff1f; …

python-数据可视化

python-数据可视化 ** 数据可视化指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘**紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据 最流行的工具之一…

eBPF可观测之网络流量控制和管理traffic control浅尝

目录 工程背景 环境准备 安装工具​​​ 安装依赖包 安装C依赖库 操作步骤 目录结构 代码展示 效果展示 拓展提升 工程背景 首先发表一个"暴论" eBPF在可观测方面的应用&#xff0c;就是各种google。 不需要学习内核&#xff0c;只要掌握ebpf开发套路。…

什么是“SQL注入攻击”?如何预防和应对?

一、SQL注入攻击的概念 SQL注入攻击是一种针对数据库驱动的应用程序的攻击技术&#xff0c;其中攻击者通过在应用程序的输入字段中插入或“注入”恶意的SQL代码&#xff0c;试图非法访问、操作或破坏后端数据库。当应用程序不正确地处理用户输入&#xff0c;并将其直接拼接到SQ…

【NumPy】NumPy线性代数模块详解:掌握numpy.linalg的核心功能

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

国产数据库替代加速 助力数字中国建设

5月24日&#xff0c;随着第七届数字中国建设峰会在福州的成功举办&#xff0c;释放数据要素价值、发展新质生产力成为当下热议的话题。 数据作为新型生产要素&#xff0c;是数字化、网络化、智能化的重要基础。北京人大金仓信息技术股份有限公司&#xff08;以下简称人大金仓&a…