当前位置: 首页 > article >正文

Java基础(7)图书管理系统

 

目录

1.前言

2.正文

2.1思路

2.2Book包

2.3people包

2.4operation包

2.5主函数

3.小结


1.前言

哈喽大家好吖,今天来给前面Java基础的学习来一个基础的实战,做一个简单的图书管理系统,这里边综合利用了我们之前学习到的类和对象,继承与多态以及抽象类和接口等许多重要的概念以及知识,事不宜迟,让我们开始吧。

2.正文

2.1思路

在正式开始图书管理系统的代码完成前,我们需要先对一系列所需要创建的对象,各个对象之间的关系,如何实现这种关系,都要有一个提前的规划,下面我通过PlantUML生成了图书管理系统的基础框架,我据图一一解释。

5bb1025dd32d46988dc8d2955c31fb72.png

在图书管理系统里面,会参与各种行为的对象都有哪些呢?有书本,借阅者,管理员,具体的借阅功能等,所以我们一共有四个包,分别为:

  1. Book包
  2.  

    operation包

  3. people

  4. 主函数所在包

我们把各个模块把它分成各个包来进行封装,是代码的条理性更好。

2.2Book包

在Book包中,我们创建了俩个对象,一个是book对象,另一个书用于存放书的bookshelf对象,具体实现如下:

package Book;

public class Book {
    private String bookName;
    private String writer;
    private String classification;
    private Boolean borrow;

    public Book(String bookName, String writer, String classification, Boolean borrow) {
        this.bookName = bookName;
        this.writer = writer;
        this.classification = classification;
        this.borrow = borrow;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getWriter() {
        return writer;
    }

    public void setWriter(String writer) {
        this.writer = writer;
    }

    public String getClassification() {
        return classification;
    }

    public void setClassification(String classification) {
        this.classification = classification;
    }

    public Boolean getBorrow() {
        return borrow;
    }

    public void setBorrow(Boolean borrow) {
        this.borrow = borrow;
    }
}

因为成员的访问权限我们设置为private,所以我们需要各种getter和setter方法来调用成员变量,其中getter和setter方法是可以通过系统快速生成的,即按住alt+insert可以快速实现该方法。

下面是Bookshelf对象:

package Book;

public class bookShelf {
    private Book[] books = new Book[10];
    private int bookNum = 0;

    public bookShelf() {
        this.books[0] = new Book("三国演义","罗贯中","历史演义",null);
        this.books[1] = new Book("三体","刘慈欣","科幻小说",null);
        this.books[2] = new Book("西游记","吴承恩","小说",null);
        this.bookNum = 3;
    }

    public Book getBooks(int pos) {
        return books[pos];
    }

    public void setBooks(Book book,int pos) {
        this.books[pos] = book;
    }

    public int getBookNum() {
        return bookNum;
    }

    public void setBookNum(int bookNum) {
        this.bookNum = bookNum;
    }
}

我们在bookshelf的构造方法中提前初始化里三个对象,即可以理解为图书馆中原本就存放的书。创建一个bookNum变量用于记录当前所存放的图书数量。

2.3people包

在people包中我们通过继承来实现,首先创建了一个person抽象类用于抽取管理员和借阅者的共同属性以及方法,再分别实现子类Admin与normalUser。

person类:

package People;

import operation.*;
import Book.*;

public abstract class Person {
    public String name;
    public Operation[] iOperations;

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

    public abstract int menu();

    public void finishOPerations(int choice,bookShelf bookShelf) {
        iOperations[choice].work(bookShelf);
    }
}

共同属性姓名不必多说,还额外创建了一个功能数组,另外创建一个菜单方法用于打印各自的菜单,最后还有finishOPeration方法,通过这个功能数组即可实现输入菜单对应选项进入对应功能的操作。

Admin类:

package People;

import operation.*;

import java.util.Scanner;

public class Admin extends Person {
    public Admin(String name) {
        super(name);
        this.iOperations = new Operation[]{
                new edit(),
                new showBook(),
                new findBook(),
                new addBook(),
                new delBook()
        };
    }

    @Override
    public int menu() {
        System.out.println("*******************");
        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("*******************");

        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }


}

在这个构造方法中需要对功能数组中添加功能方法,下文同样。

normalUser类:

package People;

import operation.*;

import java.util.Scanner;

public class normalUser extends Person {
    @Override
    public int menu() {
        System.out.println("*******************");
        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("*******************");

        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }

