管理员界面
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 81 课,共 87 课。
挑战
简单让我们为你的图书管理系统添加一个管理界面!真正的图书馆需要管理功能:将新书添加到馆藏中、移除过时的书籍,以及注册新会员。你将创建一个定义这些管理操作的接口,并在专门的管理类中实现它们。
你将继续在现有的 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:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW: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 在线编译器