【Java】SE练习项目 —》图书管理系统

简介: 【Java】SE练习项目 —》图书管理系统

前言

这篇博客是在学习了一部分Java基础语法之后的练习项目,通过这个小项目的练习,对Java中的类和对象,抽象类和接口,面向对象的继承、多态和封装、组合等进行熟悉理解;抽象出不同的对象,将对象进行合理的设计,完成对象之间的交互,面向对象进行编程。

1. 项目需求

图书管理系统,面向管理员和普通用户使用,对管理员的开放的功能有:添加图书,删除图书,查找图书,显示图书和退出程序等;对普通用户的开放的功能有:查找图书,借阅图书,归还图书和退出程序。

2. 实现思路

先抽象提取出不同的对象,首先想到的对象是用户和书,

用户可分为管理员和普通用户,将管理员和普通用户共有的属性设置为一个父类User,管理员和普通用户继承User,可以先将父类设置为普通类,在写码过程如果合适可以修改为抽象类;

系统对书进行管理,书本身就可以抽象为一个对象;对多本书进行操作管理,书架也可以抽象为一个对象;所以书和书架用两个类来实现,书架可以设计为一个数组;

这里系统对书进行管理,其实就是对书架对应数组进行操作,不同的操作可以通过一个标准去实现,也就是可以定义一个接口,每一个操作类去实现这个接口,完成向上转型,通过接口实现多态;

然后写代码的过程中思考完善各个对象的成员,最终实例化对象,通过不同对象之间的交互完成管理系统。

3. 代码实现

包的设计

73d8c9be8b2a4960a39693770de0ac9a.png

book包

Book类

package book;
public class Book {
    private String name;//书名
    private String author;//书的作者
    private int price;//书的价格
    private String type;//书的类型
    private boolean borrowed;//是否被借出,默认false
    public Book(String name, String author, int 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 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 getBorrowed() {
        return borrowed;
    }
    public void setBorrowed(Boolean borrowed) {
        this.borrowed = borrowed;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", borrowed=" + ((borrowed==true) ? "已借出" : "未借出") +
                '}';
    }
}

BookList类

package book;
public class BookList {
    private Book[] books = new Book[100];
    private int usedsize;
    //书架当中默认有三本书
    public BookList() {
        this.books[0] = new Book("三国演义","罗贯中",66,"小说");
        this.books[1] = new Book("西游记","吴承恩",68,"小说");
        this.books[2] = new Book("红楼梦","曹雪芹",64,"小说");
        this.usedsize = 3;
    }
    public int getUsedsize() {
        return usedsize;
    }
    public void setUsedsize(int usedsize) {
        this.usedsize = usedsize;
    }
    public Book getBooks(int pos){
        return this.books[pos];
    }
    public void setBooks(Book book, int pos) {
        this.books[pos] = book;
    }
}

operations包

IOperation接口

package operations;
import book.BookList;
public interface IOperation {
    void work(BookList bookList);
}

AddOperation类

package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书");
        //输入图书信息
        System.out.println("输入新增图书名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("输入新增图书作者:");
        String author = scanner.nextLine();
        System.out.println("输入新增图书价格:");
        int price = scanner.nextInt();
        scanner.nextLine();
        System.out.println("输入新增图书类型:");
        String type = scanner.nextLine();
        Book book = new Book(name, author, price, type);
        //获取存书位置
        int currentSize = bookList.getUsedsize();
        //把书放到书架(数组)
        bookList.setBooks(book, currentSize);
        //书的总数加1
        bookList.setUsedsize(currentSize+1);
        System.out.println("添加成功!");
    }
}

BorrowOperation类

package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        System.out.println("输入要借阅图书的名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedsize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if (name.equals(book.getName())){
                if(book.getBorrowed()){
                    System.out.println("该书已经被借出!");
                    return;
                }else {
                    book.setBorrowed(true);
                    System.out.println("借阅成功!");
                    return;
                }
            }
        }
        System.out.println("没有找到你要借阅的书");
    }
}

DelOperation类

package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        System.out.println("输入要删除图书的名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedsize();
        //找到并记录要删除书的下标
        int index = -1;
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if (name.equals(book.getName())){
                index = i;
                break;
            }
        }
        if(-1 == index) {
            System.out.println("没有找到要删除的这本书!");
        }else {
            for (int i = index; i < currentSize-1; i++) {
                Book book = bookList.getBooks(i+1);
                bookList.setBooks(book, i);
            }
            //每次删除,都要将原来最后一本书位置的引用置空
            bookList.setBooks(null,currentSize-1);
            bookList.setUsedsize(currentSize-1);
            System.out.println("删除成功");
        }
    }
}

DisplayOperation类

package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        int currentSize = bookList.getUsedsize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            System.out.println(book);
        }
    }
}

ExitOperation类

package operations;
import book.BookList;
public class ExitOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
        System.exit(0);
    }
}

FindOperation类

import book.Book;
import book.BookList;
import java.util.Scanner;
public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        System.out.println("输入要查找图书的名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedsize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if (name.equals(book.getName())){
                System.out.println("找到了,该书信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到这本书!");
    }
}

ReturnOperation类

package operations;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        System.out.println("输入要归还图书的名称:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        int currentSize = bookList.getUsedsize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBooks(i);
            if (name.equals(book.getName())){
                if(book.getBorrowed()){
                    book.setBorrowed(false);
                    System.out.println("归还成功!");
                    return;
                }else {
                    System.out.println("该书未借出!");
                    return;
                }
            }
        }
        System.out.println("没有找到你要归还的书");
    }
}

user包

User类

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

AdminUser类

package user;
import operations.*;
import java.util.Scanner;
public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.iOperation = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation()
        };
    }
    @Override
    public int menu() {
        System.out.println("---------------------------------");
        System.out.println("Hello 管理员:>"+""+name+" 欢迎来到图书管理系统!");
        System.out.println("      1.查找图书  2.新增图书");
        System.out.println("      3.删除图书  4.显示图书");
        System.out.println("           0.退出系统");
        System.out.println("---------------------------------");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

NormalUser类

package user;
import operations.*;
import java.util.Scanner;
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperation = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }
    @Override
    public int menu() {
        System.out.println("---------------------------------");
        System.out.println("Hello 用户:>"+name+" 欢迎来到图书管理系统!");
        System.out.println("      1.查找图书  2.借阅图书");
        System.out.println("      3.归还图书  0.退出系统");
        System.out.println("---------------------------------");
        System.out.println("请输入你的操作:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

Main类

import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
public class Main {
    public static User login(){
        System.out.println("请输入你的姓名:");
        Scanner scanner = new Scanner(System.in);
        String userName = scanner.nextLine();
        System.out.println("请确认你的身份:> |1->管理员|0->普通用户|");
        int choice = scanner.nextInt();
        if(1==choice){
            return new AdminUser(userName);
        }else{
            return new NormalUser(userName);
        }
    }
    public static void main(String[] args) {
        //准备数据
        BookList bookList = new BookList();
        //登录
        User user = login();
        while (true) {
            int choice = user.menu();
            user.doOperation(choice, bookList);
        }
    }
}

4. 实现效果

管理员

image.png

普通用户

image.png

目录
相关文章
|
10天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
6天前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
42 17
|
28天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
126 26
|
2月前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
65 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
2月前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
2天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
34 17
|
13天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
15天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
15天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
15天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
41 3