JAVA学习记录(十三)—— 图书管理系统

该系统总共有以下这么多个部分

在这里插入图片描述

一、book文件夹下:
  • Book中有每一本书得信息,与这些信息的Get和Set方法,还有对于书的toString方法
package 一月十八日.图书管理系统.book;

public class Book {
    private String name;    //书名
    private String author;  //作者
    private int price;      //价格
    private String type;    //类型
    private boolean status; //状态 -》 默认未借出

    // 构造方法
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    // Get、Set方法
    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 isStatus() {
        return status;
    }
    public void setStatus(boolean status) {
        this.status = status;
    }
    // toString方法
    @Override
    public String toString() {
        return "book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                //", status=" + status +
                ((status == true) ? " 借出 " : " 未借出 ") +
                '}';
    }
}
  • BookList这里相当于一个书架,其实是由顺序表的形式实现的
package 一月十八日.图书管理系统.book;

public class BookList {
    // 书架,就相当于一个顺序表
    private Book[] books;
    private int usedSize;

    // 提供一个构造方法
    public BookList() {
        this.books = new Book[10]; // 最多放10本书
        // 先给里面放上三本书
        books[0] = new Book("三国演义","罗贯中",72,"小说");
        books[1] = new Book("西游记","吴承恩",52,"小说");
        books[2] = new Book("水浒传","施耐庵",62,"小说");
        this.usedSize = 3;
    }
    // 尾插法
    public void setBooks(int pos, Book book){
        this.books[pos] = book;
    }

    public Book getBook(int pos){
        return this.books[pos];
    }
    public int getUsedSize() {
        return usedSize;
    }
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
}
二、Operation文件夹下:
  • 这里实现了诸多方法,都是对顺序表进行操作的,且他们都是调用了IOperation这个接口
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.BookList;
// Operation下的操作都是针对BookList进行操作的
public interface IOperation {
    void work(BookList bookList);
}
  • 这之后的 增删查改 都是对上面这个接口的work进行了重写,以实现对应的操作,这里我将它们写在一起,实际中应该独立出一个.java文件
//AddOperation
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.Book;
import 一月十八日.图书管理系统.book.BookList;
import java.util.Scanner;

public class AddOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("添加书籍");

        Scanner scanner = new Scanner(System.in);
        // 图书都在bookList中
        // 想要放一本书,需要书的 名字 作者 价格 种类
        System.out.println("请输入图书的名字");
        String name = scanner.nextLine();
        System.out.println("请输入图书的作者");
        String autor = scanner.nextLine();
        System.out.println("请输入图书的价格");
        int price = scanner.nextInt();
        System.out.println("请输入图书的种类");
        String type = scanner.next();

        // 将输入的这些元素组合成一本书
        Book book = new Book(name,autor,price, type);
        // 将当前这本book放在顺序表的最后一位
        // 首先得到当前顺序表的元素个数,即书架上有多少书
        int currentSize = bookList.getUsedSize();
        // 然后把数添加到useSize位置
        bookList.setBooks(currentSize, book);
        bookList.setUsedSize(currentSize + 1);
    }
}
//==========================================================
//DelOperation
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.Book;
import 一月十八日.图书管理系统.book.BookList;
import java.util.Scanner;

public class DelOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("删除书籍");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除图书的名字");
        String name = scanner.nextLine();
        int i = 0;
        for (; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                break;
            }
        }
        if(i >= bookList.getUsedSize()){
            System.out.println("没有要删除的书");
            return;
        }
        int pos = i;
        for(int j = pos; j < bookList.getUsedSize() - 1; j++){
            Book book = bookList.getBook(j+1);
            bookList.setBooks(j,book);
        }
        int currenSize = bookList.getUsedSize();
        bookList.setUsedSize(currenSize - 1);
        System.out.println("删除完毕");
    }
}
//==========================================================
//FindOperation 
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.Book;
import 一月十八日.图书管理系统.book.BookList;
import java.util.Scanner;

public class FindOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("查找书籍");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请要查找图书的名字");
        String name = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            // 我们首先拿到i下标的这本书
            Book book = bookList.getBook(i);
            // 之后进行比较判断
            if(book.getName().equals(name)) {  // 此处name是我们输入进来要查找的书的名字
                                               // 每一把i下标的书的名字与输入的name进行v比较
                System.out.println("有这本书!");
                System.out.println(book);      // 打印当前i下标book引用的所有内容
                return;
            }

        }
        System.out.println("没有这本书!");
    }
}
//==========================================================
//DisplayOperation
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.Book;
import 一月十八日.图书管理系统.book.BookList;

public class DisplayOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("展示书籍");
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getBook(i);
            System.out.println(book);
        }
    }
}
//==========================================================
//BorrowOperation 
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.Book;
import 一月十八日.图书管理系统.book.BookList;

import java.util.Scanner;

