Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

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

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