Menu
CoddyTech

Giao diện quản trị

Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 81 trên 87.

challenge icon

Thử thách

Dễ

Hãy mở rộng Hệ thống quản lý thư viện bằng Giao diện quản trị! Một thư viện thực tế cần có các chức năng quản trị: thêm sách mới vào bộ sưu tập, xóa sách không còn phù hợp và đăng ký thành viên mới. Bạn sẽ tạo một giao diện xác định các thao tác quản trị này, rồi triển khai chúng trong một lớp quản trị riêng.

Bạn sẽ tiếp tục xây dựng dựa trên code hiện có trong năm tệp:

  • Book.java: Giữ nguyên lớp Book với tất cả chức năng hiện có: isbn, title, author, isAvailable, borrowedBy, getDetails() và các phương thức getter/setter phù hợp.
  • User.java: Giữ nguyên lớp User với id, name, ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() và toString().
  • Library.java: Giữ nguyên lớp Library với tất cả phương thức hiện có. Thêm phương thức mới removeBook(String isbn) để tìm và xóa sách khỏi bộ sưu tập theo ISBN. Phương thức này cần trả về true nếu tìm thấy và xóa được sách, nếu không thì trả về false. Chỉ có thể xóa sách khi sách hiện đang có sẵn, tức là chưa được mượn.
  • LibraryAdmin.java: Tạo một giao diện có tên LibraryAdmin để xác định các thao tác quản trị cần có. Giao diện của bạn cần khai báo ba phương thức:
    • addBook(String isbn, String title, String author) - trả về giá trị boolean cho biết thao tác có thành công hay không
    • removeBook(String isbn) - trả về giá trị boolean cho biết thao tác có thành công hay không
    • registerUser(String id, String name) - trả về giá trị boolean cho biết thao tác có thành công hay không

    Sau đó, tạo một lớp có tên AdminService triển khai giao diện này. AdminService cần giữ tham chiếu đến một Library, được truyền vào qua hàm khởi tạo, và triển khai cả ba phương thức bằng cách ủy quyền cho Library, đồng thời đưa ra thông báo phù hợp. Khi thêm sách, hãy tạo một Book mới rồi thêm vào thư viện. Khi đăng ký người dùng, hãy tạo một User mới rồi đăng ký họ.

  • Main.java: Hãy trình diễn hệ thống quản trị của bạn! Bạn sẽ nhận một loạt lệnh quản trị dưới dạng một chuỗi, các lệnh được phân tách bằng dấu phẩy. Mỗi lệnh có một trong các định dạng sau:
    • ADD_BOOK:isbn:title:author
    • REMOVE_BOOK:isbn
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Tạo một Library và một AdminService. Xử lý từng lệnh rồi in kết quả:

    • Với ADD_BOOK: in Added: [title] nếu thành công
    • Với REMOVE_BOOK: in Removed: [isbn] nếu thành công, hoặc Cannot remove: [isbn] nếu sách không tồn tại hoặc đang được mượn
    • Với REGISTER_USER: in Registered: [name]
    • Với BORROW: sử dụng chức năng mượn sách hiện có của thư viện

    Sau khi xử lý tất cả lệnh, in Library status:, rồi in thông tin chi tiết và trạng thái còn hay đã được mượn của từng cuốn sách theo định dạng [details] - [Available/Borrowed].

Bạn sẽ nhận một đầu vào: chuỗi lệnh được phân tách bằng dấu phẩy.

Ví dụ, với đầu vào 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, đầu ra sẽ là:

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

Hãy chú ý cách giao diện quản trị đưa ra một hợp đồng rõ ràng cho các thao tác quản trị, trong khi phần triển khai AdminService xử lý logic thực tế. Hệ thống ngăn xóa sách đang được mượn, đồng thời cho phép xóa sách hiện có sẵn. Việc tách riêng giao diện và phần triển khai là một nguyên tắc OOP quan trọng, giúp code dễ bảo trì và kiểm thử hơn!

Tự làm thử

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

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Đọc các lệnh được phân tách bằng dấu phẩy
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Tạo Library và AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Xử lý từng lệnh
        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);
            }
        }
        
        // In ra trạng thái thư viện
        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);
        }
    }
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Java online