public class BorrowOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅书籍");
        // 借阅书籍,首先要找到这本书
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要借阅图书的名字");
        String name = scanner.nextLine();

        for (int i = 0; i < bookList.getUsedSize(); i++) {
            // 我们首先拿到i下标的这本书
            Book book = bookList.getBook(i);
            // 之后进行比较判断
            if(book.getName().equals(name)) {  // 此处name是我们输入进来要查找的书的名字
                // 每一把i下标的书的名字与输入的name进行v比较
                System.out.println("有这本书!");
                // 此时就要把这本书的借阅状态改为true,就表示以借阅出去
                book.setStatus(true);
                return;
            }

        }
        System.out.println("没有您要借阅的书!");
    }
}
//==========================================================
//ReturnOperation 
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.Book;
import 一月十八日.图书管理系统.book.BookList;
import java.util.Scanner;

public class ReturnOperation implements IOperation{
    @Override
    public void work(BookList bookList) {
        System.out.println("归还书籍");

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

        for (int i = 0; i < bookList.getUsedSize(); i++) {
            // 我们首先拿到i下标的这本书
            Book book = bookList.getBook(i);
            // 之后进行比较判断
            if(book.getName().equals(name)) {  // 此处name是我们输入进来要查找的书的名字
                // 每一把i下标的书的名字与输入的name进行v比较
                System.out.println("有这本书!");
                // 此时就要把这本书的借阅状态改为true,就表示以借阅出去
                book.setStatus(false);
                return;
            }

        }
        System.out.println("没有您要归还的这本书!");
    }
}
//==========================================================
//ExitOperation 
package 一月十八日.图书管理系统.opteration;
import 一月十八日.图书管理系统.book.BookList;
public class ExitOperation implements IOperation{

    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统");
        System.exit(1);
    }
}
三、user文件夹下:
  • 该文件下放了一个父类User与AdminUser与NormalUser两个子类
  • 用户类
package 一月十八日.图书管理系统.user;
import 一月十八日.图书管理系统.book.BookList;
import 一月十八日.图书管理系统.opteration.IOperation;

public abstract class User {
    // 创建用户类
    public String name;
    public User(String name){
        this.name = name;
    }
    public abstract int menu();
    // 给一个存放操作方法的数组
    public IOperation[] operations; //有了这个数组后,子类也继承了它

    // 写一个方法
    // choice 是所做的选择
    public void doOperation (int choice, BookList bookList){
        this.operations[choice].work(bookList);
        // this.operation 表示的是当前这个操作功能的数组
        // 选择所要执行的操作,即choice作为操作数组的下标
        // 然后调用接口中的work
    }
}
  • 管理员类
package 一月十八日.图书管理系统.user;
import 一月十八日.图书管理系统.opteration.*;
import java.util.Scanner;

// 管理员
public class AdminUser extends User{

    public AdminUser(String name) {
        super(name);
        this.operations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DelOperation(),
                new DisplayOperation(),

        };
    }
    // 管理员和普通用户的菜单不相同,所以两个菜单需要分别实现

    @Override
    public int menu() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("管理员菜单");
        System.out.println("================================");
        System.out.println("hello " + this.name + ",欢迎使用图书馆系统");
        System.out.println("1、查找图书");
        System.out.println("2、新增图书");
        System.out.println("3、删除图书");
        System.out.println("4、显示图书");
        System.out.println("0、退出系统");
        System.out.println("================================");
        int choice = scanner.nextInt();
        return choice; //返回要执行对应的操作
    }
}

  • 普通用户类
package 一月十八日.图书管理系统.user;
import 一月十八日.图书管理系统.opteration.*;
import java.util.Scanner;

// 普通用户
public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.operations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation(),

        };
    }

    @Override
    public int menu() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("普通用户菜单");
        System.out.println("================================");
        System.out.println("hello " + this.name + ",欢迎使用图书馆系统");
        System.out.println("1、查找图书");
        System.out.println("2、借阅图书");
        System.out.println("3、归还图书");
        System.out.println("0、退出系统");
        System.out.println("================================");
        int choice = scanner.nextInt();
        return choice;
    }
}

四、main函数部分:
package 一月十八日.图书管理系统;

import 一月十八日.图书管理系统.book.BookList;
import 一月十八日.图书管理系统.user.AdminUser;
import 一月十八日.图书管理系统.user.NormalUser;
import 一月十八日.图书管理系统.user.User;

import java.util.Scanner;

/** 面向对象编程
 *  1、找对象
 *  2、创建对象
 *  3、使用对象
 *
 *  书架可以使用顺序表 BookList
 *  书:
 *  人: 管理员、普通用户
 *  操作: 增删查改
 *  */
public class Main {
    public static User login(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1->管理员 0->普通用户");
        int choice = scanner.nextInt();
        if(choice == 1){
            return new AdminUser(name);
        }else{
            return new NormalUser(name);
        } //返回值应当为User类型,因为这两个都是继承User
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        // 1、首先进行登录
        User user = login();
        while(true) {
            // 2、选择完身份
            // user.menu 就会根据登陆时选择的身份不同打印出不同的菜单
            // 菜单中需要用户提供输入指令对菜单上的操作进行选择,当用户输入指令后,将用户所选择的指令保存到choice中
            int choice = user.menu();
            // 3、根据用户所选择的choice指令不同,将此指令运用在bookList上进一步调用对应的work方法
            //    这个work方法调用谁的? 怎么调用? 交给doOperation
            //    若当前user引用的是AdminUser,则有Admin去调用doOperation
            user.doOperation(choice, bookList);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值