Menu
Coddy logo textTech

Интерфейс администратора

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 81 из 87.

challenge icon

Задание

Легко

Давайте расширим вашу систему управления библиотекой с помощью интерфейса администратора! Настоящей библиотеке необходимы административные возможности — добавление новых книг в коллекцию, удаление устаревших и регистрация новых участников. Вы создадите интерфейс, который определяет эти административные операции, и реализуете их в специальном классе администратора.

Вы продолжите работу над существующим кодом в пяти файлах:

  • Book.java: Сохраните ваш класс Book со всей существующей функциональностью — isbn, title, author, isAvailable, borrowedBy, getDetails() и соответствующими геттерами/сеттерами.
  • User.java: Оставьте ваш класс User без изменений с id, name, ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() и toString().
  • Library.java: Сохраните ваш класс Library со всеми существующими методами. Добавьте новый метод removeBook(String isbn), который находит и удаляет книгу из коллекции по её ISBN. Метод должен возвращать true, если книга была найдена и удалена, и false в противном случае. Книгу можно удалить только в том случае, если она в данный момент доступна (не выдана).
  • LibraryAdmin.java: Создайте интерфейс с именем LibraryAdmin, который определяет контракт для административных операций. Ваш интерфейс должен объявлять три метода:
    • addBook(String isbn, String title, String author) — возвращает логическое значение, указывающее на успех операции
    • removeBook(String isbn) — возвращает логическое значение, указывающее на успех операции
    • registerUser(String id, String name) — возвращает логическое значение, указывающее на успех операции

    Затем создайте класс с именем AdminService, который реализует этот интерфейс. AdminService должен хранить ссылку на Library (передаваемую через конструктор) и реализовывать все три метода, делегируя выполнение классу Library и добавляя соответствующую обратную связь. При добавлении книги создайте новый объект 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);
        }
    }
}

Все уроки раздела Объектно-ориентированное программирование