目录

图书管理系统

思维导图

图书部分

每本具体书籍——Book

书架类——BookList

用户部分

User——用户类

NormalUser(普通用户)

AdminUser(管理员)

权限

操作书籍的接口——IOperation

显示当前书籍列表——ListAllBooksOperation

添加书籍——AddOperation

下架书籍——RemoveOperation

更新书籍——UpdateOperation

查找书籍——FindOperation

借阅书籍——BorrowOperation

归还书籍——ReturnOperation

主方法——程序的入口


图书管理系统

思维导图

图书部分

每本具体书籍——Book

package book_management.book;

/**
 * 每本书的对象
 */
public class Book {
    // 书名
    private String name;
    // 作者名
    private String author;
    // 书籍价格
    private Double price;
    // 书籍的类别
    private String type;
    // 书籍是否被借出,默认为false
    private boolean isBorrowed;

    public Book(String name, String author, Double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public Double getPrice() {
        return price;
    }

    public String getType() {
        return type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

书架类——BookList

package book_management.book;

import java.util.ArrayList;
import java.util.List;

/**
 * 书架
 */
public class BookList {
    // 书架就是保存书籍的,书本的个数不确定,要么用动态数组,要么使用链表
    private List<Book> books = new ArrayList<>();
    // 保存当前书架上所有书籍的名称,以后的操作就是根据书籍的名称来查找具体的Book对象
    // 一一对应的映射关系
    private List<String> booksName = new ArrayList<>();

    private int usedSize;

    public BookList() {
        // 产生一个书架对象时,默认上架的四本书籍
        books.add(new Book("三国演义", "罗贯中", 76.6, "小说"));
        books.add(new Book("水浒传", "施耐庵", 55.6, "小说"));
        books.add(new Book("西游记", "吴承恩", 44.6, "小说"));
        books.add(new Book("红楼梦", "曹雪芹&未知", 88.6, "小说"));
        //将当前这四本书的书名也添加到booksName的列表中
        booksName.add("三国演义");
        booksName.add("水浒传");
        booksName.add("西游记");
        booksName.add("红楼梦");
        this.usedSize = 4;
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public Book getBook(int i) {
        return this.books.get(i);
    }

    public void setBook(int i, Book book) {
        this.books.set(i, book);
    }

    public boolean contains(String booksName) {
        // 遍历booksName这个列表
        for (String str : this.booksName) {
            if (str.equals(booksName)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 添加书籍
     */
    public void addNewBook(String booksName, String author, double price, String type) {
        Book book = new Book(booksName, author, price, type);
        this.books.add(book);
        this.booksName.add(booksName);
        this.usedSize++;
    }

    /**
     * 下架书籍
     */
    public void removeBook(String booksName, BookList bookList) {
        int n = bookList.getUsedSize();
        int i = 0;
        int index = 0;
        for (; i < n; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(booksName)) {
                index = i;
                break;
            }
        }

        if (i == n) {
            System.out.println("对不起,没有找到您需要删除的书!");
            return;
        }
        //使用for循环让后一个位置的书前移一位
        for (int j = index; j < n - 1; j++) {
            Book book = bookList.getBook(j + 1);//得到j+1位置的书
            bookList.setBook(j, book);//将其设置为j位置
        }
        bookList.setUsedSize(n - 1);
        System.out.println("下架成功!");
    }

    /**
     * 更新书籍
     */
    public void updateBook(String booksName, String type, Boolean isBorrowed, double price, BookList bookList) {
        for (int i = 0; i < usedSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(booksName)) {
                book.setPrice(price);
                book.setType(type);
                book.setBorrowed(isBorrowed);
            }
        }
    }

    /**
     * 查找书籍
     */
    public void findBook(String booksName, BookList bookList) {
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(booksName)) {
                System.out.println("找到这本书的信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有这本书!");
    }

    /**
     * 归还书籍
     */
    public void returnBook(String booksName, BookList bookList) {
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            Book bookCur = bookList.getBook(i);
            if (bookCur.getName().equals(booksName)) {
                bookCur.setBorrowed(false);
                System.out.println("归还成功!");
                return;
            }
        }
        System.out.println("没有此书!归还失败");
    }

    /**
     * 借阅书籍
     */
    public void isBorrowed(String booksName, BookList bookList) {
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(booksName)) {
                book.setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("没有此书!借阅失败");
    }
}

用户部分

User——用户类

package book_management.user;
import book_management.book.BookList;
import book_management.operation.IOperation;
/**
 * 用户类
 */
public abstract class User {
    //用户名
    protected String name;
    // 对于书籍的操作权限,此时不确定用户类型,所以是个空数组,由子类来确定到底具备哪些权限
    protected IOperation[] operations;

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

    // 菜单,不同种类的用户菜单是不同的,根据菜单的返回值取得用户选择的操作
    protected abstract int menu();

    // 根据用户输入的指令来执行不同的操作
    public void doOperation(BookList bookList, int choice) {
        operations[choice - 1].work(bookList);
    }
}

不同用户操作管理系统的权限是不同的,抽象父类没法确定由定义子类时确定。

不同用户的菜单不同,由子类来确定,使用抽象方法。

NormalUser(普通用户)

package book_management.user;

import book_management.operation.IOperation;
import book_management.operation.impl.BorrowOperation;
import book_management.operation.impl.FindOperation;
import book_management.operation.impl.ListAllBooksOperation;
import book_management.operation.impl.ReturnOperation;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.operations = new IOperation[] {
                new ListAllBooksOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }

    @Override
    public int menu() {
        System.out.println("==================================");
        System.out.println("欢迎" + this.name + "登录图书管理系统");
        System.out.println("1.显示当前的书籍列表");
        System.out.println("2.查找书籍");
        System.out.println("3.借阅书籍");
        System.out.println("4.归还书籍");
        System.out.println("-1.退出系统");
        System.out.println("==================================");
        System.out.println("请输入您的选择:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

AdminUser(管理员)

package book_management.user;

import book_management.operation.IOperation;
import book_management.operation.impl.*;

import java.util.Scanner;

public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
        this.operations = new IOperation[]{
                new ListAllBooksOperation(),
                new AddOperation(),
                new RemoveOperation(),
                new UpdateOperation(),
                new FindOperation()
        };
    }

    @Override
    public int menu() {
        System.out.println("==================================");
        System.out.println("欢迎" + this.name + "登录图书管理系统");
        System.out.println("1.显示当前的书籍列表");
        System.out.println("2.增加书籍");
        System.out.println("3.下架书籍");
        System.out.println("4.更新书籍");
        System.out.println("5.查找书籍");
        System.out.println("-1.退出系统");
        System.out.println("==================================");
        System.out.println("请输入您的选择:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

权限

操作书籍的接口——IOperation

package book_management.operation;
import book_management.book.BookList;
import java.util.Scanner;

/**
 * 操作书籍的接口
 */
public interface IOperation {
    Scanner scanner = new Scanner(System.in);
    //在指定的书架上进行操作处理
    void work(BookList bookList);
}

显示当前书籍列表——ListAllBooksOperation

package book_management.operation.impl;

import book_management.book.Book;
import book_management.book.BookList;
import book_management.operation.IOperation;

/**
 * 展示当前的书籍列表操作
 */
public class ListAllBooksOperation implements IOperation {

    @Override
    public void work(BookList bookList) {
        System.out.println("此时您进行的是展示书籍列表的操作");
        //具体书籍在书架类中保存,我们调用的就是书架类提供的方法
        //套接口的最大目的就是做权限划分
        int size = bookList.getUsedSize();
        for (int i = 0; i < size; i++) {
            System.out.println(bookList.getBook(i));
        }
    }
}

添加书籍——AddOperation

package book_management.operation.impl;

import book_management.book.BookList;
import book_management.operation.IOperation;

import java.util.Scanner;

/**
 * 添加书籍操作
 */
public class AddOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("您现在进行的是添加书籍操作");
        System.out.println("请输入您要添加的书籍名称:");
        String booksName = scanner.nextLine();
        //假设书籍已经有这本书了
        if (bookList.contains(booksName)) {
            System.err.println("书籍在当前书架上已经存在了,无需添加");
        }
        System.out.println("请输入您要添加的书籍作者:");
        String author = scanner.nextLine();
        System.out.println("请输入您要添加的书籍类别:");
        String type = scanner.nextLine();
        System.out.println("请输入您要添加的书籍价格:");
        double price = scanner.nextDouble();
        // 吃掉\n
        String str = scanner.nextLine();
        //产生书籍对象保存到书架上
        bookList.addNewBook(booksName,author,price,type);
        System.out.println("添加书籍成功!");
    }
}

下架书籍——RemoveOperation

package book_management.operation.impl;

import book_management.book.Book;
import book_management.book.BookList;
import book_management.operation.IOperation;

import java.util.Scanner;

/**
 * 下架书籍操作
 */
public class RemoveOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("您现在进行的是下架书籍操作");
        System.out.println("请输入要下架的图书名称:");
        String booksName = scanner.next();
        bookList.removeBook(booksName,bookList);
    }
}

更新书籍——UpdateOperation

package book_management.operation.impl;

import book_management.book.Book;
import book_management.book.BookList;
import book_management.operation.IOperation;

/**
 * 更新书籍操作
 */
public class UpdateOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("您现在进行的是更新书籍操作");
        System.out.println("请输入您要更新的书籍名称:");
        String booksName = scanner.nextLine();
        //书籍有这本书
        if (!bookList.contains(booksName)) {
            System.err.println("书籍不存在,无法更新");
        }
        System.out.println("请输入您要更新的书籍类别:");
        String type = scanner.nextLine();
        System.out.println("请输入您要更新的书籍借阅情况:");
        Boolean isBorrowed = scanner.nextBoolean();
        System.out.println("请输入您要更新的书籍价格:");
        double price = scanner.nextDouble();
        // 吃掉\n
        String str = scanner.nextLine();
        //产生书籍对象保存到书架上
        bookList.updateBook( booksName, type, isBorrowed, price, bookList);
        System.out.println("更新书籍成功!");
    }
}

查找书籍——FindOperation

package book_management.operation.impl;

import book_management.book.Book;
import book_management.book.BookList;
import book_management.operation.IOperation;

/**
 * 查找书籍操作
 */
public class FindOperation implements IOperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("您现在进行的是查找书籍操作");
        System.out.println("请输入您要查找的书籍名称:");
        String booksName = scanner.nextLine();
        bookList.findBook(booksName,bookList);
    }
}

