Интерфейс администратора
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 81 из 87.
Задание
ЛегкоДавайте расширим вашу систему управления библиотекой с помощью интерфейса администратора! Настоящей библиотеке необходимы административные возможности — добавление новых книг в коллекцию, удаление устаревших и регистрация новых участников. Вы создадите интерфейс, который определяет эти административные операции, и реализуете их в специальном классе администратора.
Вы продолжите работу над существующим кодом в пяти файлах:
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: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);
}
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка10Обработка исключений в ООП
Иерархия классов исключенийПользовательские исключенияПроверяемые и непроверяемые ошибкиПаттерн Try With ResourcesПовторение — Validated User13Проект: Управление библиотекой
Обзор проекта и UML-проектированиеКлассы Book и User2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»