实战项目——用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()方法。

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

相关推荐
lxyzcm几秒前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
轻口味13 分钟前
【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
前端·华为·harmonyos
alikami16 分钟前
【若依】用 post 请求传 json 格式的数据下载文件
前端·javascript·json
古希腊掌管学习的神27 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师28 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
V+zmm1013434 分钟前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
就爱学编程36 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
吃杠碰小鸡1 小时前
lodash常用函数
前端·javascript
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
emoji1111111 小时前
前端对页面数据进行缓存
开发语言·前端·javascript