借阅书籍——BorrowOperation

package book_management.operation.impl;

import book_management.book.Book;
import book_management.book.BookList;
import book_management.operation.IOperation;

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 booksName = scanner.nextLine();
        bookList.isBorrowed(booksName,bookList);
    }
}

归还书籍——ReturnOperation

package book_management.operation.impl;

import book_management.book.Book;
import book_management.book.BookList;
import book_management.operation.IOperation;

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 booksName = scanner.nextLine();
        bookList.returnBook(booksName,bookList);
    }
}

 

主方法——程序的入口

package book_management;

import book_management.book.BookList;
import book_management.user.AdminUser;
import book_management.user.NormalUser;
import book_management.user.User;

import java.util.NoSuchElementException;
import java.util.Scanner;

/**
 * 程序的入口
 */
public class Main {
    public static void main(String[] args) {
        // 1.此时图书馆只有一个书架
        BookList bookList = new BookList();
        // 2.登录操作
        User user = login();
        // 3.开始进行选择
        while (true) {
            int choice = user.menu();
            if (choice == -1) {
                System.out.println("系统退出");
                break;
            } else {
                user.doOperation(bookList,choice);
            }
        }
    }

    private 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 NormalUser(name);
        } else if (choice == 0) {
            return new AdminUser(name);
        } else {
            throw new NoSuchElementException("键入有误,没有选项");
        }
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