    public normalUser(String name) {
        super(name);
        this.iOperations = new Operation[]{
                new edit(),
                new showBook(),
                new findBook(),
                new borrowBook(),
                new returnBook()
        };
    }

}

2.4operation包

在这个包里面,我们尝试把各种人物的行为全都各个创建成对象来进行分别实现,这里我们采用了接口,即在这个包里接了这个接口的其他对象,都需要将接口中的方法重写,来达到方法都得到实现的目的。

首先是接口:

package operation;

import Book.bookShelf;

public interface Operation {
    public void work(bookShelf bookShelf);
}

接口中的方法不需要具体实现。

接下来就是各种需要实现的对象与对象之间的逻辑了,如借阅图书,归还图书,查询图书,退出系统等,我一一进行讲解:

findBook类:

package operation;

import Book.Book;
import Book.bookShelf;
import java.util.Scanner;

//找书先要判断是否有书,若有则借,若无则直接返回
public class findBook implements Operation{

    public void work(bookShelf bookShelf){
        Scanner scanner = new Scanner(System.in);
        System.out.println("查找图书");
        String name = scanner.nextLine();
        for(int i = 0;i < bookShelf.getBookNum();i++){
            if(name.equals(bookShelf.getBooks(i).getBookName())){
                System.out.println("找到了《" + name + "》书");
                return;
            }
        }
        System.out.println("未找到"+ "《"+ name + "》");
    }
}

通过遍历来实现,若遍历到有此书则打印找到了并返回,若能走完遍历则未找到。

showBook类:

package operation;


import Book.bookShelf;


public class showBook implements Operation{

    public void work(bookShelf bookShelf) {
        System.out.println("显示图书");

        //遍历书架
        for (int i = 0; i < bookShelf.getBookNum(); i++) {
            System.out.println(bookShelf.getBooks(i));
        }
    }

}

这个遍历打印即可,没什么特殊。

addBook类:

//新增图书,先判断该书是否存在,再实例化一个书对象添加进bookshelf,并将bookNum增加

package operation;

import Book.Book;
import Book.bookShelf;
import java.util.Scanner;

public class addBook implements Operation {
    @Override
    public void work(bookShelf bookShelf) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入添加的图书名字");
        String name = scanner.nextLine();

        System.out.println("请输入添加的图书作者名字");
        String writer = scanner.nextLine();

        System.out.println("请输入添加的图书分类");
        String classfication = scanner.nextLine();

        //遍历判断是否有相同书
        for(int i = 0;i < bookShelf.getBookNum();i++){
            if(name.equals(bookShelf.getBooks(i).getBookName())){
                System.out.println("书库里已有该书");
                return;
            }
        }

        //新增图书
        bookShelf.setBooks(new Book(name,writer,classfication,false), bookShelf.getBookNum());
        bookShelf.setBookNum(bookShelf.getBookNum() + 1);//新增图书加1
        System.out.println("书《" + name +"》已添加成功");
    }
}

新增图书是属于Admin对象的类方法,先输入要添加的书的各个成员变量的信息,再遍历寻找有无相同书,若没有则添加。

delBook类:

//删除一本书,现需要查找是否有该书,删书即使后一个覆盖前一个即可

package operation;

import Book.Book;
import Book.bookShelf;
import java.util.Scanner;

public class delBook implements Operation{
    @Override
    public void work(bookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你需要删除的书");
        String name = scanner.nextLine();

        for(int i = 0;i < bookShelf.getBookNum();i++){
            if(name.equals(bookShelf.getBooks(i).getBookName())){
                for(int j = i;j < bookShelf.getBookNum() - 1;j++){
                    bookShelf.setBooks(bookShelf.getBooks(j + 1),j);
                }
                bookShelf.setBookNum(bookShelf.getBookNum() - 1);
                System.out.println("该书已删除完毕");
                return;
            }
        }
        System.out.println("不存在该书");
    }
}

也是遍历寻找输入的书,若找到删除的书,则将后面的书一一往前覆盖即可实现删除功能,最后不要忘了bookNum要进行减一操作。

borrowBook类:

package operation;

import Book.Book;
import Book.bookShelf;
import java.util.Scanner;

