Интерфейс администратора
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 81 из 87.
Задание
ЛегкоДавайте расширим вашу 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: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);
}
}
// 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);
}
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка10Обработка исключений в ООП
Иерархия классов исключенийПользовательские исключенияПроверяемые и непроверяемые ошибкиПаттерн Try With ResourcesПовторение — Validated User13Проект: Управление библиотекой
Обзор проекта и UML-проектированиеКлассы Book и UserСистема выдачи книгФункционал поискаИнтерфейс администратораИнтеграция обработки исключенийТестирование и интеграция2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово 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
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»Потренируйтесь самостоятельно: Онлайн-компилятор Java