实战项目——用Java实现图书管理系统

前言

首先既然是管理系统,那咱们就要实现以下这几个功能了-->

分析

1.首先是用户分为两种,一个是管理员,另一个是普通用户,既如此,可以定义一个用户类(user),在定义管理员类,普通用户类去继承。

2.还有就是书这个对象,首先是书的属性(书名,作者,价格,种类,是否借出),这可以定义成一个Book类,其实就是存储这些新的容器-- 书架类(Booklist)

3.最后这些功能,仔细观察,由于身份不同,操作也不同,一般来讲,我们可以把对应的方法放到对应的类当中去,但这次用接口也可以巧妙实现

分模块进行编码

book包

为了方便查看,就把这两个类放进一个book的包里。

Book类

复制代码
package book;

public class Book {
    private String name;//姓名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isLead;//是否被借出

    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 isLead() {
        return isLead;
    }

    public void setLead(boolean lead) {
        isLead = lead;
    }
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

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

在这个类中,把书的属性成员定义为私有,通过公共成员函数去访问和调用,最后重写toString 方法来表示输出。

Booklist类

复制代码
package book;

public class Booklist {
    private Book[] books =new Book[10];
    private int usedSize;//记录存放次数

    public Booklist() {
        books[0]=new Book("红楼梦","曹雪芹",25,"小说");
        books[1]=new Book("月华","小明",27,"小说");
        books[2]=new Book("多少","小花",20,"小说");
        this.usedSize=3;
    }

    public boolean isFull(){//判断书架是否满
        if(this.usedSize==books.length){
            return true;
        }else{
            return false;
        }
    }
    public int getUsedSize() {//获取存了多少本书
        return usedSize;
    }
    //设定书的数量
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public Book getBooks(int pos) {//获取书架中pos位置书的信息
        return books[pos];
    }
    //把新增的图书信息放到pos位置上去
    public void setBooks(int pos,Book book) {
        books[pos]=book;
    }

}

在这个书架类中,定义一个容量为10的对象数组来存储书的信息,事先存入三本书,同时usedSize 用来记录书的数量,而后面的方法则与实现对应的功能相关。且往后细看~接口类

复制代码
package operater;

import book.Booklist;

public interface IOperation {
    void work(Booklist booklist);
}

在这个接口里定义了一个方法 ​work​,该方法需要一个 ​Booklist​ 对象作为参数。任何实现 ​IOperation​ 接口的类都必须提供 ​work​ 方法的具体实现。这样一来就方便不同的用户进行操作了。

User包

user类

复制代码
package User;

import book.Booklist;
import operater.IOperation;

// 定义一个抽象类 user,表示用户
public abstract class user {
    protected String name;

    // 构造方法,初始化用户名称
    public user(String name) {
        this.name = name;
    }

    //抽象方法,显示菜单并返回用户选择的操作编号
    public abstract int menu();

    //存储用户可以执行的操作数组
    protected IOperation[] iOperations;

    //根据用户选择执行相应的操作
    public void DoIoperation(int choice, Booklist booklist) {
        //调用用户选择的操作的 work 方法
        this.iOperations[choice].work(booklist);
    }
}

因为身份不同,所以显示的菜单也不同,所以便声明一个抽象方法 menu(),同时定义一个操作数组,来进行对应的操作,如图

普通用户类(Normaluser)

复制代码
package User;

import operater.*;

import java.util.Scanner;

public class Normaluser extends user{
    //重写构造方法
    public Normaluser(String name) {
        super(name);
       //根据不同的输入进行对应的操作,已经方法按顺序放入数组,所以位置别搞错了
        this.iOperations=new IOperation[]{
          new Exit(),
          new Find(),
          new Borrow(),
          new Return()
        };
    }

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

    }
}

管理员类(Adminuser)

复制代码
package User;

import operater.*;

import java.util.Scanner;

public class Adminuser extends user{
    public Adminuser(String name) {
        super(name);
        this.iOperations=new IOperation[]{
                new Exit(),
                new Find(),
                new Add(),
                new Del(),
                new Show()
        };
    }
    public int menu(){
        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 choice=scanner.nextInt();
        return choice;
    }
    }

operater包

Add类

