Menu
CoddyTech

管理员界面

本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 81 课,共 87 课。

challenge icon

挑战

简单

让我们为你的图书管理系统添加一个管理界面!真正的图书馆需要管理功能:将新书添加到馆藏中、移除过时的书籍,以及注册新会员。你将创建一个定义这些管理操作的接口,并在专门的管理类中实现它们。

你将继续在现有的 5 个文件中编写代码:

  • Book.java:保留你的 Book 类及其所有现有功能:isbn、title、author、isAvailable、borrowedBy、getDetails(),以及相应的 getter/setter。
  • User.java:保留你的 User 类,不做修改。它包含 id、name、borrowedBooks ArrayList、borrowBook()、returnBook()、getBorrowedCount() 和 toString()。
  • Library.java:保留你的 Library 类及其所有现有方法。添加一个新方法 removeBook(String isbn),根据书籍的 ISBN 查找并从馆藏中移除该书。如果找到并移除了书籍,该方法应返回 true;否则返回 false。只有当前可借阅的书籍(未被借出)才能移除。
  • LibraryAdmin.java:创建一个名为 LibraryAdmin 的接口,用于定义管理操作的规范。你的接口应声明以下 3 个方法:
    • addBook(String isbn, String title, String author):返回一个布尔值,表示操作是否成功
    • removeBook(String isbn):返回一个布尔值,表示操作是否成功
    • registerUser(String id, String name):返回一个布尔值,表示操作是否成功

    然后创建一个名为 AdminService 的类来实现此接口。AdminService 应保存对 Library 的引用(通过构造函数传入),并通过委托给 Library 来实现所有 3 个方法,同时提供适当的反馈。添加书籍时,创建一个新的 Book 并将其添加到图书馆中。注册用户时,创建一个新的 User 并将其注册。

  • Main.java:演示你的管理系统!你会收到一组管理命令,它们组成一个逗号分隔的字符串。每条命令都采用以下格式之一:
    • ADD_BOOK:isbn:title:author
    • REMOVE_BOOK:isbn
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    创建一个 Library 和一个 AdminService。处理每条命令并打印结果:

    • 对于 ADD_BOOK:成功时打印 Added: [title]
    • 对于 REMOVE_BOOK:成功时打印 Removed: [isbn];如果书籍不存在或已被借出,则打印 Cannot remove: [isbn]
    • 对于 REGISTER_USER:打印 Registered: [name]
    • 对于 BORROW:使用现有的图书馆借阅功能

    处理完所有命令后,打印 Library status:,然后按 [details] - [Available/Borrowed] 的格式输出每本书的详细信息和可借阅状态。

你会收到一个输入:由逗号分隔的命令字符串。

例如,输入为 REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002 时,输出应为:

Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - Borrowed

注意,管理接口为管理操作提供了清晰的规范,而 AdminService 实现则负责处理实际逻辑。系统会正确阻止移除已借出的书籍,同时允许移除可借阅的书籍。将接口与实现分离是面向对象编程的一项重要原则,可以让你的代码更易于维护和测试!

亲手试试

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取以逗号分隔的命令
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // 创建 Library 和 AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // 处理每条命令
        for (String command : commands) {
            String[] parts = command.split(":");
            String operation = parts[0];
            
            if (operation.equals("ADD_BOOK")) {
                String isbn = parts[1];
                String title = parts[2];
                String author = parts[3];
                if (adminService.addBook(isbn, title, author)) {
                    System.out.println("Added: " + title);
                }
            } else if (operation.equals("REMOVE_BOOK")) {
                String isbn = parts[1];
                if (adminService.removeBook(isbn)) {
                    System.out.println("Removed: " + isbn);
                } else {
                    System.out.println("Cannot remove: " + isbn);
                }
            } else if (operation.equals("REGISTER_USER")) {
                String id = parts[1];
                String name = parts[2];
                if (adminService.registerUser(id, name)) {
                    System.out.println("Registered: " + name);
                }
            } else if (operation.equals("BORROW")) {
                String userId = parts[1];
                String isbn = parts[2];
                library.borrowBook(userId, isbn);
            }
        }
        
        // 输出库的状态
        System.out.println("Library status:");
        ArrayList<Book> allBooks = library.getAllBooks();
        for (Book book : allBooks) {
            String status = book.isAvailable() ? "Available" : "Borrowed";
            System.out.println(book.getDetails() + " - " + status);
        }
    }
}

面向对象编程中的所有课

自己练习: Java 在线编译器