public class borrowBook implements Operation{
    @Override
    public void work(bookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要借阅书的名字");
        String name = scanner.nextLine();

        for(int i = 0;i < bookShelf.getBookNum();i++){
            if(name.equals(bookShelf.getBooks(i).getBookName())){
                bookShelf.getBooks(i).setBorrow(true);//设置借阅状态
                System.out.println("书《" + name +"》借阅成功");
                return;
            }
        }
        System.out.println("不存在该书,借阅失败");
    }
}

还是先遍历找书,若有则改变图书的借阅状态,若无则借阅失败。

returnBook类:

package operation;

import Book.bookShelf;

import java.util.Scanner;

public class returnBook implements Operation{
    @Override
    public void work(bookShelf bookShelf) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要归还书的名字");
        String name = scanner.nextLine();

        for(int i = 0;i < bookShelf.getBookNum();i++){
            if(name.equals(bookShelf.getBooks(i).getBookName())){
                bookShelf.getBooks(i).setBorrow(false);//设置借阅状态
                System.out.println("书《" + name +"》归还成功");
                return;
            }
        }
        System.out.println("不存在该书,归还失败");
    }
}

和借书操作如出一辙,唯一的区别就是状态改变的true与false不同。

edit类:

package operation;

import Book.bookShelf;

public class edit implements Operation{
    @Override
    public void work(bookShelf bookShelf) {
        for(int i = 0;i < bookShelf.getBookNum();i++){
            bookShelf.setBooks(null,i);
        }

        bookShelf.setBookNum(0);

        System.exit(0);
    }
}

 实现退出功能,先将储存的图书删除,将bookNum清零,最后退出系统。

2.5主函数

在主函数中同样,我们把登陆(即选择自己是管理员还是借阅者身份的选择)的login功能也通过单独的类方法来进行实现。

Login类:

package System;

import People.Admin;
import People.Person;
import People.normalUser;

import java.util.Scanner;

public class Login{
    public Person loginIn(){
        System.out.println("*欢迎来到图书管理系统**");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的名字");
        String name = scanner.nextLine();
        System.out.println("*******************");
        System.out.println("******1.管理员******");
        System.out.println("******2.普通用户****");
        System.out.println("请输入你的身份");
        if(scanner.nextInt() == 1){
            return new Admin(name);
        }else{
            return  new normalUser(name);
        }
    }
}

最后就是主函数,这个时候主函数就会比较整洁明了,记得要分别实例化书架bookShelf对象以及Login登陆对象了。

package System;

import Book.*;
import People.*;

public class system {

    public static void main(String[] args) {
        bookShelf bookShelf = new bookShelf();
        Login login = new Login();
        Person person = login.loginIn();

        while(true){

            int choice = person.menu();

            person.finishOPerations(choice,bookShelf);
        }
    }

}

这样我们图书管理系统就完成了! 

3.小结

今天的图书管理系统的分享到这里就结束了,喜欢的小伙伴不要忘了点一手关注再走哦,欢迎大家在评论区多多交流哦。

 

 

 


http://www.kler.cn/news/366578.html

相关文章:

  • 群控系统服务端开发模式-应用开发-业务架构逻辑开发准备工作
  • 2024年妈杯MathorCup大数据竞赛A题超详细解题思路
  • 【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)
  • [RK3566-Android11] 使用SPI方式点LED灯带-JE2815/WS2812,实现呼吸/渐变/随音量变化等效果
  • 华为HCIE-OpenEuler认证详解
  • 如何使用gitlab切换分支
  • 网站渗透常识
  • Modern CMake 简明教程(8)- 集成Qt
  • lua while循环
  • Linux -- 共享内存(2)
  • 机器学习4
  • ESC服务器被暴力破解如何解决
  • Redis 主从同步 总结
  • 【大数据技术基础 | 实验五】ZooKeeper实验:部署ZooKeeper
  • LDAP 部署手册
  • 每日一题——第一百一十九题
  • 多线程——线程池
  • 数据安全领域的分类分级管理
  • 教学平台的信息化设计:Spring Boot实践
  • 光储充微电网:策略调度带领能源新未来---安科瑞 吴雅芳
  • 四,Linux基础环境搭建(CentOS7)- 安装Zookeeper
  • 【电商搜索】现代工业级电商搜索技术-亚马逊-经典的Item-to-Item协同推荐算法
  • 实验03分支---7-7 用天平找小球
  • Vue3 学习笔记(四)Vue3 入口文件之间的关系和流程
  • 面向对象与设计模式第一节:深入理解OOP
  • 使用IIS搭建PHP环境时遇到404错误怎么办?