复制代码
package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Add implements IOperation{
    public void work(Booklist booklist1){

        if(booklist1.isFull()){
            System.out.println("书架已满,不能新增!");
        }
        System.out.println("新增图书");
        System.out.println("请输入你要新增的图书的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        System.out.println("请输入你要新增的图书的作者:");
        String bookAuthor= scanner.nextLine();

        System.out.println("请输入你要新增的图书的价格:");
        int bookPrice = scanner.nextInt();
        scanner.nextLine();

        System.out.println("请输入你要新增的图书的类型:");
        String bookType = scanner.nextLine();

        Book book=new Book(bookName,bookAuthor,bookPrice,bookType);

        int currentSize=booklist1.getUsedSize();//新增图书的位置其实就是i本书的位置
        booklist1.setBooks(currentSize,book);
        booklist1.setUsedSize(currentSize+1);//书的数量+1
        System.out.println("成功添加图书");
    }
}

在新增图书的过程中,要分别添加书的属性才行,这时切不可直接用booklist,这时类对象,不是数组,创建一个对象数组book,之前Booklist中方法便派上用场, 看图就更好理解了~

Borrow类

复制代码
package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Borrow implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("借阅图书");
        System.out.println("请输入你要借阅的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        //找到要借阅的书的下标
        for (int i=0; i < booklist1.getUsedSize() ; i++) {
            Book book1=booklist1.getBooks(i);
            if(book1.getName().equals(bookName)) {
                book1.setLead(true);
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("借阅失败!");
    }
    }

借阅图书其实和删除差不多,只要改变状态为已借出。

Del类

复制代码
package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Del implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("删除图书");
        System.out.println("请输入你要删除的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();
        int current=booklist1.getUsedSize();

        int pos=-1;
        int i = 0;
        //找到要删除的书的下标
        for (; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
            if(bookName.equals(book1.getName())) {
                //System.out.println("找到了");
                pos=i;
            }
        }
        if(pos>=current){
            System.out.println("没有你要找的书!");
    }
        //开始删除
        for (int j = pos; j <current-1; j++) {
           // booklist1[j]=booklist1[j+1];不能直接用类对象

            Book book= booklist1.getBooks(j+1);
            booklist1.setBooks(j,book);
        }
        booklist1.setUsedSize(current-1);
        booklist1.setBooks(current-1,null);
        System.out.println("删除成功!");

    }
}

删除图书,首先要找到要删除图书的下标pos, 找到后要把后面的图书全都往前移动一格,从pos位置开始遍历,将j+1位置的图书存放到book对象中去,在调用setBook方法传给j位置。后面的位置设置成null,同时更新书的数量~

Exit类

复制代码
package operater;

import book.Booklist;

public class Exit implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("退出系统");

        //避免退出系统后内存被回收
        int current=booklist1.getUsedSize();
        for (int i = 0; i < current ; i++) {
            booklist1.setBooks(i,null);
        }

        System.exit(0);

    }
}

直接调用系统的退出即可~

Find类

复制代码
package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Find implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("查找图书");
        System.out.println("请输入你要查找的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();
        
        int current=booklist1.getUsedSize();
        for (int i = 0; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
            if(bookName.equals(book1.getName())) {
                System.out.println("找到了");
                System.out.println(book1);
                return;
            }
        }
            System.out.println("没找到这本书!");
        }
}

Return类

复制代码
package operater;

import book.Book;
import book.Booklist;
import java.util.Scanner;

public class Return implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("归还图书....");
        System.out.println("请输入你要归还的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        //找到要归还的书的下标
        for (int i=0; i < booklist1.getUsedSize() ; i++) {
            Book book1=booklist1.getBooks(i);
            if(book1.getName().equals(bookName)) {
                book1.setLead(false);
                System.out.println("归还成功!");
                return;
            }
        }
        System.out.println("归还失败!");
    }
    }

Show类

复制代码
package operater;

import book.Book;
import book.Booklist;

public class Show implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("展示图书");
        int current=booklist1.getUsedSize();

        for (int i = 0; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
                System.out.println(book1);
        }
    }
}

这三个其实是大同小异的,都是循环遍历再进行对应的操作,这里主要记住的是String类型的数据比较不能直接用==,而是要用equals()方法。

看到最后,如果觉得文章写得还不错,++希望可以给我点个小小的赞++,您的支持是我更新的最大动力

相关推荐
腾讯TNTWeb前端团队6 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
mghio8 小时前
Dubbo 中的集群容错
java·微服务·dubbo
范文杰10 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪10 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪10 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy11 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom11 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom11 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom11 小时前
React与Next.js:基础知识及应用场景
前端·面试·github